我在 /etc/sudo 中有一个条目,其中包含可以对所有命令执行 sudo 的用户。
fred 全部=(全部:全部) 全部
根据文档,最后的 ALL 负责允许访问所有命令。
我希望 fred 能够在 Ubuntu 14.04 上执行 nginx 重启,而无需提供 sudo 密码,同时仍保留调用 sudo 执行其他命令的能力。sudoers文档不清楚,但我相信
fred ALL=(全部) NOPASSWD: /usr/sbin/service
只允许 fred 运行一个命令。我想让 fred 能够通过 sudo 以 root 身份运行所有命令,除了 /usr/sbin/service 之外的所有命令都需要密码。
查看文档的 BNF
User_Spec ::= User_List Host_List '=' Cmnd_Spec_List (':' Host_List '=' Cmnd_Spec_List)*
Cmnd_Spec_List ::= Cmnd_Spec | Cmnd_Spec ',' Cmnd_Spec_List
Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Solaris_Priv_Spec? Tag_Spec* Cmnd
Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
Tag_Spec ::= ('EXEC:' |
'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' |
'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' |
'NOPASSWD:' | 'SETENV:' | 'NOSETENV:')
看来我可以使用多个 Cmnd_Spec_Lists,因此
fred ALL=(全部:全部) 全部,NOPASSWD: /usr/sbin/service
但是文档并没有说后者 NOPASSWD:Cmnd_Spec 将覆盖仅该命令的所有命令根访问权限。
这是我喜欢第一次就做好的事情,有人能确认最后一行对于手头的特定目的是否有效(或者,换句话说,它不起作用)吗?
此外,如果允许 fred 在没有 sudo 密码的情况下运行服务,有没有办法可以限制服务的参数,这样 fred 只能在服务 nginx 上无需密码即可工作,或者更好的是,这样 fred 只能在没有密码的情况下重新启动该服务器?
谢谢。
答案1
配置底部的命令会覆盖上面的命令。文档中提到了https://www.sudo.ws/man/1.8.15/sudoers.man.html#SUDOERS_FILE_FORMAT它不是从最具体到最不具体的,除非你按照那种方式排列它们。
我使用多行来实现这一点。当事情变得更加复杂时,多行和多条规则会更容易阅读和理解。多行可以帮助您设置顺序。
# I don't know what order this is interpreted in:
fred ALL=(ALL : ALL) ALL, NOPASSWD: /usr/sbin/service
# I do know what order this is interpreted in:
fred ALL=(ALL) ALL
fred ALL=(ALL) NOPASSWD: /usr/sbin/service
以下几行来自我的 sudoers 文件。允许组成员wheel
运行所有命令,然后REBOOT
在没有密码的情况下专门运行别名中的命令。
Cmnd_Alias REBOOT = /sbin/halt, /sbin/reboot, \
/sbin/poweroff, /sbin/shutdown
%wheel ALL=(ALL) ALL
%wheel ALL=(ALL) NOPASSWD: REBOOT
不幸的是,我没有太多公开的文档可以给你参考。sudoers 手册页太荒谬了。不久前我读了一本关于它的好书(易读)(掌握须藤作者:Michael W. Lucas),这个例子在我多个 Linux 和 BSD 机器上都可以运行。
答案2
你好,这个可以尝试以 root 身份登录并按照以下命令操作 $ 在 sudoers 文件中附加以下几行
fred ALL=(全部)NOPASSWD:全部