众所周知,Linux系统权限管理是Linux运维工作的重中之重。若服务器不需要团队协作运维管理,那么超级权限可以集中在一人手中,但是很多时候,企业服务器的数量并不止一台,需要很多运维人员共同管理,甚至还需要为开发人员分配管理服务器的用户账号,因此,如何科学地分配和管理,让每个用户既能达到工作要求又不会越权访问(获得工作需求以外的权限)就显得非常重要了,本章就来讲讲这方面的方案设计与实施案例。
sudo命令对应的用户权限授权配置文件为/etc/sudoers,我们可以使用专用工具visudo来完成有关sudo的授权管理配置,使用visudo工具的好处是在添加规则之后,保存退出时会检查授权配置的语法(这一点很重要,曾经有人直接用vi编辑/etc/sudoers,最后配置发生了错误,造成所有普通用户都无法通过sudo执行命令以及切换到超级root上了)。
在授权配置完成以后,可以切换到被授权的用户下,通过sudo-l命令可以查看哪些超级权限命令是可以执行的。
·命令别名下的成员必须是文件或目录的绝对路径。
·别名名称包含大写字母、数字、下划线等,如果是字母则都要大写。
·一个别名下包含多个成员,成员与成员之间,通过半角“,”号进行分隔;成员必须是有效且实际存在的。
·别名成员受别名类型Host_Alias、User_Alias、Runas_Alias、Cmnd_Alias的制约,定义什么类型的别名,就要有什么类型的成员与之相配。
·别名规则是每行算一个规则,如果一行容不下,则可以通过“\”来续行。
·指定切换的用户要用“()”(括号)括起来。如果省略括号,则默认为root用户;如果括号里是ALL,则代表能够切换到所有用户。
·如果希望不需要密码就直接运行命令,则应该加上“NOPASSWD:”参数。
·若想禁止某类程序或命令执行,则要在命令动作前面加上“!”号,并且放在允许执行命令的后面。
·用户组前面必须加“%”号。
sudoers文件中的别名类型(Alias_Type)包括如下四种。
1)Host_Alias,表示定义主机别名,实际配置语法如下:
Host_Alias FILESERVERS = fs1, fs2 #<==请注意定义规范,“=”号两边最好有空格。 Host_Alias MAILSERVERS = smtp, smtp2 #<==请注意定义规范,每个成员之间用逗号进行分隔。
关于Host_Alias的说明具体如下。
·在生产场景中,一般不需要设置主机别名,在定义授权规则时可以通过ALL来匹配所有的主机。
·请注意上面定义的规范,有些规范虽然不是必需的,但最好能够按照系统的标准来进行配置,这样可以避免意外问题的发生。
·其实,主机名就是一个逻辑上的主机组,当多台服务器共享一个/etc/sudoers的时候就会用到这个主机别名。不过,在实际企业运维中,这个需求几乎是不存在的。
在sudo实际授权语法规则配置时,第一个ALL的位置就是主机别名的配置位置,示例代码如下:
root ALL=(ALL) ALL #<==第一个ALL就是主机别名的应用位置。
2)User_Alias,表示定义用户别名,别名成员可以是用户、用户组(用户组前面要加“%”号),实际配置语法如下:
User_Alias ADMINS = jsmith, mikem, %groupname #<==提示:设置用户别名也不是必需的,更多情况下,可以通过“%groupname”的方式一次性设定用户组配置,以后若有成员增加,则将新成员加入准备好的用户组就可以了。
3)Runas_Alias,表示定义runas别名,这个别名指定的是授权的“用户身份”,即sudo允许切换到的用户身份。
Runas_Alias定义的是可以执行sudo命令身份的用户,实际配置语法如下:
Runas_Alias OP = root
实际工作中都是普通用户需要转换到root身份,普通用户之间权限相同,极少有授权其他普通用户身份的需求。
4)Cmnd_Alias,表示定义命令别名,命令别名就是定义一个别名,然后别名里面包含一堆命令,即一组相关命令的集合,实际配置语法如下:
## Command Aliases ## These are groups of related commands... ## Networking Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool ## Installation and management of software Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum ## Services Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig #<==提示:命令别名就是设置一组可以执行的命令集合,可以将不同类的命令分为不同的组,例如,磁盘命令管理组、网络命令管理组等。
在/etc/sudoers配置文件中,别名和配置语法的对应关系见表15-1