青蛙学Linux—sudo和它的配置文件
sudo用于普通用户执行只有超级用户才有权限执行的命令。命令语法如下:
sudo [选项] 执行的命令
使用sudo执行命令时,系统会提示用户输入密码,注意,此时输入的密码为当前执行sudo用户的密码,而非root用户的密码。这也是为什么需要sudo命令的原因。使用su命令切换到root时,需要输入的是root用户的密码,这就造成了很大的安全隐患,root用户不应该把自己的密码告诉普通用户。并且使用su命令切换到root后将拥有root用户的所有权限,而sudo的权限是可以通过配置文件进行控制的。
sudo的配置文件为:
/etc/sudoers
在该配置文件中,可以对用户通过sudo执行的命令进行控制。以下为/etc/sudoers的权限控制部分:
## Next comes the main part: which users can run what software on ## which machines (the sudoers file can be shared between multiple ## systems). ## Syntax: ## ## user MACHINE=COMMANDS ## ## The COMMANDS section may have other options added to it. ## ## Allow root to run any commands anywhere root ALL=(ALL) ALL ## Allows members of the 'sys' group to run networking, software, ## service management apps and more. # %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS ## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL ## Same thing without a password # %wheel ALL=(ALL) NOPASSWD: ALL ## Allows members of the users group to mount and unmount the ## cdrom as root # %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom ## Allows members of the users group to shutdown this system # %users localhost=/sbin/shutdown -h now
该部分遵循以下语法:
who where=(whom) [NOPASSWD:]command
- who,哪个用户
- where,从哪里登录
- whom,以什么身份
- NOPASSWD,使用sudo时不用输入密码
- command,执行的命令;可设置多条命令,命令之间使用,分隔;在命令前使用!代表不能执行这条命令
这里我们回到上面的配置文件,查看里面生效的两条配置:
root ALL=(ALL) ALL %wheel ALL=(ALL) ALL
根据上面的语法,我们可以分析出这两条配置的含义:root用户和wheel组(%wheel)可以在任何地方以任何的身份执行任何命令。
注意:在修改该配置文件时,建议使用visudo工具打开并修改,而不推荐使用Vi/Vim直接进行修改。visudo会在保存时对语法进行检查,如有错误将会进行提示,这样可以避免因语法错误造成该文件失效。在CentOS中,visudo调用的是Vi,所以操作同Vi。
一些例子:
设置用户fangyu可以在任何地方以root用户的身份执行所有命令:
在设置之前,先切换到fangyu用户,并执行useradd:
[fangyu@localhost ~]$ whoami fangyu [fangyu@localhost ~]$ useradd test -bash: /usr/sbin/useradd: 权限不够 [fangyu@localhost ~]$ sudo useradd test [sudo] fangyu 的密码: fangyu 不在 sudoers 文件中。此事将被报告。
提示fangyu用户不在sudoers文件中,无法使用sudo。那么我们按要求在/etc/sudoers中加上以下配置:
fangyu ALL=(root) ALL
测试:
[fangyu@localhost ~]$ whoami fangyu [fangyu@localhost ~]$ sudo useradd test [sudo] fangyu 的密码: [fangyu@localhost ~]$ id test uid=1001(test) gid=1001(test) 组=1001(test)
fangyu用户已经可以使用sudo命令执行useradd命令了,说明配置成功。
在上面设置的基础上,我们要使fangyu用户不能使用sudo时不能执行useradd命令,而且在使用sudo时不用输入密码,配置如下:
fangyu ALL=(root) NOPASSWD:ALL,!/usr/sbin/useradd
测试:
# 先删除test用户,测试是否可以使用其他命令并不用输入密码 [fangyu@localhost ~]$ whoami fangyu [fangyu@localhost ~]$ sudo userdel -r test [fangyu@localhost ~]$ id test id: test: no such user # 配置成功,可以使用userdel命令并且不需要密码 # 测试是否可以使用useradd命令 [fangyu@localhost ~]$ sudo useradd test 对不起,用户 fangyu 无权以 root 的身份在 localhost.localdomain 上执行 /sbin/useradd test。 # 配置成功,无法执行useradd命令
允许fangyu用户不需要输入密码执行所有命令,除了passwd后加任意字符、passwd root和su这三个操作:
fangyu ALL=(root) NOPASSWD:ALL,!/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root,!/usr/bin/su
另外需要注意的是,如果一个用户或组在配置文件中有多条配置且这些配置中有重合的地方,则下面一条配置将覆盖上面的配置,如:
# fangyu用户有以下两条配置 fangyu ALL=(root) ALL,!/usr/sbin/useradd fangyu ALL=(root) NOPASSWD:ALL # 则上面一条配置将不生效,fangyu用户仍然可以使用useradd命令 # 验证 [fangyu@localhost ~]$ whoami fangyu [fangyu@localhost ~]$ sudo useradd test5 [fangyu@localhost ~]$ id test5 uid=1003(test5) gid=1003(test5) 组=1003(test5)
额外的:sudo的环境变量问题
在自定义了环境变量之后,直接执行没有问题,但是使用sudo执行的时候却提示无法找到命令。这是sudo的设置问题,我们可以通过以下命令查看sudo的默认设置:
[root@localhost ~]# sudo -l 匹配 %2$s 上 %1$s 的默认条目: !visiblepw, always_set_home, match_group_by_gid, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin 用户 root 可以在 localhost 上运行以下命令: (ALL) ALL
注意上面的env_reset和secure_path条目,意思为使用sudo时将环境变量更改为安全路径,然后给出安全路径的定义,导致我们自定义的环境变量无法生效。如果需要修改,只需要找到/etc/sudoers文件中的以下内容:
# # Preserving HOME has security implications since many programs # use it when searching for configuration files. Note that HOME # is already set when the the env_reset option is enabled, so # this option is only effective for configurations where either # env_reset is disabled or HOME is present in the env_keep list. # Defaults always_set_home Defaults match_group_by_gid Defaults env_reset Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS" Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE" Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES" Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE" Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY" # # Adding HOME to env_keep may enable a user to run unrestricted # commands via sudo. # # Defaults env_keep += "HOME" Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
修改:
Defaults env_keep += "变量名" # 添加环境变量保留 Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:自定义变量 # 修改安全路径