linux - 了解 setuid 和 sudo

标签 linux linux-kernel sudo pam

我试图了解 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/

相关文章:

linux - bash:循环中的 grep 不 grep

linux - 关于之前的 'condition variable' 帖子

bash - sudo和chpasswd在一行上

python - 打开串行端口或使用 pyserial 从串行端口读取时遇到问题

ruby - 我的 linux 终端中的 rvm 出现错误

linux - 使用 e1000e 网络驱动程序而不是 tg3

debugging - Linux内核实时调试是如何完成的,使用了哪些工具?

linux - Gnome,显示身份验证对话框

package - 为 Varnish 代理安装 rst2man 失败 [修复]

ruby - 在多个文件(大数据)上搜索和替换正则表达式