![使用sudo,是否可以使用目标用户不在的目标组来执行程序?](https://linux22.com/image/201465/%E4%BD%BF%E7%94%A8sudo%EF%BC%8C%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%E7%9B%AE%E6%A0%87%E7%94%A8%E6%88%B7%E4%B8%8D%E5%9C%A8%E7%9A%84%E7%9B%AE%E6%A0%87%E7%BB%84%E6%9D%A5%E6%89%A7%E8%A1%8C%E7%A8%8B%E5%BA%8F%EF%BC%9F.png)
请考虑采用标准安装和配置的 Linux 系统sudo
;即root
可以以其他用户的身份执行所有命令,请考虑以下命令:
sudo -u user1 -g group1 some_program
当然,我希望some_program
用 EUID 执行user1
和与 EGID group1
。然而,我经过惨痛的教训才知道,只有当实际上是;user1
的成员时,这才有效。group1
我真的应该man sudo
更深入地研究一下。从命令行选项的解释来看-g
:
[...] 只要未使用 -P 选项,sudoers 策略就允许通过 -g 选项指定任何目标用户组。
这是非常不方便的。我经常用于sudo
测试目的,特别是当服务或程序在任意 UID 和 GID 下运行时,相应的用户不是相应组的成员。在这种情况下,在使用 进行测试之前sudo
,我必须使相应的用户成为相应组的成员,并且一定不要忘记在测试完成后恢复该操作。
因此问题是:是否有一个设置或配置允许root
使用sudo
任意 UID 和 GID 执行程序哪些不匹配?我只对提供通用机制的解决方案感兴趣所有程序、UID 和 GID。也就是说,将特定程序、UID 或 GID 的列表放入其中/etc/sudoers
不是一个选项。
一种可能的解决方案可能是替代政策提供者,以sudo
实现这一点。然而,学习如何安装和配置它可能会非常困难,而且我不确定我是否会采取这条路线,即使没有其他解决方案。而且,到目前为止我还没有发现这样的事情。
更新1 (2022-01-27)
相关系统运行 Debian buster,在撰写本文时已更新了所有可用补丁。 SELinux 是不是安装。这是我的/etc/sudoers
文件(省略仅有的注释和空行):
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
root ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL
ipupdate ALL = (root) NOPASSWD: /root/scripts/asterisk-external-ip
我目前认为最后一行与问题无关,我可能应该删除它以尽量减少干扰。另一方面,我了解到有时只是看似不重要的“为了清晰起见而删除”的部分实际上导致了相应的错误。
答案1
在不同的目标组中执行程序是该-g
选项的全部要点。并且-u
与结合没有任何限制-g
。
只要未使用 -P 选项,sudoers 策略就允许通过 -g 选项指定任何目标用户组。
没有解释清楚,但这句话指的是 sudo 让你开箱即用的功能,这不是使用 sudo 的意义。 Sudo 很有用额外的文件中的策略sudoers
,这些策略可以允许任意组的用户和组。
Root 没有获得任何特殊权限。如果您可以sudo -u user1
以 root 或“sudoer”用户身份运行,那是因为 sudoers 文件中有一条规则允许这样做。由于某种原因(也许是因为维护者从来没有想过更新它),在示例sudoers
文件中,这条规则是
root ALL = (ALL) ALL
%wheel ALL = (ALL) ALL
这只允许使用sudo -u
,而不允许使用sudo -g
,但有限地使用-g
来指定用户已经属于的组中的主要组。要允许提升组权限以及用户权限,请将这些规则(或系统上的任何等效项,例如使用%admin
或%sudo
等binarus
)更改为
root ALL = (ALL:ALL) ALL
%wheel ALL = (ALL:ALL) ALL
这是某些发行版的默认设置,例如 Debian。