关于Linux sudo授权的那点事

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/*下的文件,后者优先级高于前者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值