我试图了解 sudo 在 Linux 用户空间和 Linux 内核中的工作原理。从用户的角度来看,我对它不太感兴趣,但我更感兴趣的是从实现/内核的角度来理解它。 (我一直在争论将它放在 stackexchange 还是 super 用户上,但我认为这里是最好的。如果我做出了错误的选择,请随意移动它...)
因此,当内核完成启动时,它会启动 init 进程,当然它的 uid 为 0。然后这可能会启动其他进程,例如 ssh 守护进程。这个新进程继承了其父进程的 uid,例如0. sshd 现在还启动子进程,每个连接一个。然后对尝试登录的用户进行身份验证,无论是通过 passwd 文件、影子文件、pam 等。一旦 sshd 通过它使用的任何方法对用户进行了身份验证,它就会调用 setuid/seteuid 来更改进程uid。现在我的理解是一个程序只能从 root 转到另一个用户,而不是从用户 x 到 root 或用户 x 到用户 y(正确吗?)(使用 setuid 调用?)
因此在这方面,内核实际上只知道分配给文件、进程等的 uid。用户帐户的身份验证在用户空间中控制,并且通过只允许根程序进入非根程序来确保安全程序。
所以我的问题是,如果以上内容正确,sudo 是如何工作的。当前运行我的非 root 帐户的终端如何临时切换到 root 权限?它是否与 sudo 进程交互?如果以上是错误的,即使有一点我也很想知道我错在哪里。
最佳答案
如果您查看 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”和所有者,您就会明白我的意思。
关于linux - 了解 setuid 和 sudo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15400418/