CentOS下用好sudo

分类:CentOS运维 阅读:1663 次

sudo工具能够帮你把一部分系统管理的责任分摊给其他人,还不用给出完全的root访问权限。它是一个setuid程序,只需要输入用户自己的密码,就可以执行sudo后面的命令。

使用root帐号,运行/usr/bin/visudo 来编辑那些用户可以调用sudo命令的用户列表,缺省的sudo列表看上去类似下面这样:

引用root ALL=(ALL) ALL
很不幸,很多系统管理直接把这条当作了模板,然后授权给其他用户,就像这样:
引用root ALL=(ALL) ALL
work ALL=(ALL) ALL
test ALL=(ALL) ALL
上面这种模式使得work和test帐号具有完全的root权限,还不需要root帐号的密码。如果你授权的这些帐号如果是完全可信赖的,那这是一个不错的方法,可惜,信赖并不是那么说的清楚。
因此我们需要按照最小原则来给特定的帐号授权,我们先看看sudo列表文件的语法,在sudo列表里,每一行应该是下面这个样子:
引用user machine=(effective user) command
第一列(user)指定要授权的帐号。第二列(machine)定义在那些机器上,这条执行生效,其好处是在多台机器上使用同一份配置文件。
举个例子,假设有一个开发人员需要在开发服务器上获得root访问权限,在其他服务器上就不行,那么我们这样做
引用steven beta.xplore.cn=(ALL) ALL
第三列(就是括号里的effective user)指定实际执行该命令的帐号,这就方便一个帐号允许用另外一个帐号来执行特定的命令,而不非得是root帐号:
引用steven mail.xplore.cn=(mailman) ALL
最后一列(command)指定所以这个帐号看可以在sudo环境下执行的指令:
引用kevin ns.xplore.cn =(bind) /usr/sbin/rndc,/usr/sbin/named
如果你觉得在指定用户或者机器或者命令时列表太长(比如很多帐号授权相同,一个帐号需要指定的命令和机器列表过长),我们可以使用sudo列表里Alias语法,Alias的语法和shell环境变量中alias类似,你可以看成是一个变量:
引用user_Alias ADMINS=wgzhao,kevin,steven
User_Alias WEBMASTERS=xplore,glemir,xinhe

Runas_Alias DAEMONS=bind,www,ftp

Host_Alias WEBSERVERS=www.xplore.cn,www.lawburn.com

Cmnd_Alias PROCS=/bin/kill,/bin/killall,/usr/bin/skill,/usr/bin/top
Cmnd_Alias APACHE=/usr/bin/apachectl

WEBMASTERS WEBSERVERS=(www) APACHE
ADMINS ALL=(DAEMONS) ALL
以上都是针对帐号的,其实第一列中也可以指定组帐号,表示允许所有属于这个组的帐号都获得这样的授权,语法上,只需要在组帐号之前加上一个%号,就像这样:
引用%mail WEBSERVERS=(mail) sendmail
现在,属于mail组的帐号都可以在WEBSERVERS定义的服务器上用mail帐号来执行sendmail指令。

除此之外,还有一个有用的标志,那就是NOPASSWD: 。如果设置了这个标志,表示当前授权的帐号执行后面的帐号不需要输入当前帐号的密码:
引用xplore ALL=(ALL) NOPASSWD: PROCS
这允许帐号xplore可以用任何帐号执行kill,killall,skill和top指令,还不用输入密码。