我們現在深入sudo
的“引擎室”,探究其內部的結構和運作機制。這就像我們從觀察行星運動,到深入研究萬有引力定律的數學表達和物理內涵一樣,是理解事物本質的關鍵一步。
sudo
的內部結構與機制詳解
sudo
的執行流程可以看作是一系列精心設計的步驟,確保了授權的準確性和安全性。以下是其核心內部機制的分解:
階段一:初始化與參數解析
-
執行入口 (
main
函數):- 當你在命令行鍵入
sudo <command>
并回車后,操作系統加載并執行/usr/bin/sudo
程序。 sudo
的main()
函數開始執行。
- 當你在命令行鍵入
-
SetUID 生效:
- 由于
sudo
文件具有 SetUID root 權限,此時sudo
進程的 有效用戶ID (EUID) 變成了root
(UID 0)。其實際用戶ID (RUID) 仍然是你當前登錄用戶的ID。 - 這意味著
sudo
進程現在擁有了root
權限,可以訪問受保護的系統資源,比如讀取/etc/sudoers
文件。
- 由于
-
命令行參數解析:
sudo
解析你傳遞給它的命令行選項(如-u
,-i
,-l
,-E
等)和要執行的命令及其參數。
-
加載配置文件 (
sudo.conf
):sudo
讀取其主配置文件,通常是/etc/sudo.conf
(或編譯時指定的路徑)。- 這個文件定義了
sudo
的一些全局行為,比如要加載哪些插件(策略插件、I/O插件等)、調試級別、askpass程序的路徑等。 - 插件加載:如果
sudo.conf
中配置了插件,sudo
會使用dlopen()
(或類似機制)動態加載這些共享庫 (.so
文件),并調用它們的初始化函數。
階段二:策略檢查與授權 (核心階段)
這是 sudo
最核心的部分,由策略插件 (Policy Plugin) 主導。默認的策略插件是 sudoers.so
,它負責解析 /e