我试图找到上述问题的正确原因。我的理解是:
sudo
需要读取/etc/sudoers
只有root可读的文件,这就是为什么需要设置-UID rootsu
将创建一个具有不同真实有效UID的新shell,并且需要检查密码。要检查密码,需要读取/etc/shadow
,这就是为什么需要设置-UID root。检查密码后,需要调用setuid()
分叉进程,并且要使用任意 UID 参数,其父进程必须以 root 作为有效 UID,所以这也产生了另一个原因。
上述理由是否正确?
答案1
您的理由大多是正确的,但在这两种情况(su
和sudo
)中,它们需要以 root 身份运行的基本原因是它们需要能够更改当前进程的各种用户和组标识符。这涉及到调用诸如setreuid
,仅当调用进程以 root 身份运行时,它才适用于任意用户和组。
两者都su
具有sudo
其他功能,也需要以 root 身份运行,但与上述相比,它们实际上是次要细节。正如你提到的,sudo
需要阅读/etc/sudoers
;但后者只能由 root 读取这一事实并不是硬性要求。这两个程序都可以使用 PAM 来执行身份验证,但它们通常还包括需要能够读取的回退/etc/shadow
,这也只能由 root 读取。这样的例子不胜枚举。但这并不重要,因为不可避免的事实是更改用户和/或组的能力仅授予 root,这就是为什么su
和sudo
是 setuid root。
sudo 的内部是如何工作的?相关问题提供了额外的背景信息。