为什么系统有/etc/sudoers.d?我应该如何编辑?


48

上次,我问了这些风险(在/ etc / sudoers中):

    user_name ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf
    %group_name ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

在考虑此问题时,我找到了/etc/sudoers.d目录。目录中的文件应该具有与/ etc / sudoers类似的功能(这意味着即使在/etc/sudoers.d中,上面的脚本仍然有问题),但是有一篇文章说我们不应该使用目录,因为我们不能使用它visudo来编辑目录中的文件。它。也就是说,sudo如果我们在目录中输入错误,我们将失去使用权。

如果是这样,为什么我们有/etc/sudoers.d?还是我们有一种在/etc/sudoers.d中编辑文件的好方法?

Answers:


45

/etc/sudoers.d如果升级系统,则对文件所做的更改将保留在原位。当系统升级时,这可以防止用户锁定。Ubuntu倾向于喜欢这种行为。其他发行版也使用此布局。

根据我的经验,此目录中文件的规则比宽松/etc/sudoers。其中包括:

  • 文件中的错误没有导致sudo失败。但是,该文件被忽略。
  • 权限规则似乎不太严格。它允许适用的组或其他人读取文件。我认为不可能做到/etc/sudoers。必须限制写权限root以维护安全性。当前Ubuntu版本的sudo允许组或其他用户具有读取权限。(此功能允许对sudo访问进行审核,而无需root访问。)

visudo命令仅默认为/etc/sudoers。它将编辑并验证您使用该-f选项指定的任何文件。我使用此功能来编辑将作为/etc/sudoers或自动安装的文件/etc/sudoders.d。但是,可能找不到其他文件的定义。最好使文件独立。

具有独立文件的功能使应用程序可以轻松启用sudo安装功能,并在卸载时将其删除。自动配置工具也可以使用此功能。

我已经使用此功能来隔离为授予对特定系统上的特定用户组访问权限所需的更改。


1
您提到的sudoers.d的两个特征似乎非常重要且很有帮助。谢谢!
2015年

请参阅我的回答和警告,以了解为什么这些实际上不是sudoers.d的特征。
dragon788 '16

1
强烈不同意“文件中的错误没有导致sudo失败”的声明。我在/etc/sudoers.d中的文件中使用不正确的语法破坏了RHEL上的sudo。这花费了大量的精力进行纠正,我认为建议应始终使用visudo -f编辑这些文件的方式。
79E09796

@ 79E09796我损坏了/etc/sudoers.d中的文件,而没有引起其他文件中规则的问题。YMMV。如果您破坏了使您进入系统的sudo配置,则会遇到问题。如果您有权重新启动系统,则重新启动进入恢复模式并修复文件相对容易。我同意最好的做法是使用visodo编辑或至少验证对sudo配置文件的更改。
BillThor

62

是的,您可以visudo用来编辑这些文件。您所要做的就是使用该-f选项指定要编辑的文件的名称。例如:

visudo -f /etc/sudoers.d/somefilename

或者,如果需要:

sudo visudo -f /etc/sudoers.d/somefilename

文献资料

来自man visudo

-f sudoers
指定和替代sudoers文件的位置。使用此选项,visudo将编辑(或检查)您选择的sudoers文件,而不是默认的/ etc / sudoers。所使用的锁定文件是指定的sudoers文件,后缀“ .tmp”。仅在仅检查方式下,-f的参数可以为“-”,指示将从标准输入中读取sudoers。

综上所述:

  1. 语法:无论visudovisudo -f 执行相同的语法检查

  2. 权限/所有权: 作为一项辅助大型系统管理的新增功能,visudo -f不会检查在其下编辑的文件的所有权或权限:这允许脱机或作为修订控制系统的一部分对文件进行语法检查。

为什么使用 /etc/sudoers.d/

通常/etc/sudoers在发行版的程序包管理器的控制下。如果您对该文件进行了更改,并且程序包管理器要对其进行升级,则必须手动检查更改并批准如何将其合并到新版本中。通过将本地更改放入/etc/sudoers.d/目录中的文件中,可以避免此手动步骤,并且升级可以自动进行。

什么时候sudo忽略文件/etc/sudoers

如果您的/etc/sudoers文件包含以下行:

#includedir /etc/sudoers.d

然后sudo将读取目录中的文件/etc/sudoers.d

例外情况是:

  1. 名称以结尾的文件 ~
  2. 名称包含.字符的文件

这样做(a)是为了方便程序包管理器,也是(b)这样做是为了忽略来自编辑器的备份文件。


谢谢,但我有一个疑问。是否visudo -f安全?
2015年

5
是的,就visudo -f像平常一样,以安全的方式进行编辑visudo。这就是为什么我们拥有visudo它以及为什么它提供了-f选择。
John1024

关于使用时如何忽略权限的重要说明,-f因为这可能会使某人字节化,然后将其复制到/etc/sudoers.d/中,而无需仔细检查它们。
dragon788 '16

1
谢谢您的例外部分。我给文件起了一个类似的名字/etc/sudoers.d/mysudorules.sudo,并且终生无法理解,为什么在阅读答案之前不应用内部规则。
Zaroth

1
感谢您提及例外情况。我的文件/sudoers.d/mysite.co.uk不在工作,重命名后mysite可以工作!:)
J86

20

为什么我们有/etc/sudoers.d?

因为自动化工具(例如Chef或Puppet)更容易将单个文件拖放到此目录中,而不是对进行更改/etc/sudoers,因为这可能很脆弱。

其中的文件/etc/sudoers.d(实际上)是连接在一起的。您还将在中看到此模式的其他几个实例/etc,例如/etc/cron.d/etc/logrotate.d


我不知道还有其他类似的目录。谢谢。
aob

14

使用visudo -f某些答案中提到的另一个好处是,有一个相应的选项,-c或者--check可以验证您在sudoers.d文件或您可能想要放入sudoers.d中的任何其他文件中没有无效信息。在使用自动化工具提到的情况下,这非常方便,因为您可以运行例如

sudo visudo -c -q -f /home/myuser/mysudoers && \
sudo chmod 600 /home/myuser/mysudoers && \
sudo cp /home/myuser/mysudoers /etc/sudoers.d/mysudoers

这将以静默方式检查文件(由于-q而没有输出),并且只有在不返回错误(退出1表示无效的sudoers文件)的情况下,才会将文件复制到sudoers.d中,这样您就可以创建文件并无需第一次修改就可以对其进行处理(使用sudo visudo -f /etc/sudoers.d/myfile必须成功,否则,如果您不对其进行修复,则会丢弃该内容)。

同样,从其他答案中对这些陈述要谨慎

根据我的经验,此目录中文件的规则比/ etc / sudoers宽松。其中包括:

文件中的错误并没有导致sudo失败。但是,该文件被忽略。权限规则似乎不太严格。我允许适用的组读取文件。我不相信使用/ etc / sudo可以实现。

/etc/sudoers.d中的文件必须遵循与/ etc / sudoers相同的语法,因为如果有多个相同的条目,系统会简单地将所有文件与“ wining”中的最后一个文件连接在一起单数设置。

如果/etc/sudoers.d/中的文件的权限极其错误(可写世界),那么它们将被忽略,这可能是导致无效文件被忽略的原因,否则您可以sudo通过使用无效的sudoers 来严重破坏命令。 d文件具有正确的权限。

您可以允许sudoers文件在世界范围内读取,如果不小心允许'other'写入权限,则需要以其他用户身份或从root终端运行sudo时,请运行此命令。如果文件由root:root以外的其他人拥有,这也会中断。

sudo chmod 644 /etc/sudoers.d/mysudoers
sudo chown root:root /etc/sudoers.d/mysudoers

我刚刚确认,如果我运行,chmod o+w /etc/sudoers.d/vagrant我就不能再以无业游民的身份使用sudo,它提示我输入密码,然后失败。

当我sudo -l以另一个有效的sudo用户身份运行以查看应用的命令权限时,我还收到有关文件权限的警告。这是我用来确认“无用”用户丢失sudo的同一命令,当我向o+w具有该用户sudo权限的文件应用权限时,该用户丢失了sudo 。


3

只是所有一般答案的简短补充...其他答案都无法解决我的问题,因为顺序很重要。

如果您的行在sudoers中起作用,但在sudoers.d中不起作用,请尝试移动#include或更改sudoers.d文件的顺序(以数字开头)。似乎最具体的内容应该放在文件的第一位。

我有类似的东西:

somebody ALL=(ALL): somecommand
somebody ALL=(someoneelse) NOPASSWD: somecommand

第二个没有效果,因为第一个已经匹配。NOPASSWD不是条件,而是某种修改操作的方式。

由于sudoers.d目录,它不是位于单个文件中,因此并不明显。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.