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