我的文件中有以下内容sudoers.d/nginx
:
deployer ALL=NOPASSWD: /etc/init.d/nginx reload
如果我以 sudo 身份运行命令,则此方法有效:
$ sudo /etc/init.d/nginx start
[sudo] password for deployer:
Sorry, user deployer is not allowed to execute '/etc/init.d/nginx start' as root on graduation.
但是,当我运行命令时非 sudo,似乎 sudoers 已通过。该命令仍然不起作用,但这是因为其他所有权错误,而不是 sudoers 中的限制:
$ /etc/init.d/nginx start
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
2012/12/30 20:59:49 [warn] 30054#0: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:12
2012/12/30 20:59:49 [emerg] 30054#0: open() "/var/log/nginx/access.log" failed (13: Permission denied)
这是预期的行为吗?如果是,为什么会发生这种情况?我希望sudoers
在运行命令之前进行验证。sudoers 规则是否仅适用于以 身份运行的命令sudo
?(考虑到其名称,这很有意义)。
如果是这样,是否有其他方法可以限制对命令的常规访问而不使用sudo
?
基本上我希望我的部署者用户只需做两件事:
- 拥有自己的主目录
/var/www
- 能够执行
/etc/init.d/nginx reload
所有其他事情都应该禁止(理想情况下,甚至在主目录之外进行 cd 操作)
答案1
这是预期的行为,仅当您运行 sudo 时才会查阅 sudoers 文件,因此它会拒绝用户访问该命令并向您提供相关的错误消息。
当用户尝试直接运行命令时,sudo 不会参与,因此您会收到由于用户缺乏权限而导致各个命令失败所产生的错误消息。
如果你想限制用户只能进行一项活动,那么你可以允许他们通过 ssh 登录,然后将他们的钥匙绑定到单个命令通过使用
command="/usr/bin/sudo /etc/init.d/nginx reload" ssh-rsa AAAAB3NzaC1...
使用此配置,当用户登录时将执行重新加载并将其注销。
如果稍后你决定需要用户执行其他操作,那么你可以延伸这个想法。