- 论坛徽章:
- 0
|
字符串
mailsub
发送给mailto user的邮件使用的主题.转义字符%h将被扩展为机器的主机名.默认值为"*** SECURITY information for %h ***".
badpass_message
当用户输入了错误的口令时显示的信息.除非设置了insults的话,默认值将为"Sorry, try again."
timestampdir
sudo存储时间戳文件的目录.默认值为/var/run/sudo
passprompt
询问口令时的提示.可以被sudo的-p选项或者SUDO_PROMPT环境变量所覆盖.这里提供了两个转义字符:%u将被扩展为用户的登录名,而%h将被扩展为本地主机名.此选项的默认值为"Password:".
runas_default
使用sudo但没有指定-u标志时使用的默认用户.默认为root
syslog_goodpri
用户身份验证成功时使用的系统日志优先级.默认为notice
syslog_badpri
用户身份验证成功时使用的系统日志优先级.默认为alert
editor
用冒号分隔开的一个允许visudo使用的编辑器列表.可能的话visudo将选择使用和用户的USER环境变量相匹配的那个编辑器,或者是列表中的第一个存在且可执行的编辑器.默认值为您系统中vi编辑器的路径.
可以用在布尔上下文中的字符串(strings that can used in a boolean context)
logfile
sudo日志(不是系统日志)的存放位置.设置一个路径来打开日志功能,取消设置将关闭日志功能.(Seting a path turns on logging to a file; negating this option turns it off.)
syslog
如果起用了syslog的话将使用的系统日志设施(取消此选项来禁用系统日志记录)(译注:原文为:Syslog facility if syslog is being used for logging (negate to disable syslog logging)).默认为arthpriv.
mailerpath
用来发送报警邮件的邮件程序的路径.默认值是sendmail的路径.
mailerflags
使用邮件程序时的标记,默认为 -t.
mailto
发送报警邮件和错误邮件的目的地址.这个地址必须用双引号引起来,以免sudo解释"@"符号.默认值为root.
exempt_group
在此组中的用户将不要求口令和PATH.此选项默认没有设置.
verifypw
此选项控制当用户使用带有-v选项的sudo时,何时要求口令.它可以有下面可能的值:
all:当前主机上sudoers中所有的用户条目都必须设置NOPASSWD标志来避免输入口令.
any:当前主机上sudoers中至少有一个用户条目必须设置NOPASSWD标志来避免输入口令.
never:用户使用-v标志但从不需要输入口令.
always:用户使用-v标志但总是需要输入口令.
默认的值是"all".
listpw
此选项控制当用户使用带有-l选项的sudo时,何时要求口令.它可以有下面可能的值:
all:[/size当前主机上sudoers中所有的用户条目都必须设置NOPASSWD标志来避免输入口令.
any:当前主机上sudoers中至少有一个用户条目必须设置NOPASSWD标志来避免输入口令.
never:用户使用-l标志但从不需要输入口令.
always:用户使用-l标志但总是需要输入口令.
默认值为"any".
可以在布尔上下文中使用的列表(lists that can be used in a boolean context)
env_check
如果含有"%"或者"/"字符的话将从用户的环境中删除的环境变量.这将预防拙劣的程序中printf风格的格式所带来的伤害.这个参数可以是一个用双引号引起,由空格分隔的列表,或者是一个不带引号的单值.这个列表可以通过分别使用"=",+=","-=","!"来重写,增添,删除或取反.当以root身份执行带-V选项的sudo命令时会打印出默认需要检察的环境变量列表.
env_delete
将从用户的环境中删除的环境变量.这个参数可以是一个用双引号引起,由空格分隔的列表,或者是一个不带引号的单值.这个列表可以通过分别使用"= ",+=","-=","!"来重写,增添,删除或取反.当以root身份执行带-V选项的sudo命令时会打印出默认将被删除的环境变量列表.
env_keep
当env_reset选项生效时将在用户的环境中保留的环境变量.这允许对sudo派生的进程的环境进行精密的控制.这个列表可以通过分别使用"=",+=","-=","!"来重写,增添,删除或取反.此列表默认没有成员.
当使用系统日志进行日志记录时,sudo将接受下列值作为系统日志设施(译注:原文为When logging via syslog(3), sudo accepts the following values for the syslog facility)(syslog参数的值):authpriv(如果您的操作系统支持的话),auth,daemon,user,local0,local1,local2,local3,local4,local5,local6和 local7.下列系统日志优先级是被支持的:alert,crit,debug,emerg,err,info,notice和warning.
用户说明(user specification)
User_Spec ::= User_list Host_List '=' Cmnd_Spec_List \
(':' User_Spec)*
Cmnd_Spec_List ::= Cmnd_Spec |
Cmnd_Spec ',' Cmnd_Spec_List
Cmnd_Spec ::= Runas_Spec? ('NOPASSWD:' | 'PASSWD:')? Cmnd
Runas_Spec ::= '(' Runas_List ')'
用户说明决定在一个特定的主机上一个用户能够执行哪些命令.这些命令默认以root身份执行,但可以进行基于每个命令的更改.(译注:原文为By default, commands are run as root,but this can be changed on a per-command basis)
让我们把它分成下面这些部分:
Runas_Spec
Runas_Spec是一个用括号括起的一个简单的Runas_List(在上面已经定义了),如果您在用户说明中没有指定一个 Runas_Spec的话,将会使用默认的root的Runas_Spec(译注:这里原文为:If you do not specify a Runas_Spec in the user specification, a default Runas_Spec of root will be used).Runas_Spec设置了他后面所跟命令的默认项(译注:原文为A Runas_Spec sets the default for commands that follow it,这句话我实在是不知道怎么翻译,暂且这么译吧).对于下面的条目:
dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/who
(译注:这里应该是dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm)
这意味着用户dgb可以运行/binls,/bin/kill和/usr/bin/lprm---但是只能以operator的身份执行.例如:
sudo -u operator /bin/ls
在一个条目的后面改写Runas_Spec也是可能的.如果我们把上面的条目改成这样:
dgb boulder = (operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm
这样用户dgb执行/bin/ls命令是以operator身份,但执行/bin/kill和/usr/bin/lprm命令就是以root身份.
NOPASSWD和PASSWD
默认地,sudo在用户执行一个命令前会验证用户的身份.通过NOPASSWD标签可以更改这个行为.就象Runas_Spec一样, NOPASSWD标签给跟在它后面的Cmnd_Spec_List中的命令设置了一个默认项(译注:原文是Like a Runas_Spec, the NOPASSWD tag sets a default for the commands that follow it in the Cmnd_Spec_List).PASSWD标签可以做相反的事.例如:
ray rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm
这将会允许用户ray在不进行身份验证的情况下在主机rushmore上以root身份运行/bin/kill,/bin/ls和/usr/bin/lprm命令.如果您想让ray在不提供口令的情况下只是可以运行/bin/kill,那么可以修改上面的条目为:
ray rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm
注意,尽管如此,PASSWD标签对于在exempt_group选项中指定了的组中的用户无效.
默认地,如果对当前主机上的某个用户的任何一个条目设置了NOPASSWD标签的话,他将能够运行sudo -l而不提供口令.另外,如果对属于当前主机的用户的所有条目都设置了NOPASSWD标签的话,这个用户就只能运行sudo -v而不提供口令.(译注:前面两句话的原文是By default, if the NOPASSWD tag is applied to any of the entries for a user on the current host, he or she will be able to run sudo -l without a password. Additionally, a user may only run sudo -v without a password if the NOPASSWD tag is present for all a user's entries that pertain to the current host).这个行为可以通过设置verifypw和listpw选项来更改.
通配符(又称meta字符)
sudo允许在sudoers中的路径名和命令行参数中使用shell风格的通配符.通配符匹配是通过POSIX的fnmatch标准程序实现的.注意,这不是正则表达式.
* 匹配任意一组零个或者多个字符
? 匹配任意一个字符
[...] 匹配任意一个在大括号中指定范围里的字符
[!...] 匹配任何一个不在大括号中指定范围里的字符
\x 任意一个字符"x"识别为单纯的"x".这用来转义像"*","?","[","]"和"}"这样的一些特殊字符
注意,路径名中的通配符不会匹配正斜线("/").在匹配命令行参数时,因为斜线不被通配符匹配,这使/usr/bin/*匹配/usr/bin/who而不匹配/usr/bin/X11/xterm.
通配符规则的例外
对上面的规则有下面的例外:
"""" 如果空字符串""是sudoers条目中仅有的命令行参数,这意味着这条命令执行时不允许带有任何参数.
其它的特殊字符和保留字
美元符("#")被用来指明一条注释(除非它出现在用户名上下文中并且后面跟有一个或多个数字,在这种情况下它被作为一个UID来对待).所有的注释字符和任何的文本,直到一行的结尾都将被忽略
保留字ALL是ailas中经常导致成功匹配的单位.它可以在任何可以使用Cmnd_Alias,User_Alias, Runas_Alias, 或Host_Alias的地方使用.您不应该试图定义一个名为ALL的别名,因为aleas中的单位将用作您的个人偏好.请注意,在命令上下文 (command context)中使用ALL是非常危险的,它允许用户在系统上运行任何命令.
感叹号("!")可以在别名中和Cmnd前用作逻辑非操作符.这允许排除一些特定的值.尽管如此,但请注意,联合ALL别名中的单位使用"!" 将允许用户蓄意执行罕见的除了少数以外的所有命令(译注:原文是Note ,however, that using a ! in conjunction with the built in ALL ailas to allow a user to run "all but few" commands rarely works as intended)(参阅下面的"安全要点"一节).
可以在一行的末尾使用反斜线("\")来在下一行延续此行,此时这两行将作为完整的一行对待.
列表元素和用户说明中的特殊语法字符之间的空格是可选的.
下面的字符作为一个词的一部分(例如,一个用户名或者一个主机名)出现时必需使用反斜线("\")来转义:"@","!","=",":", ",", "(", ")", "\".
示例
下面是sudoers条目的示例.显然,一些示例有点不自然.首先,我们定义别名:
# 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, /usr/sbin/fasthalt
Cmnd_Alias REBOOT = /usr/sbin/reboot, /usr/sbin/fastboot
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
接下来我们改写了一些编译进的默认值.我们希望sudo在所有情况下使用auth设施在系统日志中作记录.我们不想总是输出初次使用sudo的提示,并且用户millert使用sudo不需要口令.另外,我们为SERVERS Host_Alias中的主机维护一个附加的本地日志文件.并且由于这个日志需要保存许多年,我们要在日志的每一行中加入年份信息.
# Override built in defaults
Defaults syslog=auth
Defaults:FULLTIMERS !lecture
Defaults:millert !authenticate
Defaults@SERVERS log_year, logfile=/var/log/sudo.log
实际上决定谁能运行什么的是用户说明部分:
root ALL = (ALL) ALL
%wheel ALL = (ALL) ALL
我们让root和wheel组的成员可以在任何主机上以任何人的身份运行任何命令.
FULLTIMERS ALL = NOPASSWD: ALL
专职系统管理员(millert,mikef和dowdy)可以在任何主机上执行任何命令而不需要进行身份验证.
PARTTIMERS ALL = ALL
兼职系统管理员(bostley,jwfox和crawl)可以在任何主机上运行任何命令,但他们首先必须进行身份验证(因为这个条目没有NOPASSWD标签).
jack CSNETS = ALL
用户jack可以在CSNETS别名(网络128.138.243.0,128.138.204.0和128.138.242.0)中的机器上运行任何命令.在这些网络中,只有128.138.204.0明确的给出了掩码(用CIDR方式),指明这是个C类网.对CSNETS中的其他网络来说,如果本地主机的掩码匹配的话将使用本地主机的掩码.
lisa CUNETS = ALL
用户lisa可以在CUNETS别名(B类网络128.138.0.0)中的任何主机上执行任何命令.
operator ALL = DUMPS, KILL, PRINTING, SHUTDOWN, HALT, REBOOT,\
/usr/oper/bin/
用户operator可以执行的命令被限制在一个简单的maintenance中.这里就是和备份,杀死进程,打印系统,关闭系统和任何在/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网络用户组中的机器上运行任何命令.因为biglab前面加上了前缀"+",所以sudo知道这是一个网络用户组.
+secretaries ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser
网络用户组secretaries中的用户需要帮助管理打印机和进行增删用户的工作,所以需要允许他们在任何机器上执行这些命令.
fred ALL = (DB) NOPASSWD: ALL
用户fred可以在DB Runas_Alias (oracle 或 sybase)上以任何人的身份执行任何命令而不需要提供口令.
john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*
用户john可以在ALPHA上su成除root的任何人,但是不允许他给su加上任何标志执行.
jen ALL, !SERVERS = ALL
用户jen可以在除了SERVERS Host_Alias (master, mail, www 和 ns)以外的任何机器上执行任何命令.
jill SERVERS = /usr/bin/, !SU, !SHELLS
用户jill可以在任何SERVERS Host_Alias中的机器上运行/usr/bin/下除了属于SU和SHELLS Cmnd_Aliases外的任何命令.
steve CSNETS = (operator) /usr/local/op_commands/
用户steve可以在任何CSNETS中的机器上执行/usr/local/op_commands/中的所有命令,但是只能以operator的身份.
matt valkyrie = KILL
用户matt应该可以在他自己的工作站valkyrie上杀死挂起的进程.
WEBMASTERS www = (www) ALL, (root) /usr/bin/su www
任何在WEBMASTERS User_Alias (will, wendy,和 wim)中的用户都能够在主机www上以www(网页的所有者)的身份执行任何命令,或者简单的su成www.
ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\
/sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM
所有的用户都应该能够在 CDROM Host_Alias (orion, perseus, hercules)中的主机上mount和unmount光盘驱动器而不需要输入口令.对用户来说敲入这么长的命令有些冗长而乏味,所以把它封装在一个shell脚本中是一个最佳的选择.
安全要点
使用"!"来从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 网络组文件
参阅
rsh(1), sudo(8), visudo(8), su(1), fnmatch(3).
伯克利发布第三版 1.6.6 sudoers(5)
//http://www.leftworld.net [2005-06-27]
[ 本帖最后由 newsecond 于 2007-6-15 11:06 编辑 ] |
|