為什麼我們需要 SUID 權限?
請閱讀這篇長篇介紹以了解我對為什麼我們需要可執行二進製文件的 SUID 權限的擔憂。
- Linux 中的程序使用其 EUID 來了解自身的有效使用者 ID。
- 此使用者的權限用於決定此程序如何與其他文件互動(例如,此程序是否可以寫入文件)
考慮通過更改密碼的場景
/usr/bin/passwd
現實生活中的 Linux
- 密碼儲存在
/etc/shadow
. 此文件root
擁有權限 (rw-------
)- 如果
$passwd
有權限rwx--x--x
,這意味著只有root才能改變passwd程序的邏輯。userA
執行程序時,一個程序passwd
以RUID = EUID = userA開始結果是:程序將執行。
passwd
程序已啟動,但無法更改密碼,因為其EUID為userA且userA無法寫入/etc/shadow
.這是需要 SUID 權限的時候。SUID允許在執行二進製文件以創建該程序時設置程序的EUID 。****EUID將設置為該二進製文件的所有者。
- 為所有者設置SUID 權限
/usr/bin/passwd
使任何使用者啟動的任何程序的****EUID都採用EUIDpasswd
root
- 由於
root
可以寫入/etc/shadow
,任何使用者都可以使用該passwd
程序啟動一個可以更改的passwd
程序/etc/shadow
有SUID 權限,因為在 Linux 中,程序的EUID不會硬設置為可執行二進製文件的所有者(執行時將創建該程序)
我理想中的 Linux
無需SUID 權限。如果執行檔binA由userA創建(並擁有) ,則任何可以執行binA的使用者都將創建一個EUID = userA的程序。
在修改密碼的場景下,這個構想的邏輯如下:
- root是所有者,
/usr/bin/passwd
只有root可以更改其邏輯。- 裡面的邏輯
/usr/bin/passwd
只允許使用者更改其密碼,而不能更改其他人的密碼。- 其他使用者不能修改
/usr/bin/passwd
,只有root可以。/etc/shadow
只能由root
結果是:非特權使用者
userA
可以執行$passwd
. 他會創建一個passwd
流程。此程序具有EUID = root,因此它可以寫入shadow
文件。有了這個理論,我們可以實現:每個人都可以在沒有SUID 權限的情況下更改自己的密碼(並且只能更改自己的密碼)。
您的兩個範例都說明了 setuid 的工作原理。但是,在您的“理想 Linux”中,每個執行檔都以執行檔所有者的 EUID 開頭,這將使您系統上的每個執行檔都成為 setuid 執行檔。
這顯然會導致很多問題,僅舉幾例:
setuid()
如果程序不應該具有任何額外權限,則每個 root 擁有的執行檔都需要進行 UID 檢查並呼叫將程序的 EUID 設置回非 root;使用者不能將執行檔提供給其他使用者,因為該程序會以錯誤的 EUID 執行;配置錯誤和不良做法會產生嚴重後果(例如chmod 777
現在還允許訪問使用者擁有的任何文件)。這些還有更多。沒有 setuid 二進製文件的正常權限需要一些其他機制來允許非特權使用者執行特權操作。Setuid 二進製文件允許這樣的特權提升和訪問控制在程序邏輯中實現。