Chinaunix首页 | 论坛 | 博客
  • 博客访问: 115663
  • 博文数量: 28
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 277
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-20 16:21
文章分类
文章存档

2019年(1)

2018年(2)

2017年(22)

2016年(3)

我的朋友

分类: 系统运维

2017-12-23 17:50:35

一、前言


运维都碰到过这种需求:生产环境上的服务日志,开发人员需要有查看权限,当没有日志系统的时候。如果随便分配一个普通用户,但是普通用户只要可以登录,权限就已经很大了。开发人员一般都没有好的服务器意识,为了保险起见,苛刻的权限分配很有必要。
现有需求:开发人员只能在生成环境指定目录,执行有限的命令,如: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


点击(此处)折叠或打开

  1. # .bashrc

  2. # Source global definitions
  3. if [ -f /etc/bashrc ]; then
  4.         . /etc/bashrc
  5. fi
  6. PATH=/home/test/bin
  7. Wigth=58
  8. Lhigh=20
  9. High=24
  10. echo -ne "\033[2J"
  11. for ((X=1;X<=Wigth;X++));do
  12.         if [ $X == 1 -o $X == ${Wigth} ];then
  13.                 echo -ne "\033[1;${X}H\033[30m+\033[0m"
  14.                 echo -ne "\033[$Lhigh;${X}H\033[30m+\033[0m"
  15.                 echo -ne "\033[$High;${X}H\033[30m+\033[0m"
  16.         else
  17.                 echo -ne "\033[1;${X}H\033[30m-\033[0m"
  18.                 echo -ne "\033[$Lhigh;${X}H\033[30m-\033[0m"
  19.                 echo -ne "\033[$High;${X}H\033[30m-\033[0m"
  20.         fi
  21. done
  22. for ((Y=2;Y<High;Y++));do
  23.         if [ $Y != ${Lhigh} ];then
  24.                 echo -ne "\033[${Y};1H\033[30m|\033[0m"
  25.                 echo -ne "\033[${Y};${Wigth}H\033[30m|\033[0m"
  26.         fi
  27. done

  28. echo -ne "\033[3;25H\033[30m1. cms\033[0m"
  29. echo -ne "\033[4;25H\033[30m2. mps\033[0m"
  30. echo -ne "\033[5;25H\033[30m3. vbs\033[0m"
  31. echo -ne "\033[6;25H\033[30m4. ups\033[0m"
  32. echo -ne "\033[7;25H\033[30m5. gateway\033[0m"
  33. echo -ne "\033[8;25H\033[30m6. iot-cloudstore\033[0m"
  34. echo -ne "\033[9;25H\033[30m7. iot-auth\033[0m"
  35. echo -ne "\033[10;25H\033[30m8. iot-callback\033[0m"
  36. echo -ne "\033[11;25H\033[30m9. iot-event\033[0m"
  37. echo -ne "\033[12;24H\033[30m10. iot-zuul\033[0m"
  38. echo -ne "\033[13;24H\033[30m11. iot-pay\033[0m"
  39. echo -ne "\033[14;24H\033[30m12. kafka\033[0m"
  40. echo -ne "\033[15;24H\033[30m13. KafkaServer\033[0m"
  41. echo -ne "\033[16;23H\033[30mq|Q. quit\033[0m"
  42. echo -ne "\033[18;24H\033[30minput(n):\033[0m"
  43. echo -ne "\033[21;2H\033[30mnotice:only command \033[1;4;31mless tail cat grep ls pwd \033[0mworking"
  44. echo -ne "\033[21;${Wigth}H\033[30m|\033[0m"
  45. while true;do
  46.   echo -ne "\033[K\033[23;2H"
  47.   echo -ne "\033[23;58H\033[30m|\033[0m"
  48.   echo -ne "\033[18;33H\033[30m"
  49.   echo -ne "\033[K"
  50.   echo -ne "\033[18;${Wigth}H\033[30m|\033[0m"
  51.   echo -ne "\033[18;33H\033[30m"
  52.   read choice
  53.   case $choice in
  54.     1)
  55.      cd /srv/CmsServer/logs
  56.      break
  57.     ;;
  58.     2)
  59.      cd /srv/MpsServer/MpsLog
  60.      break
  61.     ;;
  62.     3)
  63.      cd /srv/VbsServer/MpsLog
  64.      break
  65.     ;;
  66.     4)
  67.      echo -ne "\033[2J"
  68.      echo -ne "\033[1;1H\033[0m"
  69.      exit
  70.     ;;
  71.     5)
  72.      cd /srv/newgatewayserver/dispather/src/proc/web_server/log
  73.      break
  74.     ;;
  75.     6)
  76.      cd /home/spring/log/cloudstore
  77.      break
  78.     ;;
  79.     7)
  80.      cd /home/spring/log/auth
  81.      break
  82.     ;;
  83.     8)
  84.      cd /home/spring/log/callback
  85.      break
  86.     ;;
  87.     9)
  88.      cd /home/spring/log/cep
  89.      break
  90.     ;;
  91.     10)
  92.      cd /home/spring/log/zuul
  93.      break
  94.     ;;
  95.     11)
  96.      cd /home/spring/log/pay
  97.      break
  98.     ;;
  99.     12)
  100.      cd /srv/kafka/logs
  101.      break
  102.     ;;
  103.     13)
  104.      cd /srv/KafkaServer/log
  105.      break
  106.     ;;
  107.     q|Q)
  108.      echo -ne "\033[25;1H\033[30m\n"
  109.      echo "quit"
  110.      exit
  111.      ;;
  112.     *)
  113.      echo -ne "\033[23;2H\033[5;30minput error !\033[0m"
  114.      continue
  115.      ;;
  116.   esac
  117. done
  118. echo -ne "\033[25;1H\033[30m\n"

  119. # 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。基本只有查看当前目录和某些目录文件的内容。
















阅读(2388) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~