/etc/sudoers的配置


/etc/sudoerssudo的配置文件,它的属性必须为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用户的身份来运行后面列出的命令。该值也可以设成通配符ALLjorge便能作为系统中的任何用户来执行列出的命令了。


最后一栏(即/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组中的任何成员都能运行useradduserdelusermod命令了。如果过一段时间后,您发现该角色还需要其他工具,只要在该表的尾部将其添上就行了。这样真是方便极了。


默认情况我们会看到有"%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