linux – 了解setuid和sudo
我试图了解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进程交互?如果以上是错误的,即使是一点点,我也想知道我错在哪里. 解决方法
如果您查看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’和所有者,您将看到我的意思. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |