本文为 Bash Reference Manual第6章:Bash Features 第10节:The Restricted Shell 的读书笔记。
完整的笔记目录参见Bash学习笔记总目录。
6.10 The Restricted Shell
如果使用名称 rbash 启动 Bash,或者在启动时提供 --restricted 或 -r 选项,shell 将变为受限模式。受限 shell 用于设置比标准 shell 更受控制的环境。受限 shell 的行为与 bash 完全相同,唯一的例外是以下操作被禁止或不会执行:
- 使用 cd 内置命令更改目录。(只能呆在主目录)
- 设置或取消设置 SHELL、PATH、HISTFILE、ENV 或 BASH_ENV 变量的值。(这些变量只读)
- 使用包含斜杠的命令名称。
- 将包含斜杠的文件名作为 . 内置命令的参数。
- 使用
.内建命令的 -p 选项来指定搜索路径。 - 将包含斜杠的文件名作为参数传递给 history 内建命令。
- 将包含斜杠的文件名作为参数传递给 hash 内建命令的 -p 选项。
- 在启动时从 shell 环境导入函数定义。
- 在启动时解析 SHELLOPTS 的值。
- 使用 '>'、'>|'、'<>'、'>&'、'&>' 和 '>>' 重定向操作符进行输出重定向。
- 使用 exec 内建命令用另一个命令替换 shell。
- 使用 enable 内建命令的 -f 和 -d 选项添加或删除内建命令。
- 使用 enable 内建命令启用被禁用的 shell 内建命令。
- 为 command 内建命令指定 -p 选项。
- 使用 'set +r' 或 'shopt -u restricted_shell' 关闭受限模式。
这些限制在读取任何启动文件后生效。
当发现执行的命令是一个 shell 脚本时(参见 Shell 脚本),rbash 会在执行该脚本的 shell 中关闭任何限制。
受限 shell 模式只是构建有用受限环境的一个组成部分。它应配合将 PATH 设置为仅允许执行少量经过验证的命令(允许 shell 转义的命令特别容易受攻击)、在登录后将当前目录更改为非可写目录而非 $HOME、不允许受限 shell 执行 shell 脚本,以及清理会导致某些命令修改其行为的环境变量(例如 VISUAL 或 PAGER)。
现代系统提供了更安全的方法来实现受限环境,例如监狱(jails)、区域(zones)或容器(containers)。
示例:
bash
$ bash -r
$ cd /usr
bash: cd: restricted
$ echo $PATH
/home/vagrant/.local/bin:/home/vagrant/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
$ PATH=$PATH:.
bash: PATH: readonly variable
$ which find
bash: /usr/bin/which: restricted: cannot specify `/' in command names
$ . /usr/bin/a.sh
bash: .: /usr/bin/a.sh: restricted
$ . -p /usr/local/bin:/usr/bin a.sh
bash: .: a.sh: restricted
$ echo $BASH_VERSION
5.3.0(1)-release
$ ls > 1
bash: 1: restricted: cannot redirect output
$ ( a=1 )
$ exec 4>&1
$ exec 4>&-
$ exec bash
bash: exec: restricted
$ enable -a|grep test
enable test
$ enable -d test
bash: enable: restricted
$ enable -n test
$ enable test
bash: enable: restricted
$ command -p ls
bash: command: -p: restricted
$ shopt restricted_shell
restricted_shell on
$ shopt -u restricted_shell
$ shopt restricted_shell
restricted_shell on
💡 Restricted Shell(受限Shell) 是bash的一种特殊模式,它严格限制用户能执行的操作,主要用于创建安全受限的环境。
以下是一个概念示例。
bash
# 1. 创建专门目录
sudo mkdir -p /home/<restricted_user>/bin
sudo mkdir -p /home/<restricted_user>/data
# 2. 创建受限用户
sudo useradd -s /bin/rbash <restricted_user>
sudo passwd <restricted_user>
# 3. 设置用户目录权限
sudo chown -R <restricted_user>:<restricted_user> /home/<restricted_user>
sudo chmod 755 /home/<restricted_user>
# 4. 创建自定义PATH
sudo mkdir -p /home/<restricted_user>/.bash_profile
echo 'PATH=$HOME/bin' | sudo tee /home/<restricted_user>/.bash_profile
sudo chown <restricted_user>:<restricted_user> /home/<restricted_user>/.bash_profile
sudo chmod 644 /home/<restricted_user>/.bash_profile
# 5. 创建符号链接到允许的命令
sudo ln -s /bin/ls /home/<restricted_user>/bin/
sudo ln -s /usr/bin/whoami /home/<restricted_user>/bin/
sudo ln -s /usr/bin/date /home/<restricted_user>/bin/