2013-03-14 92 views
3

我想了解sudo如何在Linux用户空间和Linux内核中工作。从用户的角度来看,我没有那么感兴趣,但我更感兴趣的是从实现/内核的角度来理解它。 (我曾经讨论过把这个放在stackexchange和超级用户上,但我认为这里是最好的,如果我做出了错误的选择,请随意移动它)了解setuid和sudo

所以当内核完成启动后,启动init进程当然具有0.的uid。然后可以启动其他进程,如ssh守护进程。这个新进程继承其父代的uid,例如现在sshd也启动子进程,每个连接一个。然后完成用户尝试登录的身份验证,无论是通过passwd文件,shadow文件,pam等。一旦sshd通过使用哪种方法对用户进行身份验证,它会调用setuid/seteuid来更改进程UID。现在我的理解是程序只能从根到另一个用户,而不是从用户x到根或用户x到用户y(是否正确?)(用setuid调用?)

因此,在这方面,内核真正只知道分配给文件,进程等的uid。通过只允许根程序放入非根程序,对用户帐户的身份验证进行控制,并保护其安全。

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

+0

阅读http://advancedlinuxprogramming.com/ – 2013-03-14 06:18:21

回答

7

如果您看一下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'和所有者,你会明白我的意思。

+1

谢谢,这非常有道理。现在我所说的其他陈述是正确的吗?特别是你可以只做setuid从根到非根,永远不会从x到y?或者,如果X> Y等,你只能做setuid吗? – 2013-03-14 03:12:09

+3

一般来说是的;然而,特权进程放弃其特权并使用setuid恢复特权的能力使其变得复杂。作为一般规则,如果您需要这样做,那么您需要仔细阅读系统文档。 – Recurse 2013-03-14 04:08:37