2013-03-14 91 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