最近公司有个场景,需要限制用户登陆以后可以执行的命令,从而提高系统的安全性。本身bash已经有了一个受限制的版本叫做rbash,我们在这个基础上还可以通过环境变量的方式对用户做进一步的限制。
文章目录
受限制的shell
正常情况下用useradd xx
去创建用户的时候给用户配置的shell都是bash,这个可以通过查看文件/etc/passwd
或者是通过命令echo $SHELL
进行确认。
查看bash命令的man页面会发现bash还有一个受限制模式,如下
当执行bash
命令的时候带上-r
参数或者是--restricted
的时候,当前的shell就由普通的bash变成了受限制的shell,上图红框内的命令就都执行不了了,我这里就不一一翻译了,选取最前面的几条罗列下
- 不能使用
cd
命令,也就意味着不能切换目录 - 不能设置
SHELL
,PATH
,ENV
,BASH_ENV
这四个环境变量,也就意味着不能切换shell,不能修改命令查找路径 - 不能执行带
/
的命令,也就意味着只能直接执行环境变量PATH中的命令
有了这个受限制的shell,用户基本上就被限制在自己的home目录下,并且只能执行PATH下的命令。
但是这个还不够,我们还需要在不影响别的用户的前提下将受限制用户能执行的命令进行限制,换句话说,需要继续限制该用户的PATH环境变量所包含的命令集合。如果我们能够将允许用户执行的命令都放在一个目录中,再将这个目录指定为PATH,那么就可以限制用户能够执行的命令了。下面看看怎么在用户登录的时候自动完成这一目标。
用户登录流程
用户在登录的时候会自动运行几个文件,来设置shell的环境变量,如下所示
- /etc/profile - 对所有用户生效,其中有一个for循环会从/etc/profile.d中执行.sh格式的文件
- /etc/bashrc - 对所有用户生效,如果用户使用的是bash,会自动执行该文件
- ~/.bash_profile - 放在用户home目录,对单用户生效,如果存在.bashrc文件还会执行该文件
- ~/.bashrc - 每次用户登录或者打开新的shell的时候都