sudo可以让我们以其他用户的身份执行命令,而只需要自己的密码(甚至不需要密码)。这比su切换用户需要目标用户的密码要方便。
从授权角度来审视,sudo比su的授权粒度要细很多,su属于大放权,例如:su - root,就直接拥有了root的所有权限。而sudo只有被授权的command才能被切换身份执行;更加安全,也便于进行权限管理。
授权语法
授权用户|%组 主机名=[(允许转换至的用户或组)] [NOPASSWD:]命令动作
- 主机名:这里可以设置IP地址,其含义个人一直没有弄特别清楚,有说这是“登录者的来源主机名”,用以过滤哪些client可以登录后sudo,但是这里设置成client IP并不正确,而设置成服务器的IP或者主机名,其效果和ALL并没有区别。例如:我服务器是多网卡多IP,我设置了192.168.xx.220=(ALL),不管我用该服务器的哪个IP登录均可执行sudo命令。
- (允许转换至的用户或组):这一部分可以不写,缺省为ALL,即:ALL=,同ALL=(ALL)。ALL=(ALL)与ALL=(root)授权并不相同,之所以会给我们效果一致的假象,是因为我们在使用sudo时没有指定用户身份,缺省是使用root身份执行命令。如果授权ALL=(root),而我们执行sudo -u user1 执行命令,那么肯定是会执行失败的,因为我们无权使用user1的身份执行命令。
注:这里我要啰嗦两句,很多资料并没有介绍转换至组的情况(man sudoers有介绍),大多都是用户可以提权到xx用户,拥有xx用户的权限,并执行被授权的命令。转换组权限也是可以的,具体操作如:user001 ALL=(:root) command_list。这么配置之后,执行sudo cat /etc/shadow是不被允许的,因为root组的权限不够的。
- [NOPASSWD:]命令动作:命令动作是可以指定命令的参数和子命令的;NOPASSWD:不配置,执行sudo需要密码。
- 命令的指定必须以绝对路径;
jen ALL, !SERVERS = ALL
- 多个命令以逗号分割;
pete HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd *root*
- 命令太多可以换行,以\结尾:
john ALL = /usr/bin/passwd [a-zA-Z0-9]*, /usr/bin/chsh [a-zA-Z0-9]*,\ /usr/bin/chfn [a-zA-Z0-9]*, !/usr/bin/* root
- 可以使用!禁止某些命令执行:
bill ALL = ALL, !SU, !SHELLS
- 设置某些命令不可执行,可以如是:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
配置方式
- 使用visudo命令添加授权
- 在/etc/sudoers.d/创建子文件,添加授权
配置案例
案例一
使用visudo命令添加授权;允许user1用户转换root身份,免密执行/usr/bin/test,/usr/bin/ls,/usr/bin/systemctl list-unit-files命令
user1 ALL=NOPASSWD:/usr/bin/test,/usr/bin/ls,/usr/bin/systemctl list-unit-files
案例二
在/etc/sudoers.d/创建子文件,添加授权;允许user1切换到oot身份,仅可免密执行passwd -S username,查看用户的状态,其他超权命令皆不允许执行,包括:passwd username,修改用户密码。
注:仅授权passwd -S权限,不能只写/usr/bin/passwd -S,否则不生效。
touch /etc/sudoers.d/00-user1
vi /etc/sudoers.d/00-user1
user1 ALL=NOPASSWD:/usr/bin/passwd -S [A-Za-z]*
高级配置
别名类型包括如下四种:
Host_Alias 定义主机名别名;
User_Alias 用户别名,别名成员能够是用户,用户组(前面要加%号)
Runas_Alias 用来定义runas别名,这个别名指定的是“目的用户”,即sudo 允许转换至的用户;
Cmnd_Alias 定义命令别名;注:这里我还要啰嗦两句,因为Runas_Alias并不像User_Alias清晰的说明是User的别名;所以Runas_Alias中配置的不一定是用户,看我们怎么引用;例如:
Runas_Alias ADMINGRP = adm, oper
- 如果%opers ALL = (: ADMINGRP) /usr/sbin/这么引用,adm, oper指的是用户组;
- 如果%opers ALL = (ADMINGRP) /usr/sbin/这么引用,adm, oper指的是用户;
配置举例
1、user1、user2以及group1下的所有用户,均拥有转换用户身份,以执行SYDCMD、DSKCMD命令列表中命令的权限;
2、user3仅拥有转换为root身份,以执行DSKCMD命令列表中命令的权限。
User_Alias SYSADER=user1,user2,%group1
User_Alias DISKADER=user3
Runas_Alias OP=root
Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk
SYSADER ALL= SYDCMD,DSKCMD
DISKADER ALL= (OP) DSKCMD
查看用户的sudo权限
未拥有sudo权限
~]$ sudo -l
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。[sudo] user001 的密码:
对不起,用户 user001 不能在 fusionos-11-113 上运行 sudo。
拥有sudo权限
user001用户拥有转换到root和user003执行/usr/bin/passwd -S [A-Za-z]*, /usr/bin/cat命令的权限,转换到其他用户将被拒绝。
~]$ sudo -l
……用户 user001 可以在 fusionos-11-113 上运行以下命令:
(root, user003) NOPASSWD: /usr/bin/passwd -S [A-Za-z]*, /usr/bin/cat
user001用户拥有转换到root组执行/usr/bin/passwd -S [A-Za-z]*, /usr/bin/cat的权限。用户转用户并执行command,我们好理解,用户转组其实是用户获取目的组的权限,并执行命令。
~]$ sudo -l
……用户 user001 可以在 oracle11g-209 上运行以下命令:
(user001 : root) NOPASSWD: /usr/bin/passwd -S [A-Za-z]*, /usr/bin/cat(ALL) ALL
能看到末尾的同学,说明真的是看进去了;那么,赠送一个知识点^_^,上面通过sudo -l查看user001用户的sudo授权情况,可以看到,有2行授权(user001 : root) NOPASSWD……和(ALL) ALL;知识点来了:
- 只有一行授权配置会生效;
- 只有最后一行生效;
- 在/etc/sudoers中表现为:自上而下,越往下优先级越高;
- /etc/sudoers和/etc/sudoers.d/*下的文件,后者优先级高于前者。