我正在尝试理解sudo在Linux用户空间和Linux内核中的工作原理。我对它的用户视角不太感兴趣,但我更想了解它的实现/内核视角。(我在考虑将此放在stackexchange vs superuser上,但我认为这里是最好的地方。如果我做出了错误的选择,请随意移动...)
因此,当内核完成引导后,它会启动init进程,该进程具有0的uid。然后,它可能会启动其他进程,例如ssh守护程序。此新进程继承其父进程的uid,例如0。sshd现在还启动子进程,每个连接一个。然后进行尝试登录用户的身份验证,无论是通过passwd文件、shadow文件、pam等方式。一旦sshd通过其使用的任何方法验证了用户,它就会调用setuid/seteuid来更改进程的uid。那么我的理解是,一个程序只能从root转到另一个用户,而不能从用户x转到root或用户x转到用户y(使用setuid调用是否正确?)
因此,在这方面,内核实际上只知道分配给文件、进程等的uid。对用户帐户的身份验证由用户空间控制,并通过仅允许根程序降级为非根程序来保护安全。
那么我的问题是,如果上述内容正确,sudo如何工作?我的终端当前正在运行我的非根帐户,如何临时切换到root权限?它是否与sudo进程交互?如果上述内容有误,即使只有一点,我也想知道我错在哪里。