
我試圖找到上述問題的正確原因。我的理解是:
sudo
需要讀取/etc/sudoers
只有root可讀的文件,這就是為什麼需要設定-UID rootsu
將建立一個具有不同真實有效UID的新shell,並且需要檢查密碼。要檢查密碼,需要讀取/etc/shadow
,這就是為什麼需要設定-UID root。檢查密碼後,需要呼叫setuid()
分叉進程,要使用任意 UID 參數,其父進程必須以 root 作為有效 UID,所以這也造成了另一個原因。
上述理由是否正確?
答案1
您的理由大多是正確的,但在這兩種情況(su
和sudo
)中,它們需要以 root 身分運行的基本原因是它們需要能夠更改當前進程的各種使用者和群組識別碼。這涉及到調用諸如setreuid
,只有當呼叫程序以 root 身分運行時,它才適用於任意使用者和群組。
兩者都su
具有sudo
其他功能,也需要以 root 身份運行,但與上述相比,它們實際上是次要細節。正如你所提到的,sudo
需要閱讀/etc/sudoers
;但後者只能由 root 讀取這一事實並不是硬性要求。這兩個程式都可以使用 PAM 來執行身份驗證,但它們通常還包括需要能夠讀取的回退/etc/shadow
,這也只能由 root 讀取。這樣的例子不勝枚舉。但這並不重要,因為不可避免的事實是更改使用者和/或群組的能力僅授予 root,這就是為什麼su
和sudo
是 setuid root。
sudo 的內部是如何運作的?相關問題提供了額外的背景資訊。