我试图了解 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 进程交互?如果以上是错误的,即使有一点我也很想知道我错在哪里。