/etc/sudoers.d/ 中的文件无法识别

/etc/sudoers.d/ 中的文件无法识别

运行全新安装的 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 目录似乎不起作用,所以我花了一个小时试图找出原因。在此期间,我尝试过:

  1. 检查文件名“sudoers.d/rpcuser”是否包含点或波浪号
  2. 对该文件设置完美的 0440 root 权限
  3. 查看所有隐藏字符并复制“rpcuser ALL=(ALL) ALL”中的制表符和空格,如原始“root ALL=(ALL) ALL”行中所示
  4. 每次修改后使用 rpcuser 登录和退出
  5. 检查它是否与用户“rpcuser”的某些操作系统保留状态有关

没有任何帮助,绝望中我看着“# includedir /etc/sudoers.d”行,发现我在“#”和“include”之间添加了额外的空格,所以这就是问题所在。

相关内容