了解setuid和sudo

Dav*_*ond 6 linux sudo pam linux-kernel

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

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

因此,在这方面,内核实际上只知道分配给文件,进程等的uid.用户帐户中的身份验证在用户空间中受到控制,并且通过仅允许根程序进入非根程序来保护.

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

Rec*_*rse 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
Run Code Online (Sandbox Code Playgroud)

如果您注意到's'和所有者,您将看到我的意思.

  • 一般是的; 但是,特权进程放弃权限然后使用setuid恢复它们的能力使它变得复杂.作为一般规则,如果您需要这样做,那么您需要仔细阅读系统的文档. (3认同)