保護與安全

保護域(protection domain)

想像一家醫院,員工配戴顏色編碼的識別證。戴藍證時你可以進病房和藥局,但不能進機房;換成紅證,打開的就是另一組門。識別證不改變你是誰——它改變的是你「此刻被允許做的那一束事」。保護域對執行中的程式而言,正是這樣一張識別證:它是某一時刻生效的存取權集合,精確界定該程式碼可以碰哪些物件、以及怎麼碰。

更仔細地說,保護域是一組(物件,權限)配對的集合。每一對指名一項資源——一個檔案、一塊記憶體區域、一個裝置——以及它上面被允許的操作,例如讀、寫或執行。在任何一瞬間,一個行程都在恰好一個域裡執行,且只能做它當前所在的域所授予的操作。關鍵在於,行程並非永遠被焊死在單一個域上:它可以切換域。經典例子是設了 setuid 位元的 Unix 程式——執行期間,它在「程式擁有者」的域中執行,而非啟動它的使用者的域,因而暫時取得(並被限制於)另一組權限。雙模式的「使用者對核心」之分,本身就是一個粗糙的兩域方案:使用者模式是一個域,核心模式是另一個權限大得多的域。

為什麼用這種方式來框定保護?因為「域」的概念乾淨地把「我此刻是誰」與「我可以做什麼」這兩個問題分開,並讓同一段程式碼在不同時候以不同的權限運作。存取矩陣、能力(capability)與存取控制清單都建立在這個基礎上——它們只是「記錄並強制每個域擁有哪些(物件,權限)配對」的不同辦法。誠實的微妙之處是:切換域本身就是一項有特權、危險的操作;如果行程能自由跳進更有權力的域,整個保護方案就會崩潰,所以「變換域」的規則必須和域內的權限一樣被嚴格執行。

Unix 的 passwd 程式由 root 擁有,且設了 setuid 位元。當一般使用者執行它來改密碼時,該行程在 root 的域中執行,因而能寫入受保護的密碼檔——但只能透過 passwd 自己仔細撰寫、且本身限定於這一件任務的程式碼。

setuid 讓行程為了一件有界的任務,在另一個主體的域中執行。

保護域關乎程式碼「當前的權限」,而非直接等同使用者身分——同一個使用者可在不同時刻處於不同的域,同一個域也可被不同使用者進入。

又称
domain of protection保護領域