- sudo 权限配置说明
- 如何修改 sudo 会话有效期
- 设置输入密码时显示星(*)号
- 别名规则
- 如何定义别名及使用别名配置权限
- 为什么配置的命令要使用绝对路径
- 参考示例
- 授权用户 test 可以重启服务器
- 授权群组可以使用 sudo 切换成任何用户身份,执行任何命令
- 通过命令别名进行授权
- 授权指定用户允许以root身份无密码执行某些命令
- 授权指定用户允许在某个网段上连接主机以root身份执行某些命令
- 授权指定用户允许以任何用户身份执行任何命令,且不要输入密码
- 设置禁止某用户执行某操作
- 授权指定用户执行某些命令需要输入密码,某些命令不需要输入密码
权限配置语法:
who where whom command
or
who which_hosts=(runas) command
解释:谁(who)能够以哪个用户(runas)的身份通过什么主机(which_hosts)执行什么命令(command)。说白了就是,哪个用户在哪个主机以谁的身份执行哪些命令。
使用 visudo
命令可以打开 /etc/sudoers
文件进行编辑设置 sudo,visodo
是编辑 /etc/sudoers
的命令,也可以不用这个命令,直接用 vi
来编辑 /etc/sudoers
。不建议直接使用 vi
,而是使用 visudo
。因为修改 /etc/sudoers
文件需遵循一定的语法规则,使用 visudo
的好处就在于,当修改完毕 /etc/sudoers
文件后进行保存时,系统会自行检验 /etc/sudoers
文件的语法。
因此,修改 /etc/sudoers 文件的命令如下:
[root@htlwk0001host ~]# visudo
...
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
...
通过 visudo
命令,我们就打开了 /etc/sudoers
文件,可以看到如上显示的两行行信息,这是系统给我们提供的两个模板,分别用于添加用户和群组,使其能够使用 sudo
命令。
这两行模板的含义分为是:
root ALL =(ALL) ALL
用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
%wheel ALL =(ALL) ALL
%组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
参数项说明root表示 root 用户。ALL表示从任何的主机上都可以执行。(ALL)是以谁的身份来执行,ALL 就代表 root 可以任何人的身份来执行命令。ALL表示任何命令。%wheel表示 wheel 用户组
root ALL=(ALL) ALL
该条规则的含义就是 root 用户可以在任何主机以任何人的身份来执行所有的命令。
%wheel ALL=(ALL) ALL
该条规则的含义就是 wheel 用户组中的用户可以在任何主机以任何人的身份来执行所有的命令。
表 1 对以上 2 个模板的各部分进行详细的说明。
项目说明用户名或群组名表示系统中的那个用户或群组,可以使用 sudo 这个命令。被管理主机的地址用户可以管理指定 IP 地址的服务器。这里如果写 ALL,则代表用户可以管理任何主机;如果写固定 IP,则代表用户可以管理指定的服务器。如果我们在这里写本机的 IP 地址,不代表只允许本机的用户使用指定命令,而是代表指定的用户可以从任何 IP 地址来管理当前服务器。可使用的身份就是把来源用户切换成什么身份使用,(ALL)代表可以切换成任意身份。这个字段可以省略。授权命令表示 root 把什么命令授权给用户,换句话说,可以用切换的身份执行什么命令。需要注意的是,此命令必须使用绝对路径写。默认值是 ALL,表示可以执行任何命令。 表 1 /etc/sudoers 用户和群组模板的含义 如何修改 sudo 会话有效期sudo 默认在输入一次密码后 5 分钟内不会再次要求密码。5 分钟后,你会再次被要求输入密码。我们可以对有效期进行设置,打开文件 /etc/sudoers,找到下面这行:
Defaults env_reset
在这行的后面添加如下的变量:
Defaults env_reset,timestamp_timeout=[new-value]
[new-value]为想要sudo会话持续的时间数。例如,设数值为 40:
Defaults env_reset,timestamp_timeout=40
如果你希望每次使用 sudo
命令时都要求输入密码,你可以把这个变量赋值为 0
。想要 sudo
会话永远不过时,应赋值为 -1
。
你可能注意过,当sudo要求输入密码然后你开始输入时,不会显示任何东西,甚至连常规的星号都没有。虽然这不是什么大问题,不过一些用户就是希望显示星号。在 /etc/sudoers
文件中找到下面这行:
Defaults env_reset
在后面添加如下参数:
Defaults env_reset,pwfeedback
然后保存文件。现在,无论什么时候输入 sudo 密码,星号都会显示。
别名规则sudoers 文件支持使用别名对同类对象进行分组:组名必须使用全大写字母,使用逗号将同类对象命令隔开。 Host_Alias:主机别名 User_Alias:用户别名 Runas_Alias:以谁的身份运行的别名 Cmnd_Alias:命令别名
如何定义别名及使用别名配置权限[root@localhost ~]# visudo
Host_Alias USERHOSTS = 172.16.0.0/16,127.0.0.0/8,192.168.0.0/24 ##定义主机别名,可以在哪些机器执行特殊命令
Cmnd_Alias USERADMIN=/usr/sbin/useradd,/usr/sbin/usermod,/usr/sbin/userdel ##定义命令别名
root ALL=(ALL) ALL
tom ALL=(root) USERADMIN ##此处定义tom可以执行别名USERADMIN中的所有命令
tom USERHOSTS=(ROOT) USERADMIN ##可以在别名USERHOSTS中机器上执行别名USERADMIN中的命令
为什么配置的命令要使用绝对路径
当我们为用户定义可以运行的命令时,必须使用完整的命令路径。这样做是完全出于安全的考虑,如果我们给出的命令只是简单的useradd而非/usr/sbin/useradd,那么用户有可能创建一个他自己的脚本,也叫做useradd,然后放在它的本地路径中,如此一来他就能够使用 root 身份执行这个这个名为useradd的本地脚本,通过这个脚本文件来执行任何他想要的命令了。这是相当危险的。
参考示例 授权用户 test 可以重启服务器以 root 用户身份执行命令 visudo,编辑文件 /etc/sudoers
,在配置文件中添加如下内容:
test ALL=/sbin/shutdown -r now
注意: 1.这里把可以使用的身份 (ALL)
这个参数省略掉了,表示用户可以使用 sudo 切换成任何用户身份。 2.这里也可以写多个授权命令,之间用逗号分隔。授权完之后,用户 lamp 可以使用 sudo -l
查看授权的命令列表。
向 /etc/sudoers
文件中添加群组配置信息:
%group ALL=(ALL) ALL
此配置信息表示 group 这个群组中的所有用户都能够使用 sudo
切换任何身份,执行任何命令。
假设现在有 pro1,pro2,pro3 这 3 个用户,接下来,我们使用 usermod
命令将 pro1 加入 group 群组,看看有什么效果:
[root@localhost ~]# usermod -a -G group pro1 # 选项`-a`表示将用户pro1追加到群组group中,之前添加的群组也会保留
[root@localhost ~]# su - pro1 # 切换成用户pro1
[pro1@localhost ~]# sudo tail -n 1 /etc/shadow # 用户pro1通过sudo执行命令tail查看文件shadow的最后一行,注意身份是pro1
Password:
pro3:$1$GfinyJgZ$9J8IdrBXXMwZIauANg7tW0:14302:0:99999:7:::
[pro1@localhost ~]# su - pro2 # 切换成用户pro2
[pro2@localhost ~]# sudo tail -n 1 /etc/shadow
Password:
pro2 is not in the sudoers file. This incident will be reported. # 提示用户pro2不在文件sudoers中,该事件会被上报给管理员
可以看到,由于 pro1 加入到了 group 群组,因此 pro1 就可以使用 sudo 命令,而 pro2 不行。同样的道理,如果我们想让 pro3 也可以使用 sudo 命令,不用再修改 /etc/sudoers
文件,只需要将 pro3 加入 group 群组即可。
root ALL=(ALL) ALL
mysql 192.168.200.201=NOPASSWD:COMM1,PASSWD:COMM2
Cmnd_Alias COMM1=/usr/sbin/useradd,/usr/sbin/usermod
Cmnd_Alias COMM2=/user/sbin/userdel
上述的配置中,配置了两个命令组别名:COMM1 和 COMM2,接着授权用户 mysql 可以在主机 192.168.200.201 上以任何用户的身份执行两个命令组别名所包含的命令,但是执行命令别名 COMM1 所含命令无需输入密码,而执行命令别名 COMM2 所含的命令则需要输入密码。
PASSWD:执行被授权的命令之前,必须输入密码进行身份验证 NOPASSWD:执行被授权的命令之前,无需输入密码进行身份验证
注意:PASSWD、NOPASSWD 等标签只能在授权项中使用,不能在别名中使用
授权指定用户允许以root身份无密码执行某些命令mysql ALL=(root) NOPASSWD: /usr/sbin/useradd, /usr/sbin/usermod
解释:授权用户 mysql 可以在任何主机上以 root 用户的名义执行命令 useradd 和 usermod,且无需输入密码。
授权指定用户允许在某个网段上连接主机以root身份执行某些命令下面的配置只允许 nick 在 192.168.10.0/24 网段上连接主机并且以 root 权限执行 useradd 命令。
nick 192.168.10.0/24=(root) /usr/sbin/useradd
授权指定用户允许以任何用户身份执行任何命令,且不要输入密码
mysql ALL=(ALL) NOPASSWD:ALL
如上配置,用户 mysql 执行命令 sudo,无需输入密码。
设置禁止某用户执行某操作下面的配置,表示允许用户 tom 以 root 的身份更改任何用户的密码,但禁止更改 root 用户的密码。
tom ALL=(root) /usr/bin/passwd [a-zA-Z]*,!/usr/bin/passwd root
说明: 1.passwd
是更改用户密码的命令 2.[a-zA-Z]*
是正则表达式,可以匹配任意数量的任意英文字母,在这里表示匹配任意用户名称 3./usr/bin/passwd [a-zA-Z]*
表示设置任意用户的密码 4.!/usr/bin/passwd root
表示不允许修改用户 root 的密码
tom ALL=(root) /usr/sbin/useradd,NOPASSWD: /usr/sbin/userdel,/usr/sbin/groupdel,PASSWD: /usr/sbin/usermod,/usr/sbin/groupmod
说明: 1.执行 /usr/sbin/useradd 操作时必须使用密码; 2.执行 /usr/sbin/userdel, /usr/sbin/groupdel 操作时可以不使用密码; 3.执行 /usr/sbin/usermod, /usr/sbin/groupmod 操作时还是要输入密码; 4.注意,PASSWD和NOPASSWD不可定义于别名中哦!