我想限制服务器上的某些用户只能执行某些命令。为此,我发现最常见的方法是使用rbash
。
虽然我可以找到很多网站讨论 rbash,但我很难找到任何有关如何正确使用它的信息。我能找到的最常见方法是创建一个从 到/bin/rbash
的符号链接/bin/bash
,将受限用户的登录 shell 设置为,然后在用户主目录中/bin/rbash
设置自定义的PATH
。~/.bash_profile
然而,我非常震惊地发现,在这种设置下,用户仍然可以使用 将文件复制到服务器scp
,甚至可以使用 打开不受限制的 shell ssh user@host -t bash
!似乎发生的情况是,SSH 服务器正在使用 将命令传递给服务器上的登录 shell -c
,因此ssh user@host -t bash
导致服务器运行/bin/rbash -c bash
,这是可行的,因为.bash_profile
尚未执行以限制路径。scp
同样导致服务器运行/bin/rbash -c scp
。
现在我遇到了ForceCommand
sshd 的指令。该指令基本上总是导致将配置的命令作为传递-c
给登录 shell,而忽略客户端指定的任何命令。因此,如果ForceCommand
设置为,则无论客户端是使用还是作为或其他方式调用的,都将始终在服务器上rbash
执行命令。不幸的是,导致无法执行,因此我们最终得到一个受限制的 shell 和一个正常的,因此我们可以在那里调用以退出。/bin/rbash -c rbash
-t bash
scp
/bin/rbash -c rbash
.bash_profile
PATH
bash
我想要实现的目标:
- 对于通过 SSH 连接的用户来说,应该没有办法避免受限的 shell
- 理想情况下,仍然可以通过使用
ssh user@server permitted_command
- 配置不应该仅限于 SSH,因此例如在 TTY 上登录的用户也应该受到限制。
答案1
经过一段时间的试验,我发现问题的根源在于的安全性rbash
取决于PATH
设置,但大多数设置中PATH
都设置了后SSH 指定其自定义命令,而它需要指定前。
作为解决方案,我没有指定/bin/rbash
(symlink to /bin/bash
) 作为登录 shell,而是创建了一个 shell 脚本/usr/local/bin/rbash
并将其用作登录 shell。该 shell 脚本具有以下内容:
#!/bin/bash -l
export PATH=/usr/local/rbin
exec /bin/bash -r "$@"
我也尝试了SetEnv
sshd 的指令,并尝试在那里设置PATH
。但是,我发现这个解决方案不太实用,因为它只为 SSH 设置配置,而且它在运行 时导致了很多错误/etc/profile
,因为找不到那里使用的命令。此外,似乎存在一些风险,即其他一些 sshd 指令可能会允许客户端再次覆盖某些环境变量。