6

我试图了解 sudo 在 Linux 用户空间和 Linux 内核中的工作原理。从用户的角度来看,我对它不太感兴趣,但我更感兴趣的是从实现/内核的角度来理解它。(我已经讨论过将它放在 stackexchange 和超级用户上,但我认为这里是最好的。如果我做出错误的选择,请随意移动它......)

因此,当内核完成启动时,它会启动 init 进程,该进程的 uid 为 0。这可能会启动其他进程,例如 ssh 守护进程。这个新进程继承其父进程的 uid,例如 0。sshd 现在还启动子进程,每个连接一个。然后对尝试登录的用户进行身份验证,无论是通过 passwd 文件、影子文件、pam 等。一旦 sshd 通过它使用的任何方法对用户进行身份验证,它就会调用 setuid/seteuid 来更改进程uid。现在我的理解是一个程序只能从 root 到另一个用户,而不是从用户 x 到 root 或用户 x 到用户 y(对吗?)(使用 setuid 调用?)

因此,在这方面,内核实际上只知道分配给文件、进程等的 uid。对用户帐户的身份验证是在用户空间中控制的,并且只允许 root 程序放入非 root 程序中来保证安全。

所以我的问题是,如果上述内容正确,sudo 是如何工作的。我当前正在运行我的非 root 帐户的终端如何临时切换到 root 权限?它是否与 sudo 进程交互?如果以上是错误的,即使有一点我也很想知道我错在哪里。

4

1 回答 1

9

如果您查看 sudo 二进制文件,您会看到它在可执行文件上设置了 setuid 权限位。这向内核表明它应该始终使用可执行文件所有者的 uid 执行,在 sudo 是 root 的情况下。一旦 sudo 以 root 身份运行,它就可以在 fork/exec 之前进行必要的身份验证和 setuid-syscall。

---s--x--x. 2 root root 219272 Jul 17  2012 /usr/bin/sudo

如果您注意“s”和所有者,您就会明白我的意思。

于 2013-03-14T03:09:28.557 回答