一、前言
运维都碰到过这种需求:生产环境上的服务日志,开发人员需要有查看权限,当没有日志系统的时候。如果随便分配一个普通用户,但是普通用户只要可以登录,权限就已经很大了。开发人员一般都没有好的服务器意识,为了保险起见,苛刻的权限分配很有必要。
现有需求:开发人员只能在生成环境指定目录,执行有限的命令,如:ls,pwd,cat,grep,less等查看命令。
经过一番折腾,整理如下思路:在跳板机上创建普通用户如:test,配置跳板机test用户,公钥+密码登录生产环境test账号(当然你也可以配置成免密码登录),指定生产环境test用户的shell为rbash(即限制版bash),并将test用户的环境变量初始为/home/test/bin,将允许执行的命令软链接到/home/test/bin,这样,rbash下通过bash命令就改不了shell了。在test的.bashrc中加入内容:定义PATH变量;cd /your/path 。
二、配置登录
跳板机:192.168.0.1
生产环境:192.168.0.2
1、跳板机
创建跳板机用户test
useradd -m test
su test
ssh-keygen -t rsa
设置密码:123456
2、生产服务器
创建生产环境用户test
useradd -m test
mkdir /homt/test/.ssh
chmod 700 /home/test/.ssh
将跳板机/home/test/.ssh/id_rsa.pub文件的内容追加到生产环境/home/test/.ssh/authorized_keys文件中,没有这个文件,则自己创建。
chmod 600 /home/test/.ssh/authorized_keys
这里有个问题让我查了比较久,就是公钥都配好了,权限也都没问题,但是跳板机登录的时候一直是:Permission denied (publickey),后来百度后发现,客户端ssh -vvv user@ip 可以打印登录过程,同时服务器端在/var/log/secure 中可以查看登录错误日志。最后发现是secure中错误“User test from 192.168.0.1 not allowed because not listed in AllowUsers”,原来是ssh限制了
登录用户。
在/etc/ssh/sshd_config中配置指定用户指定IP登录,加入以下行:
AllowUsers root test@127.0.0.1 #不同用户间以空格分开
查看/etc/hosts.allow和/etc/hosts.deny中是否有登录IP限制
三、配置用户指定目录
1、生产服务器
mkdir /home/test/bin/
cd /home/test/bin
ln -sf /bin/ls ls
ln -sf /bin/cat cat
ln -sf /bin/grep grep
ln -sf /usr/bin/tail tail
耍了一个小聪明,做了一个小界面。
vi /home/test/.bashrc
点击(此处)折叠或打开
-
# .bashrc
-
-
# Source global definitions
-
if [ -f /etc/bashrc ]; then
-
. /etc/bashrc
-
fi
-
PATH=/home/test/bin
-
Wigth=58
-
Lhigh=20
-
High=24
-
echo -ne "\033[2J"
-
for ((X=1;X<=Wigth;X++));do
-
if [ $X == 1 -o $X == ${Wigth} ];then
-
echo -ne "\033[1;${X}H\033[30m+\033[0m"
-
echo -ne "\033[$Lhigh;${X}H\033[30m+\033[0m"
-
echo -ne "\033[$High;${X}H\033[30m+\033[0m"
-
else
-
echo -ne "\033[1;${X}H\033[30m-\033[0m"
-
echo -ne "\033[$Lhigh;${X}H\033[30m-\033[0m"
-
echo -ne "\033[$High;${X}H\033[30m-\033[0m"
-
fi
-
done
-
for ((Y=2;Y<High;Y++));do
-
if [ $Y != ${Lhigh} ];then
-
echo -ne "\033[${Y};1H\033[30m|\033[0m"
-
echo -ne "\033[${Y};${Wigth}H\033[30m|\033[0m"
-
fi
-
done
-
-
echo -ne "\033[3;25H\033[30m1. cms\033[0m"
-
echo -ne "\033[4;25H\033[30m2. mps\033[0m"
-
echo -ne "\033[5;25H\033[30m3. vbs\033[0m"
-
echo -ne "\033[6;25H\033[30m4. ups\033[0m"
-
echo -ne "\033[7;25H\033[30m5. gateway\033[0m"
-
echo -ne "\033[8;25H\033[30m6. iot-cloudstore\033[0m"
-
echo -ne "\033[9;25H\033[30m7. iot-auth\033[0m"
-
echo -ne "\033[10;25H\033[30m8. iot-callback\033[0m"
-
echo -ne "\033[11;25H\033[30m9. iot-event\033[0m"
-
echo -ne "\033[12;24H\033[30m10. iot-zuul\033[0m"
-
echo -ne "\033[13;24H\033[30m11. iot-pay\033[0m"
-
echo -ne "\033[14;24H\033[30m12. kafka\033[0m"
-
echo -ne "\033[15;24H\033[30m13. KafkaServer\033[0m"
-
echo -ne "\033[16;23H\033[30mq|Q. quit\033[0m"
-
echo -ne "\033[18;24H\033[30minput(n):\033[0m"
-
echo -ne "\033[21;2H\033[30mnotice:only command \033[1;4;31mless tail cat grep ls pwd \033[0mworking"
-
echo -ne "\033[21;${Wigth}H\033[30m|\033[0m"
-
while true;do
-
echo -ne "\033[K\033[23;2H"
-
echo -ne "\033[23;58H\033[30m|\033[0m"
-
echo -ne "\033[18;33H\033[30m"
-
echo -ne "\033[K"
-
echo -ne "\033[18;${Wigth}H\033[30m|\033[0m"
-
echo -ne "\033[18;33H\033[30m"
-
read choice
-
case $choice in
-
1)
-
cd /srv/CmsServer/logs
-
break
-
;;
-
2)
-
cd /srv/MpsServer/MpsLog
-
break
-
;;
-
3)
-
cd /srv/VbsServer/MpsLog
-
break
-
;;
- 4)
-
echo -ne "\033[2J"
-
echo -ne "\033[1;1H\033[0m"
-
exit
-
;;
-
5)
-
cd /srv/newgatewayserver/dispather/src/proc/web_server/log
-
break
-
;;
-
6)
-
cd /home/spring/log/cloudstore
-
break
-
;;
-
7)
-
cd /home/spring/log/auth
-
break
-
;;
-
8)
-
cd /home/spring/log/callback
-
break
-
;;
-
9)
-
cd /home/spring/log/cep
-
break
-
;;
-
10)
-
cd /home/spring/log/zuul
-
break
-
;;
-
11)
-
cd /home/spring/log/pay
-
break
-
;;
-
12)
-
cd /srv/kafka/logs
-
break
-
;;
-
13)
-
cd /srv/KafkaServer/log
-
break
-
;;
-
q|Q)
-
echo -ne "\033[25;1H\033[30m\n"
-
echo "quit"
-
exit
-
;;
-
*)
-
echo -ne "\033[23;2H\033[5;30minput error !\033[0m"
-
continue
-
;;
-
esac
-
done
-
echo -ne "\033[25;1H\033[30m\n"
-
- # User specific aliases and functions
界面是这样的:(是的,很丑)

将test的shell改成rbash:
ln -sf /bin/bash /bin/rbash
echo "/bin/bash" >>/etc/shells
chsh -s /bin/rbash test
大功告成,跳板机test登录生成环境后会线上以上菜单,选择目录后,进入相应目录,权限很有效,不能cd,不能以 "/" 开头,以绝对路径执行命令,改不了bash。基本只有查看当前目录和某些目录文件的内容。