sudo” 是Unix/Linux平台上的一个非常有用的工具,允许为非根用户赋予一些合理的“权利”,让他们执行一些只有根用户或特许用户才能完成的任务,从而减户的登陆次数和管理时间同时也提高了系统安全性。

一、介绍:
    sudo的配置文档是/etc/sudoers ,我们能够用他的专用编辑工具visudo对其进行编辑 ,此工具的好处是在添加规则有误时,保存退出会提示给我们错误信息;

附注:如果没有visudo命令 需要 yum install -y sudo

配置完毕后,如果想知道哪些命令是您当前用户能够执行或禁止的,可通过切换至该用户身份,然后通过sudo -l 查看;

  • sudo的目的:为非根用户授予根用户的权限;

  • 配置文件:/etc/sudoers

  • visudo命令编辑修改/etc/sudoers配置文件

二、配置文件简介:
    /etc/sudoers 文件有其书写格式,其中有别名类型以及“放权格式”,下面我们来一一介绍。

别名类型包括如下四种:
Host_Alias  定义主机名别名;
User_Alias  用户别名,别名成员能够是用户,用户组(前面要加%号)
Runas_Alias 用来定义runas别名,这个别名指定的是“目的用户”,即sudo 允许转换至的用户;
Cmnd_Alias  定义命令别名;

需要注意的是:
1.在每一种Alias后面定义的别名 NAME 可以是包含大写字母、下划线连同数字,但必须以一个大写字母开头
2.配置文件中的 Default env_reset 表示重置(就是去除)用户定义的环境变量,也就是说,当你用sudo执行一个命令的时候,你当前用户设置的所有环境变量都是无效的。
放权格式:
授权用户/组    主机名=(允许转换至的用户)   NOPASSWD:命令动作
红色标注的三个要素缺一不可,但在动作之前也能够指定转换到特定用户下,在这里指定转换的用户要用( )号括起来,
假如无需密码直接运行命令的,应该加NOPASSWD:参数,不需要时方可省略,下面介绍中会有NOPASSWD的使用示例。

三、实战配置

1、一般用户赋权设置:

[root@localhost ~]# visudo
……前面省略
75 ## Allow root to run any commands anywhere
76 root    ALL=(ALL)       ALL
77 test    ALL=(root)     /usr/sbin/useradd  #表示允许test用户从任何主机登录,以root的身份执行/usr/sbin/useradd命令。
……后面省略

说明:

第一个字段:root为能使用sudo命令的用户;第二个字段:第一个ALL为允许使用sudo的主机,第二个括号里的ALL为使用sudo后以什么身份(目的用户身份)来执行命令;第三个字:ALL为以sudo命令允许执行的命令;

2、sudo配置深入:

1)多个用户的设置(非同一群组用户):

•对于不同需求的用户:可以按照上面的方法依次增加多行,每行对应一个用户。

•对于相同需求的多个用户, 定义用户别名:User_Alias UUU=user1,user2…… 

[root@localhost ~]# visudo
……前面省略
20 # User_Alias ADMINS = jsmith, mikem      //这个就是一个实例行
21 User_Alisa sudouser = user1,user2,%test  #定义用户别名sudouser,下有成员user1,user2,和test用户组下的成员,用户组前面必须加%号
……后面省略

75 ## Allow root to run any commands anywhere
76 root    ALL=(ALL)       ALL
77 sudouser   ALL=(root)    /usr/sbin/useradd  #命令行书写格式,用户列用别名
……后面省略

•对于多个命令的设置,  定义命令别名:Cmnd_Alias CCC=command1,command2…… 

[root@localhost ~]# visudo
……前面省略
26 ## Networking
27 #Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool    //这个就是一个实例行
28 Cmnd_Alias DEPLOY = /usr/bin/cp, /usr/bin/mv
29 Cmnd_Alias SUDODEPLOY = /usr/bin/supervisorctl, /bin/sed,/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root   #表示不能通过passwd 来更改root密码;

……后面省略

75 ## Allow root to run any commands anywhere
76 root    ALL=(ALL)       ALL
77 test    ALL=(root)      DEPLOY  #命令行书写格式,命令列用别名
78 deploy   ALL = (root)  NOPASSWD: SUDODEPLOY,DEPLOY #如果我想不输入用户的密码就能转换到root并运行SUDODEPLOY和DEPLOY下的命令

……后面省略

•对于多主机的设置和多登陆角色的设置:定义主机别名:Host_Alias HHH=host1,host2……    修改后对应的命令行主机列位置也是用别名定义runas别名:Runas_Alias OP=root      #定义Runas用户,也就是目标用户的别名为OP,下有成员root    

User_Alias SYSADER = qiangsh
Runas_Alias OP = root
Cmnd_Alias SYDCMD = /sbin/parted, /sbin/fdisk     #定义命令别名SYDCMD,下有成员parted和fdisk 
   DISKADER ALL= (OP) SYDCMD
说明:
表示授权DISKADER 下的任何成员,能以OP的身份,来运行 SYDCMD ,无需密码;
更为明确的说 qiangsh 用户能以root身份运行parted和fdisk命令,其等价规则是:
qiangsh ALL=(root) /sbin/parted,/sbin/fdisk

#如果我想不输入用户的密码就能转换到root并运行 SYDCMD 下的命令,那应该把把NOPASSWD:加在哪里为好?参考下面例子;
SYSADER ALL= NOPASSWD: SYDCMD

  2)多个用户的设置(同一群组用户): 

[root@localhost ~]# visudo
……前面省略
81
82## Allows people in group wheel to run all commands
83# %wheel        ALL=(ALL)       ALL        //用户列%+群组名
……后面省略