我试图了解sudo如何在Linux用户区和Linux内核中运行。从用户的角度来看,我对它并不是那么感兴趣,但我更感兴趣的是从实现/内核的角度来理解它。 (我已经讨论过将它放在stackexchange和超级用户之间,但我认为这将是最好的。如果我选择错误,请随意移动它。)
因此,当内核完成启动时,它会启动init进程,该进程当然具有0的uid。然后可以启动其他进程,例如ssh守护进程。这个新进程继承了其父进程的uid,例如0. sshd现在也启动子进程,每个连接一个。然后完成对尝试登录的用户的身份验证,无论是通过passwd文件,影子文件,pam等。一旦sshd通过它使用的任何方法对用户进行了身份验证,它就会调用setuid / seteuid来更改进程UID。现在我的理解是一个程序只能从root到另一个用户而不是从用户x到root或者用户x到用户y(这是正确的吗?)(使用setuid调用?)
因此,在这方面,内核实际上只知道分配给文件,进程等的uid。用户帐户中的身份验证在userland中受到控制,并且只允许root程序进入非root用户程序
所以我的问题是,如果以上是正确的,那么sudo是如何工作的。当前运行我的非root帐户的终端如何临时切换到root权限?它是否与sudo进程交互?如果以上是错误的,即便一点我也想知道我错在哪里。
答案 0 :(得分:8)
如果您查看sudo二进制文件,您将看到它在可执行文件上设置了setuid权限位。这向内核指示应该始终使用可执行文件的所有者的uid执行,如果是sudo,则为root。一旦sudo以root身份运行,它就可以在fork / exec之前进行必要的身份验证和setuid-syscall。
---s--x--x. 2 root root 219272 Jul 17 2012 /usr/bin/sudo
如果你注意到'和主人你会明白我的意思。