我想限制我服务器上的某些用户只能执行某些命令。为此,我能找到的最常见的方法是使用rbash
.
虽然我可以找到许多谈论 rbash 的网站,但我很难找到如何正确使用它的任何信息。我能找到的最常见的方法是从 to 创建一个符号链接/bin/rbash
,/bin/bash
将受限用户的登录 shell 设置为/bin/rbash
,然后在用户主目录中设置一个自PATH
定义~/.bash_profile
。
然而,我很震惊地发现,通过这个设置,用户仍然可以使用 复制文件到服务器scp
,他们甚至可以使用ssh user@host -t bash
!打开一个不受限制的 shell。似乎正在发生的事情是 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
,则将始终/bin/rbash -c rbash
在服务器上执行命令,而不管客户端是用-t bash
还是 asscp
或其他方式调用的。不幸/bin/rbash -c rbash
的是,导致.bash_profile
不被执行,所以我们最终得到了一个受限的 shell 但一个正常的PATH
,所以我们可以调用bash
那里来逃避它。
我想达到的目标:
- 应该没有办法避免通过 SSH 连接的用户的受限 shell
- 理想情况下,仍然可以通过使用执行受限 shell 中允许的命令
ssh user@server permitted_command
- 配置不应仅限 SSH,因此也应限制在 TTY 上登录的用户。
在对此进行了一段时间的试验之后,在我看来问题的根源在于安全性
rbash
取决于PATH
设置,但在大多数设置PATH
中,SSH 指定其自定义命令后设置,而需要在.作为一种解决方案,我没有指定
/bin/rbash
(作为登录 shell 的符号链接/bin/bash
),而是创建了一个 shell 脚本/usr/local/bin/rbash
并将其用作登录 shell。shell脚本有以下内容:我还尝试了
SetEnv
sshd 的指令并尝试在PATH
那里设置。但是,我发现这个解决方案不太实用,因为它只为 SSH 设置配置,并且在运行时导致很多错误/etc/profile
,因为找不到那里使用的命令。此外,其他一些 sshd 指令似乎存在允许客户端再次覆盖某些环境变量的风险。