有100台主机,自己管理不过来,其中一个运维做用户管理,另一个运维做网络管理,如果谁出了错误我们都可以定位到是谁做了,这样可以追究责任。我们不可能把root账户给这两个人,那么我们就需要一种机制,让两个用户在发挥其特定的职能的时候暂时变身为root,拥有root的权限,但是处理完事情之后就打回原型,这有点像suid的感觉。
也就是说不需要正式切换到root的身份,在执行特定的命令的时候,只需要暂时用root权限去执行某个程序。这样也是有漏洞的,但也有人可以冒充tom用户,比如说当tom去厕所了,他邻桌的同学不怀好心,用tom的电脑在服务器上创了一个用户,所以sudo还有这样一种机制就是,当你执行root给你规定的命令的时候还要再次提交一次密码,确定tom是tom本人不是别人冒充的,密码会缓存5分钟,也就是说当你使用sudo使用命令时要输入密码,这 个密码在五分钟之内不用重复输入,使用sudo –k可以清除这个缓存,清除缓存之后再使用sudo时不管有没有到5分钟都要重新输入密码。
如果让三个用户都能使用useradd命令,一个个的设置不方便,sudo配置文件还支持别名。所谓的别名就是比如我们把用户管理的命令定义到一个组里面,等到引用这些命令的时候,我们可以直接写上别名,不用那么麻烦的把管理类的命令都写上。
sudo基础sudo的正确定义是:某一个用户能够以另外一个用户的身份通过哪些主机执行什么命令、
sudo的配置文件是/etc/sudoers
专用的配置文件的 命令:visudo(可检查语法错误)
语法:谁,在哪些主机上,以什么人的身份,运行什么命令
语法语法:who which_hosts=(runas) command who:谁 which_hosts:在哪些主机上 runas:以谁的身份 command执行什么命令
用户别名:User_Alias USERDOMIN = 用户名|%组名|主机名:
主机别名:Host_Alias HOSTS = 主机名|IP|目标用户别名:
目标用户别名:Runas_Alias USER=用户名|%组名|
命令别名:Cmnd_Alias COMD = 命令绝对路径|其它别名
练习举个例子,让hadoop用户能够使用root才能使用的useradd和usermod这两个命令.
[root@zhanghe ~]$ visudo hadoop ALL=(root) /usr/sbin/useradd,/usr/sbin/usermod #在最后一行添加
[root@zhanghe ~]useradd hadoop;echo "cba-123" | passwd --stdin hadoop
[root@zhanghe ~]# su - hadoop
[hadoop@zhanghe ~]$ sudo useradd user1 #执行成功,第一次使用会让你输入密码
[hadoop@zhanghe ~]$sudo –k
[hadoop@ zhanghe ~]$ sudo –l #列出自己可以通过sudo执行哪些命令。
让用户不用输入密码在配置文件命令的前面加上NOPASSWD:即可,如下:
hadoop ALL=(root) NOPASSWD: /usr/sbin/useradd,/usr/sbin/usermod
再举个例子,让zhanghe用户拥有root的全部权限
zhanghe ALL=(ALL) ALL
权限规划示例
运维部门
级别 | 权限 |
---|---|
初级运维: | 查看系统信息,查看网络状态: /usr/bin/free,/usr/bin/iostat,/usr/bin/top,/bin/hostname,/sbin/ifconfig,/bin/netstat,/sbin/route |
高级运维 | 查看系统信息,查看和修改网格配置,进程管理,软件包管理,存储管理 /usr/bin/free,/usr/bin/iostat,/usr/bin/top,/bin/hostname,/sbin/ifconfig, /bin/netstat,/sbin/route,/sbin/iptables,/etc/init.d/network,/bin/nice,/bin/kill, /usr/bin/kill,/usr/bin/killall,/bin/rpm,/usr/bin/up2date,/usr/bin/yum, /sbin/fdisk,/sbin/sfdisk,/sbin/parted,/sbin/partprobe,/bin/mount,/bin/umount |
运维经理 | 超级用户所有权限 ALL |
开发部门:
级别 | 权限 |
---|---|
初级开发 | root的查看权限,对应服务查看日志的权限 /usr/bin/tail/app/log,/bin/grep/app/log,/bin/cat,/bin/ls |
高级开发 | root的查看权限,对应服务查看日志的权限,重启对应服务的权限 /sbin/service,/sbin/chkconfig,tail /app/log,grep /app/log,/bin/cat,/bin/ls, /bin/sh ~/scripts/deploy.sh |
开发经理 | 项目所在服务器的ALL权限,不能修改root密码 ALL,!/usr/bin/passwd root,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root |
架构组:
级别 | 权限 |
---|---|
架构工程师 | 普通用户的权限 不加入sudo列表 |
DBA组:
级别 | 权限 |
---|---|
初级DBA | 普通用户的权限 不加入sudo列 |
高级DBA | 项目所在数据库服务器的ALL权限 ALL, /usr/bin/passwd [A-Za-z]* !/usr/bin/passwd root, !/usr/sbin/visudo, |
网络组:
级别 | 权限 |
---|---|
初级网络 | 普通用户权限 不加入sudo |
高级网络 | 项目所在数据库服务器的ALL权限 /sbin/route,/sbin/ifconfig,/bin/ping,/sbin/dhclient,/usr/bin/net, /sbin/iptables,/usr/bin/rfcomm,/usr/bin/wvdial,/sbin/iwconfig, /sbin/mii-tool,/bin/cat,/var/log/* |