我有一个具体的问题,引发了一些一般性问题。
具体问题:
我有一个 sudoers 规则应用于一组受到一定限制的用户。有问题的规则是%pusers ALL=(ALL) NOPASSWD: /bin/vi /etc/httpd/conf/*
.用户想要 cd /etc/httpd/conf
然后sudo vi httpd.conf
(或sudo vi ./httpd.conf
)。目前 sudoers 不允许这样做,但它将允许针对绝对路径运行 vi:sudo vi /etc/httpd/conf/httpd.conf
。我假设在 sudo 检查是否允许之前相对路径没有被转换为完整路径,但我不知道确切的原因或如何解决这个问题。
我专门使用 RHEL7,尚未在其他 *nix 系统上对此进行测试,但我希望看到类似的行为。
一般问题:
- sudo 如何处理传递给它的相对路径执行侧面,就像上面的例子一样? (不是相对命令路径,而是命令执行的相对路径。)
- 在根据 sudoers 规则检查命令时,如何让 sudo 识别/转换命令的相对执行路径?
答案1
为常规用户提供对诸如或 之sudo
类的编辑器的访问权限是有风险的。vi
vim
请参阅此问题以获得深入的解释。
使用现代版本的sudo
,您可以在您的 中指定sudoers
:
%pusers ALL=(ALL) sudoedit /etc/httpd/conf/*
然后,您的用户可以使用 VISUAL 或 EDITOR 环境变量(像往常一样)指定他们选择的编辑器,然后使用
$ sudoedit /etc/httpd/conf/httpd.conf
或者
$ cd /etc/httpd/conf
$ sudoedit httpd.conf
也可以使用sudoedit
,来代替。sudo -e
现代 sudo 识别sudoedit
为内置命令sudo
,当您使用它时,sudo
理解参数应该是要编辑的文件的路径名(仅),然后可以处理相对路径名。
在一般情况下(= 不使用关键字时sudoedit
),sudo
不会假定知道有关命令参数的任何信息,因此如果您在文件中指定具有特定参数的命令sudoers
,则只能进行“哑”字符串匹配。
严格来说,您实际上甚至不需要sudo
授予对 Apache 配置文件的访问权限。 Apache并不特别关心配置文件的权限是什么,只要Apache本身可以读取它们即可(如果Apache使用<1024的端口,它通常以root身份启动,因此读取文件不是问题)。因此,既然您已经有了一个小组,您可以这样做:
chgrp -R pusers /etc/httpd/conf
chmod g+rws /etc/httpd/conf
chmod g+rw /etc/httpd/conf/*
RHEL7 甚至默认使用“用户组”系统,因此您的用户值umask
应该已经是 002 或 007。如果这是真的,那么您只需这些简单的一次性设置即可为您的用户授予对 Apache 配置文件的写入权限。您的用户甚至可以在配置目录中创建新文件,他们将自动获得正确的组所有权和权限。
实际上,在这个方案中,最有可能意外搞乱配置文件权限的方法是以 root 身份向其中添加新文件:root 用户通常具有没有组写入位的 umask(传统上是 022 或更严格的 077),根权限setgid
也可以胜过目录的权限。
您可能需要学习一些新习惯,但在这种情况下,忘记“您必须是 root 才能配置 Apache”实际上可能是一件好事。 (如果您认为sudo
提供更多审计跟踪,那么请真正考虑将配置文件放在 Git 或其他版本控制系统下。)