了解setuid和sudo

6
我正在尝试理解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进程交互?如果上述内容有误,即使只有一点,我也想知道我错在哪里。

1个回答

9

如果你查看sudo二进制文件,你会发现它的setuid权限位被设置在可执行文件上。这告诉内核它应该始终以可执行文件所有者的UID运行,对于sudo来说,这是root。一旦sudo作为root运行,它就可以进行必要的身份验证和一个setuid-syscall,在fork/exec之前。

---s--x--x. 2 root root 219272 Jul 17  2012 /usr/bin/sudo

如果您注意到's'和所有者,您就会明白我的意思。

1
谢谢,那很清楚了。现在我的其他说法正确吗?特别是你只能从root到非root执行setuid,而不能从x到y执行?还是说只有当X>Y时才能执行setuid等等? - David Mokon Bond
3
一般而言是可以的;但是,特权进程能够放弃其特权,并使用setuid来恢复它们的特权,这使得情况变得更加复杂。一般规则是,如果您需要这样做,则需要仔细阅读系统文档。 - Recurse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接