一)sudo的配置格式

 
chenkuo ALL=(root) /bin/ls,/usr/bin/find
第一栏规定它的适用对象:用户或组,就本例来说,它是用户chenkuo.
第二栏指定该规则的适用主机,当我们在多个系统之间部署sudo环境时,这一栏格外有用,这里的ALL代表所有主机.
第三栏的值放在括号内,指出第一栏规定的用户能够以何种身份来执行命令.本例中该值设为root,这意味着用户chenkuo能够以root用户的身份来运行后面列出的命令.
最后一栏(即/bin/ls,/usr/bin/find)是使用逗号分开的命令表,这些命令能被第一栏规定的用户以第三栏指出的身份来运行它们.本例中,该配置允许chenkuo作为超级用户运行/bin/ls,/usr/bin/find这两个命令
需要指出的是,这里列出的命令一定要使用绝对路径.
 
例如:用户chenckuo用sudo /bin/ls -l 输出内容到文件/tmp/3,文件的属主是root,而不是chenkuo.
su - chenkuo
sudo /bin/ls -l > /tmp/3
-rwxrwxrwx. 1 root root     8 Mar 19 19:06 3
 
如果我们指定用户chenkuo只以自己的身份去运行ls程序,如下:
sudo /bin/ls -l > /tmp/ddk
ls -l /tmp/ddk 
-rw-rw-r--. 1 chenkuo chenkuo 8 Mar 19 19:12 /tmp/ddk
 
 
 
二)sudo中组的应用
 
用户不是我们使用sudo的唯一单位,我们也可以用组的方式,来实现使某个组具有相关权限.
例如我们使accounts组具有创建,删除,更改用户权限的能力,如下:
 
创建组accounts,如下:
groupadd accounts
usermod -g accounts chenkuo
 
编辑/etc/sudoers,如下:
visudo
加入如下内容:
%accounts ALL=(root) /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod
 
切换到chenkuo用户
su - chenkuo
 
用root的权限去创建用户hacher
sudo /usr/sbin/useradd hacker
[sudo] password for chenkuo: 
 
查看hacker用户,确认已经创建成功,如下:
grep hacker /etc/passwd
hacker:x:502:503::/home/hacker:/bin/bash
注:组对象的名称一定要用百分号%开头.
 
 
 
三)sudo的日志记录
sudo的操作默认会被记入 /var/log/secure文件,原因是sudo程序会加载pam模块,而pam模块会向syslog发送消息.
syslog会根据如下的策略写入日志:
authpriv.*                                              /var/log/secure
 
而我们自己也可以通过sudo的配置将消息写入到指定的日志文件,如下:
Defaults    logfile=/var/log/sudo.log
 
执行如下命令:
sudo /bin/ls -l
 
查看日志文件/var/log/sudo.log,如下:
more /var/log/sudo.log 
Mar 18 08:43:48 : root : TTY=pts/1 ; PWD=/root ; USER=root ; COMMAND=/bin/ls -l
 
我们也可以通过如下的配置项关闭向syslog发送消息,如下:
Defaults    !syslog
 
执行如下命令:
sudo /bin/cat /etc/shadow
 
查看日志文件/var/log/sudo.log,如下:
more /var/log/sudo.log 
Mar 18 08:45:53 : root : TTY=pts/1 ; PWD=/root ; USER=root ; COMMAND=/bin/cat /etc/shadow
 
而这时/var/log/secure没有sudo命令执行的记录
 
 
 
四)sudo 使用超时
 
sudo 的一个特性使用时间票据判断自从最后一次运行 sudo 命令以来已经过了多长时间.在指定的时间段内,用户可以重新运行命令而不会提示输入密码,超过这段时间之后,用户必须再次输入密码才能重新运行命令.
如果在 sudoers 中此用户的条目中有 NOPASSWD,票据特性是无效的.
默认的超时是5分钟.如果希望修改默认值,只需在 sudoers 中添加一个条目.例如,可以使用以下条目把用户chenkuo 运行任何命令的超时值设置为2分钟:
Defaults:chenkuo timestamp_timeout=2
 
第一次用sudo运行ls -l,要输入口令,如下:
sudo /bin/ls -l
[sudo] password for chenkuo: 
total 0
 
查看时间,现在是17:10:19
date
Mon Mar 19 17:10:19 EDT 2012
 
再次执行sudo /bin/ls -l,现在是不用输入口令,如下:
sudo /bin/ls -l
total 0
 
查看时间,现在是17:12:43,也就是票据过期了,如下:
date
Mon Mar 19 17:12:43 EDT 2012
 
再次执行sudo /bin/ls -l,现在又要输入口令了,如下:
sudo /bin/ls -l
[sudo] password for chenkuo: 
total 0
 
我们也可以通过sudo -k来取消时间票据,就是说用户再次输入,用户即使没过2分钟,也是要再次输入口令验证的,如下:
sudo -k
 
我们也可以通过sudo -v来更新时间票据.
在sudoers中可以用verifypw选项控制当用户使用带有-v选项的sudo时,何时需求口令
它能有下面可能的值:
all:当前主机上sudoers中所有的用户条目都必须设置NOPASSWD标志来避免输入口令
any:当前主机上sudoers中至少有一个用户条目必须设置NOPASSWD标志来避免输入口令
never:用户使用-v标志但从不必输入口令
always:用户使用-v标志但总是需要输入口令
默认的值是"all".
 
我们做如下的调整:
Defaults:chenkuo verifypw=never
 
切换到普通用户:
su - chenkuo
 
输入sudo -v这时不再需要口令了,如下:
sudo -v 
 
我们也可以通过sudo -l来查看用户的sudo配置信息,如下:
sudo -l
 
在sudoers中可以用listpw选项控制当用户使用带有-l选项的sudo时,何时需求口令
它能有下面可能的值:
all:当前主机上sudoers中所有的用户条目都必须设置NOPASSWD标志来避免输入口令
any:当前主机上sudoers中至少有一个用户条目必须设置NOPASSWD标志来避免输入口令
never:用户使用-l标志但从不必输入口令
always:用户使用-l标志但总是需要输入口令
默认的值是"all".
 
我们做如下的调整:
Defaults:chenkuo listpw=never
 
切换到普通用户:
su - chenkuo
 
sudo -l
Matching Defaults entries for chenkuo on this host:
    !env_reset, requiretty, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS",
    env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT
    LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS
    _XKB_CHARSET XAUTHORITY", logfile=/var/log/sudo.log, !syslog, timestamp_timeout=2, runaspw, passwd_tries=2, listpw=never,
    secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
 
User chenkuo may run the following commands on this host:
    (ALL) /bin/cat *
    (ALL) !/bin/cat /etc/shadow
    (root) /usr/sbin/useradd, (root) /usr/sbin/userdel, (root) /usr/sbin/usermod
注:这里并没有要求用户输入口令,正常来讲我们是要输入口令的.
 
sudo的密码认证
可以在使用sudo时要输入所执行命令的所属用户口令,而不是执行sudo命令的用户口令.这一功能可由runaspw指令进行设置.
下面示例演示了runaspw的用法,同时也演示了重复输入口令次数限制的设置方法:
Defaults:chenkuo timestamp_timeout=2,runaspw,passwd_tries=2
 
这时用户chenkuo,要用sudo执行命令验证身份时,输入的将是root口令,而不在是自己的口令,这里是由runaspw选项控制的.如下:
sudo /bin/ls -l
[sudo] password for root: 
total 0
注:这里要输入root用户的口令,而不是chenkuo用户的口令.
 
而且输入两次失败后,即退出本次验证,如下:
sudo ls -l 
[sudo] password for root: 
Sorry, try again.
[sudo] password for root: 
Sorry, try again.
sudo: 2 incorrect password attempts
注:
我们看到用户输入两次失败后即退出本次sudo操作.
 
 
 
五)sudo的命令限制
 
在使用sudo时可以对用户能够运行的命令实施限制,例如我们允许chenkuo用户执行cat 命令,但不允许他通过cat来查看/etc/shadow文件,如下:
visudo
加入如下的配置项:
chenkuo ALL=(ALL) /bin/cat *
chenkuo ALL=(ALL) !/bin/cat /etc/shadow
注:逻辑否 '!' 操作符设置不允许用户执行/bin/cat /etc/shadow命令.
 
切换到chenkuo
su - chenkuo
 
查看/etc/passwd,我们看到这是被允许的,如下:
sudo /bin/cat /etc/passwd
[sudo] password for chenkuo: 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
 
如果查看/etc/shadow,则不被允许,如下:
sudo /bin/cat /etc/shadow
[sudo] password for chenkuo: 
Sorry, user chenkuo is not allowed to execute '/bin/cat /etc/shadow' as root on localhost.localdomain.
 
 
 
六)sudo的用户口令验证
 
我们之前已经了解一些sudo口令验证的基本用法,比如,只允许用户两次输错口令,以及让普通用户验证时输入root用户的口令.
下面我们了解怎么在使用sudo时不需要输入口令,这里介绍两种方法:
 
第一种使用NOPASSWD,如下:
visudo
chenkuo ALL=(ALL) NOPASSWD:/bin/cat *
注:这里是在命令前加入NOPASSWD:
 
取消时间票据:
sudo -k 
 
再次使用sudo,发现不需要输入口令了,如下:
sudo /bin/cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
 
 
第二种是使用!authenticate
 
authenticate表示进行验证的意思,在前面加入!号,表示不需要验证,如下:
Defaults:chenkuo !authenticate
 
取消时间票据:
sudo -k 
 
再次使用sudo,发现也不需要输入口令,如下:
sudo /bin/cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
 
 
 
七)sudo与终端
 
在一些特定的环境,我们不能在终端下用sudo命令,比如crontab或者一些后台程序,如nagios等等.
 
依据上例,我们允许用户输入/bin/cat命令,所以下面我们用cat命令将passwd输出到临时文件,这个操作我们将放在crontab下执行.如下:
切换到chenkuo用户
su - chenkuo
 
编辑crontab,如下:
crontab -e
*/1 * * * * sudo /bin/cat /etc/passwd > /tmp/test
 
在1分钟后,我们看到如下的日志输出:
tail -f /var/log/sudo.log
Mar 21 07:43:01 : chenkuo : sorry, you must have a tty to run sudo ; TTY=unknown
    ; PWD=/home/chenkuo ; USER=root ; COMMAND=/bin/cat /etc/passwd
    
注:它告诉我们必须要在tty下输入命令,事实上是sudo的Defaults    requiretty配置项起的作用,所以我们注释掉它.
 
 
八、补充
今天在朋友博客上看到了其实sudo可以限制不容许执行的命令,之前我还以为这个不能做的
 
User_Alias NAVY = test,admin
NAVY    ALL=(root)      NOPASSWD: ALL NAVY    ALL=(root)      NOPASSWD: !/sbin/fdisk,!/sbin/iptables,!/bin/bash
 
这个不需要解释,大家应该都可以看懂的。