簡體   English   中英

了解setuid和sudo

[英]Understanding setuid and 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'和所有者,您將看到我的意思。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM