上次,我询问了这些的风险(在/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
?
答案1
如果您升级系统,对文件所做的更改将/etc/sudoers.d
保留不变。这可以防止系统升级时用户被锁定。Ubuntu 倾向于喜欢这种行为。其他发行版也使用这种布局。
根据我的经验,此目录中的文件规则比 更宽松/etc/sudoers
。其中包括:
- 文件中的错误不会导致
sudo
失败。但是,该文件被忽略了。 - 权限规则似乎不那么严格。它允许适用的组或其他人读取文件。我不相信这在 中是可能的
/etc/sudoers
。必须将写入权限限制为 以root
维护安全性。当前 Ubuntu 版本的 sudo 允许组或其他人读取权限。(此功能允许使用 sudo 访问进行审核,而无需 root 访问权限。)
该visudo
命令仅默认为/etc/sudoers
。它将编辑和验证您使用选项指定的任何文件-f
。我使用此功能来编辑将自动安装为/etc/sudoers
或 的文件/etc/sudoders.d
。但是,可能找不到其他文件的定义。最好使文件独立。
拥有独立文件的能力使应用程序能够sudo
在安装时启用功能并在卸载时删除它们变得简单。自动配置工具也可以使用此功能。
我已使用此功能来隔离授予特定系统上特定用户组访问权限所需的更改。
答案2
是的,您可以使用它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。
总之:
句法:和
visudo
visudo -f
执行相同的语法检查。权限/所有权: 作为添加的功能协助管理大型系统,在 下编辑的文件
visudo -f
不会检查所有权或权限:这允许离线或作为修订控制系统的一部分对文件进行语法检查。
为什么要使用/etc/sudoers.d/
通常/etc/sudoers
由发行版的软件包管理器控制。如果您对该文件进行了更改,并且软件包管理器想要升级它,则您必须手动检查更改并批准如何将它们合并到新版本中。通过将本地更改放入目录中的文件中/etc/sudoers.d/
,您可以避免此手动步骤,并且升级可以自动进行。
什么时候sudo
忽略文件/etc/sudoers
?
如果您的/etc/sudoers
文件包含以下行:
#includedir /etc/sudoers.d
然后sudo
将读取目录中的文件/etc/sudoers.d
。
例外情况包括:
- 名称以 结尾的文件
~
- 名称包含
.
字符的文件
这样做的目的是(a)方便包管理器,以及(b)这样就可以忽略编辑器的备份文件。
重要的: 请注意,上面的例外 2 非常普遍,意味着看似合理的文件名(如mysudo.conf
或)mysudo.txt
将被忽略,因为.
名称中包含。
答案3
为什么我们有 /etc/sudoers.d?
因为对于自动化工具(例如 Chef 或 Puppet)来说,将单个文件放入此目录比对其进行更改/etc/sudoers
(这可能很脆弱)更容易。
中的文件/etc/sudoers.d
(实际上)是串联的。您将在 中看到此模式的其他几个实例/etc
,例如/etc/cron.d
和/etc/logrotate.d
。
答案4
只是对任何一般答案的一个简短补充...其他答案都没有解决我的问题,那就是顺序很重要。
如果您的行在 sudoers 中有效但在 sudoers.d 中无效,请尝试移动 #include,或更改 sudoers.d 文件的顺序(通过在前面添加数字)。似乎最具体的内容应该放在文件中的第一个。
我有类似的事情:
somebody ALL=(ALL): somecommand
somebody ALL=(someoneelse) NOPASSWD: somecommand
第二个没有效果,因为第一个已经匹配。NOPASSWD 不是一个条件,而是修改操作的某种方式。
而且由于 sudoers.d 目录的存在,它不在单个文件中,因此并不明显。