sudoers 实例:
因为sudoers文件是进行单次语法解析的,所以顺序是相当重要的。一般来说,你应该像这样组织sudoers,Host_Alias\User_Alias\Cmnd_Alias定义首先定义,然后紧跟Default_Entry行,最后是Runas_Alias和用户自定义。最基本的经验方法是你不能引用没有被定义的Alias。下面是sudoers条目实例,无可否认,有些条目是有点做作;首先,我们定义aliases:
# User alias specification
#将用户分成别名组
User_Alias FULLTIMERS = millert, mikef, dowdy
User_Alias PARTTIMERS = bostley, jwfox, crawl
User_Alias WEBMASTERS = will, wendy, wim
# Runas alias specification
#指定命令以什么身份运行
Runas_Alias OP = root, operator
Runas_Alias DB = oracle, sybase
# Host alias specification,:用来连接多个定义
Host_Alias SPARC = bigtime, eclipse, moet, anchor :\
SGI = grolsch, dandelion, black :\
ALPHA = widget, thalamus, foobar :\
HPPA = boa, nag, python
Host_Alias CUNETS = 128.138.0.0/255.255.0.0
Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0
Host_Alias SERVERS = master, mail, www, ns
Host_Alias CDROM = orion, perseus, hercules
# Cmnd alias specification
Cmnd_Alias DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\
/usr/sbin/restore, /usr/sbin/rrestore
Cmnd_Alias KILL = /usr/bin/kill
Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm
Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown
Cmnd_Alias HALT = /usr/sbin/halt
Cmnd_Alias REBOOT = /usr/sbin/reboot
Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \
/usr/local/bin/tcsh, /usr/bin/rsh, \
/usr/local/bin/zsh
Cmnd_Alias SU = /usr/bin/su
Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less
#这儿我们以默认值重写一些编译值。我们想sudo syslog在所有的情况下使用认证机制来记录日志。我们不想让全职人员受sudo lecture支配,用户millert使用sudo不需要密码,当我们以root用户运行命令时,我们不想重置LOGNAME,USER和USERNAME环境变量。另外,在SERVERS Host_Alias主机上,我们保存一个增加的本地日志文件,保证在每行日志都记有年份,因为日志条目会被保留几年。最后一点,我们取消PAGERS Cmnd_Alias的shell转义字符(/usr/bin/more, /usr/bin/pg and /usr/bin/less);
# Override built-in defaults
Defaults syslog=auth
Defaults>root !set_logname
Defaults:FULLTIMERS !lecture
Defaults:millert !authenticate
Defaults@SERVERS log_year, logfile=/var/log/sudo.log
Defaults!PAGERS noexec
指定用户是实际决定谁可以运行的部分;
root ALL = (ALL) ALL
%wheel ALL = (ALL) ALL
我们让root和wheel组的任何用户在任意主机上运行任何命令;
FULLTIMERS ALL = NOPASSWD: ALL
全职系统管理员可以不用认证在任何主机上就可以运行任何命令;
PARTTIMERS ALL = ALL
兼职系统管理员 (bostley, jwfox, and crawl) 需要首先认证他们自己才能运行任意命令;(因为缺少NOPASSWD标识)
jack CSNETS = ALL
用户jack可以在CSNETS alias上运行所有任何命令;只有128.138.204.0/24指定了子网掩码,其它机器的子网掩码默认与本机一致;
lisa CUNETS = ALL
用户lisa在CUNETS alias运行任何命令;
operator ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,\
sudoedit /etc/printcap, /usr/oper/bin/
用户operator在任何主机上运行有限的命令,如DUMPS、/usr/oper/bin/所有的命令;
joe ALL = /usr/bin/su operator
joe只有su到operator
pete HPPA = /usr/bin/passwd [A-z]*, !/usr/bin/passwd root
pete被允许在HPPA上改变除root用户外的任何人的密码。注意,这里假设passwd没有以多个用户名为参数;
bob SPARC = (OP) ALL : SGI = (OP) ALL
用户可以在SPARC和SGI上以任何在OP Runas_Alias中列出的用户(root和operator)的身份运行任何命令;
jim +biglab = ALL
jim可以在biglab网络组的机器上运行任何命令;sudo知道biglab是一个网络组缘于前缀+。
+secretaries ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser
secretaries网络组中用户需要帮助管理打印机、增加删除用户;
fred ALL = (DB) NOPASSWD: ALL
fred可以无需密码以DB Runas_Alias中的用户运行任何命令;
john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*
在ALPHA机器上,john可以su到除了root的任何人,且不允许给su任何-开头的参数;
jen ALL, !SERVERS = ALL
jen可以在除SERVERS上运行所有命令;
jill SERVERS = /usr/bin/, !SU, !SHELLS
jill可以在SERVERS主机上运行/usr/bin下的除SU和SHELLS Cmnd_Aliases之外的所有命令;
steve CSNETS = (operator) /usr/local/op_commands/
steve可以以用户operator执行/usr/local/op_commands/下的命令;
matt valkyrie = KILL
在个人工作站valkyrie上,matt 能够使用kill杀死进程;
WEBMASTERS www = (www) ALL, (root) /usr/bin/su www
在主机www,WEBMASTERS User_Alias的各个用户可以以www运行所有伪政府或者以root用户切换到www;
ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\
/sbin/mount -o nosuid\,nodev /dev/cd 0a /CDROM
安全要点
使用"!"来从ALL中减去命令一般来说不会产生预期作用.用户可以简单的通过把希望执行的命令改名执行的法子来绕过限制.例如:
bill ALL = ALL, !SU, !SHELLS
这并不会阻止bill执行SU和SHELLS中列出的命令.他只需要把这些命令改一个名字,或者从一个编辑器或者其他程序中escape到shell(译注:原文是use a shell escape from an editor or other program)就可以运行了.所以这种类型的限制至少应该经过深思熟虑(并从策略上加强它).
CAVEATS
sudoers必需总是使用visudo命令来编辑,因为它会锁定文件并且进行语法检察.这强制sudoers摆脱语法错误,因为sudoers有语法错误时sudo是不会运行的.
当使用机器的网络用户组时(与用户相反),如果您在网络用户组中存贮了完整的主机名(这经常是事实),您需要让主机名像hostname命令的输出一样是完整的或者在sudoers中使用fqdn选项.
文件
/etc/sudoers 谁能作什么的一个列表
/etc/group 本地组文件
/etc/netgroup 网络组文件