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