Linux权限管理:sudo命令
使用su切换用户时需知晓对应用户的登陆密码,即若切换成root用户身份,需知道root用户的登陆密码。作为root用户管理员,如何授权其他普通用户,在不需要知晓root密码的情况下,执行root权限的命令操作?,此时即可使用sudo。
1.什么是sudo权限
生产环境中,root用户是团队的负责人,因为root权限过于强大。但是每天工作的普通管理员日常操作常常权限限制,像重启、备份、tar等命令。在linux中普通用户受限严重,很多简单的命令都有权限限制。
- root用户把本来只能超级用户执行的命令赋予普通用户执行
- sudo的操作对象是系统命令
- 文件的权限UGO、特殊权限作用是:用户能不能操作文件
总之,sudo命令的作用是:切换到root用户去执行命令!
1.1 /etc/sudoers配置文件
- sudo是一种权限管理机制,依赖于/etc/sudoers,其定义了
- 授权给哪个用户
- 可以以root身份
- 能够执行什么管理命令
- root用户通过使用visudo命令编辑sudo的配置文件/etc/sudoers,才可以授权其他普通用户执行sudo命令。
- visudo命令可以提供basic sanitychecks和check for parse errors,即提供快速的正确性有效性检查,以及语法检查功能。
查看/etc/sudoers文件
[root@localhost stefan]# visudo
内容很多其中有如下几行比较重要:
授权用户模板格式
root ALL=(ALL) ALL
一行就是授权用户的模板格式。
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
#要授权的用户 需要生效的主机名或IP=(可切换的身份) 可执行的命令
- ALL即所有都ok。所以以上语句含义是:root用户(who) 在 所有主机(where) 上可以 切换成所有用户,执行所有命令(do what)。
- 所有主机(第一个ALL)的含义是在集群场景中,以上授权在哪些主机上可以生效;单台主机用ALL就行。
- 系统命令只能root执行。所以第二个ALL一般写成(root),即普通用户自动切换成root用户后执行系统命令。若省略默认为(root)。
- 第三个ALL,命令写的越简单(比如写ALL),普通用户得到的权限越大,越不安全。写的越详细,包括命令的参数也写上,普通用户得到的权限越小,越安全。有些centos版本规定命令最好用绝对路径。用
whereis 命令
可以查到命令的绝对路径
Tips: 如果是自己的系统,又不想每次都切换root输入密码,一个命令一个命令的配置visudo很麻烦,可以改成
用户名 ALL=(ALL) ALL
这样,直接输入命令就是普通用户,加上sudo就是超级用户。免去用su命令来回切换的麻烦。但是,生产环境一定要小心配置visudo原因见第2节。
授权组模板格式
%wheel ALL=(ALL) ALL
就是授权用户的模板格式。
## Allows people in group wheel to run all commands
#允许组wheel的组成员运行所有的命令
%wheel ALL=(ALL) ALL
## Same thing without a password
#允许组wheel的组成员运行所有的命令,并且不需要密码
%wheel ALL=(ALL) NOPASSWD: ALL
%百分号不能少
1.2 查看sudo可执行的命令
$sudo -l #查看本用户可以执行的sudo命令
2. sudo命令的危险
实例1. 授权普通用户:可以重启服务器(shutdown命令)
切换到root用户,执行visudo命令,增加一行:
user1 ALL=(ALL) /bin/shutdown -r now
此时,user1只能重启,如果写成:
user1 ALL=(ALL) /bin/shutdown
那么user1不光可以重启-r,还可以关机和其他任何选项。
实例2. 授权普通用户:可以添加其他用户(useradd命令)可以修改其他用户密码(passwd 用户名)
user1 ALL=/usr/sbin/useradd #(ALL)缺省默认为(root),即切换成root用户
user1 ALL=/usr/bin/passwd #授予普通用户以root用户身份修改其他所有用户登录密码
安全漏洞:第二个passwd含义是普通用户切换到root用户,然后执行passwd修改密码,因此,普通用户也可以修改root用户的密码了:
$sudo passwd root #可以修改root用户的密码
第二行passwd授权应该这么写:
user1 ALL=/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root
其中
/usr/bin/passwd [A-Za-z]*
代表passwd的用户名一定要包含字母,[A-Za-z]是正则表达式,表示重复!/usr/bin/passwd ""
代表不允许passwd不加用户名执行。因为执行$sudo passwd
时已经是root用户,不加用户名回车表示修改本用户的密码,即root用户的密码。!代表取反,不允许命令!/usr/bin/passwd root
不允许修改root用户密码- 以上三段代码中间有空格,顺序不能变
实例3 【危险】让普通用户sudo执行vi命令!
user1 ALL=/bin/vi
危险:普通用户在执行sudo vi 命令的时,会切换到root用户,因此普通用户可以修改任意系统文件了。比如/etc/shadow是保存密码的文件,权限是000,普通用户无权限查看和编辑
----------. 1 root root 1283 6月 15 21:32 shadow
但如果让普通用户可以sudo执行vi命令,那么就可以查看和修改所有密码了
sudo vi /etc/shadow