受限的 bash -- rbash
rbash(restricted bash)
,即受限制的 bash。其可以用作中转服务器,或者仅使用 ssh 来访问网页等等。
实际上 rbash 只是 bash 的一个软连接:
$ ls -l `which rbash`
lrwxrwxrwx 1 root root 4 Oct 8 2014 /bin/rbash -> bash
如果 bash 以 rbash
为程序名启动或者命令行参数有 -r
选项,则启动的这个 shell 会在某些功能上受限制:
- 通过 cd 来改变工作目录
- 设置或取消环境变量: SHELL, PATH, ENV, BASH_ENV
- 命令名中不能包含目录分隔符 ‘/’
- 包含有 ‘/’ 的文件名作为内置命令 ‘.’ 的参数
- hash 内置命令有 -p 选项时的文件名参数包含 ‘/’
- 在启动时通过 shell 环境导入函数定义
- 在启动时通过 shell 环境解析 SHELLOPTS 的值
- 使用
>,>|, <>, >&, &>, >>
等重定向操作符 - 使用 exec 内置命令
- 通过 enable 内置命令的 -f 和 -d 选项增加或删除内置命令
- 使用 enable 内置命令来禁用或启用 shell 内置命令
- 执行 command 内置命令时加上 -p 选项
- 通过 set +r 或 set +o restricted 关闭受限模式
需要注意的是, rbash 提供的受限环境的安全程度取决于用户能执行的命令,很多命令都能调用外部命令,从而导致逃逸出受限环境。例如用 vim 打开一个文件:
vi /etc/passwd
然后执行外部命令:
!bash
这样就可以启动一个不受限的 bash,这对 more,less,man 等命令同样有效。如果还能执行脚本,如 python,perl 等,则有很多方式来启动一个不受限的 shell。
要让 rbash 更安全,可以限制用户能够执行的命令,如我们让用户执行执行 ssh 命令。一种方法是,修改 PATH 环境变量。
例如我们创建一个 ruser 用户,让他只能执行 ssh 命令:
$ ls -s /bin/bash /bin/rbash
$ useradd -s /bin/rbash ruser
$ chown -R root:ruser /home/ruser/.bashrc /home/ruser/.bash_profile
$ chmod 640 /home/ruser/.bashrc /home/ruser/.bash_profile
$ mkdir /home/ruser/bin
然后修改 PATH 环境变量的值为 /home/ruser/bin,并将允许执行的命令放到这个目录下。:
$ echo "export PATH=/home/ruser/bin" >> /home/ruser/.bash_profile
把用户可执行的命令链接到用户 PATH 路径下:
$ ln -s /user/bin/ssh /home/ruser/bin/ssh
这样就可以只让登录的用户执行 ssh 命令。