/etc/sudoers的配置
/etc/sudoers是sudo的配置文件,它的属性必须为440。
sudo命令核心思想是权限的赋予,即某个命令的所属用户不是你自己,而你却有权限执行它。但是我们需要注意的是,虽然你有权限执行这个命令,但是在执行的时候却仍是以这个命令本身所属用户来完成。
注意:
在linux中每个进程都是有与之相关的UID,GID,分别为有效UID,真实UID,有效GID,真实GID。有效UID,GID是用来判断权限,而真实UID,GID是用来记账(哪个进程属于哪个用户,或记录日志等等)。当配置了sudo entry后,有效UID里面就包含了这个被配置的用户UID,因而权限验证的时候就可以通过。
sudo特性主要有这样几点:
Sudo能够限制用户只在某台主机上运行某些命令。
Sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。
Sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票(这个值可以在编译的时候改变)。
Sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers
su 与 sudo 的对比
su即永久的切换到了su过去的用户,然后以这个su到的新用户干它能干的一切事情,
而sudo则是指在执行某个命令的时候临时切换到这个命令的所属用户执行,而且sudo可以做到以单个命令为单位将权限赋予给其他用户,相比su显得更加灵活。
编辑配置文件命令:visudo
sudo visudo
sudo visudo -f /etc/sudoers
sudo vim /etc/sudoers
root ALL=(ALL) ALL
是允许root用户使用sudo命令变成系统中任何其它类型的用户
%admin ALL=(ALL) ALL
管理组中的所有成员都能以root的身份执行所有命令
用一个实例来详细解释/etc/sudoers文件的配置语法
Jorge ALL = (root) /usr/bin/find, /bin/rm
第一栏规定它的适用对象:用户或组,就本例来说,它是用户jorge。此外,因为系统中的组和用户可以重名,要想指定该规则的适用对象是组而非用户的话,组对象的名称一定要用百分号%开头。
第二栏指定该规则的适用主机。当我们在多个系统之间部署sudo环境时,这一栏格外有用,这里的ALL代表所有主机。但是,对于桌面系统或不想将sudo部署到多个系统的情况,这一栏就换成相应的主机名。
第三栏的值放在括号内,指出第一栏规定的用户能够以何种身份来执行命令。本例中该值设为root,这意味着用户jorge能够以root用户的身份来运行后面列出的命令。该值也可以设成通配符ALL,jorge便能作为系统中的任何用户来执行列出的命令了。
最后一栏(即/usr/bin/find,/bin/rm)是使用逗号分开的命令表,这些命令能被第一栏规定的用户以第三栏指出的身份来运行它们。本例中,该配置允许jorge作为超级用户运行/usr/bin/find和 /bin/rm这两个命令。需要指出的是,这里列出的命令一定要使用绝对路径。
我们可以利用这些规则为系统创建具体的角色。例如,要让一个组负责帐户管理,你一方面不想让这些用户具备完全的root访问权限,另一方面还得让他们具有增加和删除用户的权利,那么我们可以在系统上创建一个名为accounts的组,然后把那些用户添加到这个组里。之后,再使用visudo为/etc/sudoers添加下列内容:%accounts ALL=(root) /usr/sbin/useradd,/usr/sbin/userdel, /usr/sbin/usermod ,这样,accounts组中的任何成员都能运行useradd、userdel和usermod命令了。如果过一段时间后,您发现该角色还需要其他工具,只要在该表的尾部将其添上就行了。这样真是方便极了。
默认情况我们会看到有"%admin ALL=(ALL) ALL"一句话
1如果想把admin组的用户都sudo不用密码那么可以将这一行换为:"%admin ALL=(ALL) NOPASSWD: ALL"即可。
2如果仅仅想让jay用户sudo不需密码,则可添加"jay ALL = NOPASSWD: ALL"这样一行.
3如果让jay用户sudo不用密码即可执行某几个命令,可这样写"jay ALL = NOPASSWD: /usr/bin/abc.sh, /usr/sbin/adduser"
我添加"jay ALL = NOPASSWD: ALL"这样一行;但是,jay执行sudo时还是需要输入密码,这是为什么?
原来是,我这一行在"%admin ALL=(ALL)ALL"组策略之前,后面的组配置覆盖了前面的配置,而jay属于admin组,所以需要密码。这时,只需要将%admin行用#注释掉即可。OK!然后立马就生效了
在/etc/sudoers文件里面主要包括这两部分:
1.别名设置
别名主要包括这几种:User_Alias,Host_Alias,Runas_Alias,Cmnd_Alias,分别是用户别名,主机别名,运行用户别名,命令别名。设置这几个别名的命令主要是为了配置方便,这个很类似linux用户群组或是数据库中角色的作用,有了别名便可以批量的赋予权限。
2.真正的sudo entry
这个就是真正配置哪些用户可以使用哪些命令了(你甚至可以不使用别名设置那部分)
格式为:用户名(用户别名) 主机名(主机别名)=[(运行用户或是Runas_Alias)可选] [tag可选] 可以执行的命令(或Cmmd_Alias)这样描述语法很生硬,不易理解,举例子、
user1 host1 = /bin/kill # user1 可以在host1上使用命令/bin/kill
user1 host1 = NOPASSWD:/bin/kill
# user1 可以在host1上使用命令/bin/kill同时可以不必输入密码(这里就是使用了NOPASSWD。
user1 host1 = NOPASSWD: /bin/kill , PASSWORD: /bin/ls
# user1 可以在host1上使用命令/bin/kill无需输入密码,但是使用/bin/ls则需要输入密码
user1 host1 = (opterator)/bin/kill
# user1 可以在host1上使用命令/bin/kill但是必须是以operator用户运行这个命令,等价于 # su -u opertor /bin/kill