运行全新安装的 Ubuntu 服务器 16.04.1,我尝试添加一个文件来/etc/sudoers.d/
授予某个用户执行某个命令的 root 权限。
/etc/sudoers.d/servicetest
我添加了包含以下内容的文件:
servicetest ALL = (root) NOPASSWD: /bin/systemctl status *
文件/etc/sudoers
保持不变。它包含#includedir /etc/sudoers.d
最后一行。不幸的是,此设置不起作用,当以 sudo 为用户执行适当的命令时servicetest
,仍会要求我输入密码。但是,如果我将文件内容移动/etc/sudoers.d/servicetest
到末尾/etc/sudoers
,则一切都按预期工作。
此问题可能由什么原因造成?我该如何让文件正常/etc/sudoers.d/
工作?
答案1
在我的 CentOS 7 中,如果文件名称中有一个点,系统将无法识别该文件。例如:
/etc/sudoers.d/user.perms # This file doesn't work
/etc/sudoers.d/userperms # This file does
答案2
显然,出于安全原因,文件中包含的文件/etc/sudoers
必须具有 0440 权限。这样,只有 root 可以编辑该文件,只有所有者和所有者组的成员可以读取它,从而降低了该文件被用作提升权限的企图的可能性。
您可以在 上检查所包含文件的要求/etc/sudoers.d/README
,但另外两个要求是文件名不能以 (隐藏文件)开头或以(备份文件约定).
结尾。~
感谢@steeldriver 证实该理论并找到该/etc/sudoers.d/README
文件!
答案3
正如 IanC 所回答的,这个问题不是由文件权限引起的(sudo
很高兴接受由 拥有的文件root:root 0644
,我现在可以确认,尽管当然应该是root:root 0440
出于安全原因!),而是由文件末尾的换行符引起的,而换行符前面是 Windows 样式的行尾(\r\n
)。
sudo
仅接受\n
作为行尾。
答案4
我的 sudoers.d 目录似乎不起作用,所以我花了一个小时试图找出原因。在此期间,我尝试过:
- 检查文件名“sudoers.d/rpcuser”是否包含点或波浪号
- 对该文件设置完美的 0440 root 权限
- 查看所有隐藏字符并复制“rpcuser ALL=(ALL) ALL”中的制表符和空格,如原始“root ALL=(ALL) ALL”行中所示
- 每次修改后使用 rpcuser 登录和退出
- 检查它是否与用户“rpcuser”的某些操作系统保留状态有关
没有任何帮助,绝望中我看着“# includedir /etc/sudoers.d”行,发现我在“#”和“include”之间添加了额外的空格,所以这就是问题所在。