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/cd0a /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 网络组文件