最近公司有个场景,需要限制用户登陆以后可以执行的命令,从而提高系统的安全性。本身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的时候都会执行该文件
我这里的思路是在/etc/profile.d
中创建一个.sh文件,在其中设置好对应动作,这样用户登录以后就会自动执行该文件,达到限制的目的。借鉴网上的经验,可以直接忽略系统的profile文件,然后使用自定义的profile文件。
使用自定义profile文件
在/etc/profile.d
下创建login_tester.sh
如下
#!/bin/bash
m=`whoami`
if [[ "${m}" == "tester" ]];then
echo -e "\e[01;33m* ** 你目前登陆的是受限制的shell ** *\e[00m"
## 创建命令集合
mkdir -p $HOME/bin
rm -f $HOME/bin/*
ln -s /bin/ls $HOME/bin
ln -s /bin/ping $HOME/bin
ln -s /usr/bin/ssh $HOME/bin/
ln -s /usr/bin/ssh-keygen $HOME/bin/
ln -s /usr/bin/expect $HOME/bin/
ln -s /bin/grep $HOME/bin/
## 设置环境变量
cat << EOF > $HOME/.newbash_profile
export HISTFILESIZE=500000000
export HISTSIZE=99999999
export HISTTIMEFORMAT="%Y/%m/%d_%H:%M:%S :"
export PATH=$HOME/bin
export NAME=xiaofu
EOF
## 使用自定义profile文件
chown ${m}:${m} $HOME/.newbash_profile
exec bash --restricted --noprofile --rcfile $HOME/.newbash_profile
fi
首先判断登陆的用户是谁,如果是tester用户,会执行下面的操作。
第一部分是创建命令集合,在用户的home目录下创建bin目录,采用软连接的方式将可以被用户执行的命令放到该目录下;第二部分设置环境变量,在用户的home目录下创建.newbash_profile
文件,和上面的4个文件一样,export设置环境变量,需要注意的是这里将PATH
设置为了第一步中的bin文件,也就只让用户执行第一步中的几个命令;第三部分使用自定义profile文件,首先修改文件权限,保证用户能执行,然后是比较关键的一步
exec bash --restricted --noprofile --rcfile $HOME/.newbash_profile
这里的--restricted
是将用户的shell变为受限制的shell,--noprofile
是不加载系统的profile文件,也就是好上面的4个文件,然后是--rcfile
加载我们自定义的profile文件。
这样设置以后,用户不能切换目录,也只能使用受限制的几个命令了。
验证
下面创建用户tester进行验证。
从root切换到tester用户会有下面的提示
如果执行不被允许的命令会有提示
bash-4.2$ cd
bash: cd: restricted
bash-4.2$ cp
bash: cp: command not found
并且可以看到环境变量也配置成功
bash-4.2$ echo $PATH
/home/tester/bin
bash-4.2$ echo $NAME
xiaofu
后续
这个脚本目前只能针对tester用户进行限制,如果有多个用户,可以将受限制的用户名放在一个文件中,然后用类似下面的格式去做循环判断
#!/bin/bash
m=`whoami`
while read name
do
if [ $m == $name ];then
echo "found it" # 替换为创建自定义profile的脚本
exit
fi
done < names.txt
echo "not found"
如果在名单列表中找到了当前登陆的用户则执行脚本,否则不做任何操作,我这里就不展开了,大家可以自己试试看。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。