Sudo

sudo 的內部如何工作?

  • November 15, 2016

內部如何sudo運作?它怎麼可能在沒有root密碼的情況下成為root,不像su?該過程涉及哪些系統呼叫等?這不是 Linux 中的一個巨大的安全漏洞嗎(例如,為什麼我不能編譯一個sudo只執行正常操作sudo但不詢問非特權使用者密碼的重度更新檔程序)?

我已閱讀login 和 su internals。我還閱讀了 sudo 打算如何使用?su但儘管有標題,但它們主要處理和之間的差異sudo

如果你看一下執行檔sudo

$ which sudo
/usr/bin/sudo
$ ls -la /usr/bin/sudo
---s--x--x 2 root root 208808 Jun  3  2011 /usr/bin/sudo

您會注意到它帶有權限位---s--x--x。這些可以分解如下:

-|--s|--x|--x
-      - first dash denotes if a directory or a file ("d" = dir, "-" = file)  
--s    - only the setuid bit is enabled for user who owns file
--x    - only the group execute bit is enabled
--x    - only the other execute bit is enabled

因此,當一個程序啟用了它的 setuid 位(也稱為 SUID)時,這意味著當有人執行該程序時,它將使用擁有該文件的使用者的憑據執行,也就是。在這種情況下是根。

例子

如果我以使用者 saml 身份執行以下命令:

$ whoami
saml

$ sudo su -
[sudo] password for saml: 

您會注意到,sudo實際的執行是以 root 身份執行的:

$ ps -eaf|grep sudo
root     20399  2353  0 05:07 pts/13   00:00:00 sudo su -

setuid 機制

如果您對 SUID 的工作原理感到好奇,請查看man setuid. 這是手冊頁的摘錄,它比我能更好地解釋它:

setuid() 設置呼叫程序的有效使用者 ID。如果呼叫者的有效UID是root,那麼真實的UID和保存的set-user-ID也會被設置。在 Linux 下,setuid() 的實現類似於具有 _POSIX_SAVED_IDS 功能的 POSIX 版本。這允許 set-user-ID(root 除外)程序放棄其所有使用者權限,執行一些非特權工作,然後以安全方式重新使用原始有效使用者 ID。

如果使用者是 root 或程序是 set-user-ID-root,則必須特別小心。setuid() 函式檢查呼叫者的有效使用者 ID,如果它是超級使用者,則所有與程序相關的使用者 ID 都設置為 uid。發生這種情況後,程序就不可能重新獲得 root 權限。

這裡的關鍵概念是程序有一個真實的使用者標識(UID)和一個有效的使用者標識(EUID)。當此位啟用時,Setuid 正在設置有效使用者 ID (EUID)。

因此,從核心的角度來看,在我們的範例中,saml它仍然是原始所有者 (UID),但 EUID 已與執行檔的所有者一起設置。

設置標識

我還應該提到,當我們分解 sudo 命令的權限時,第二組位用於組權限。組位也有類似於 setuid 的東西,稱為 set group id(又名 setgid,SGID)。這與 SUID 的作用相同,只是它使用組憑據而不是所有者憑據執行程序。

參考

引用自:https://unix.stackexchange.com/questions/80344