Linux - 为什么 su 和 sudo 二进制文件需要设置 UID 根?

Jak*_*ake 1 setuid su sudo

我正在努力为上述问题找到正确的原因。我的理解是:

  • sudo需要读取/etc/sudoers只有root才能读取的文件,这就是为什么它需要设置-UID root
  • su将要创建一个具有不同真实有效 UID 的新 shell,并且需要检查密码。要检查密码,它需要读取/etc/shadow,这就是为什么它需要设置-UID root。检查密码后,它需要调用setuid()分叉进程,并且要使用任意UID参数,其父进程必须具有root作为有效UID,因此这也是另一个原因。

以上理由是否正确?

Ste*_*itt 6

您的理由大部分是正确的,但在这两种情况下 (susudo),他们需要以 root 身份运行的基本原因是他们需要能够更改当前进程的各种用户和组标识符。这涉及调用诸如 之类的函数setreuid,如果调用进程以 root 身份运行,则这些函数仅适用于任意用户和组。

二者susudo具有其它特征也要求运行的根,但相对于上述的时候都有效次级细节。正如你提到的,sudo需要阅读/etc/sudoers;但后者只能由 root 读取这一事实并不是硬性要求。这两个程序都可以使用 PAM 来执行身份验证,但它们通常还包括需要能够读取的回退/etc/shadow,这也只能由 root 读取。名单还在继续;但它并不重要,因为摆在眼前的事实是,有能力改变用户和/或组只给根,这就是为什么susudo是setuid root的。

sudo 的内部结构如何工作?和相关问题提供了额外的背景。