/etc/sudoers 设置用户具有一般 sudo 使用权限,仅执行一个命令时无需密码提示

/etc/sudoers 设置用户具有一般 sudo 使用权限,仅执行一个命令时无需密码提示

我在 /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:全部

相关内容