存取控制模型(access-control model)
系統一旦知道你是誰,就必須決定你可以做什麼——而做這個決定不只一種哲學。想想三種不同的建築。在一間合租公寓裡,誰擁有某個房間就由誰決定還能讓誰進去(擁有者的裁量)。在一座軍事基地裡,一個中央權威在人身上蓋上安全等級、在文件上蓋上機密分類,而沒有任何個人能推翻「持祕密等級者不得讀絕密檔案」這條規則。在一家醫院裡,你能存取什麼取決於你的職稱——任何值班醫師都能讀病歷、任何護理師都能更新生命徵象——無關你個人是誰。這三種哲學就是存取控制模型:自由裁量、強制、角色。
自由裁量存取控制(DAC)讓資源的擁有者依自己的裁量決定誰能存取。一般的 Unix 與 Windows 檔案權限就是 DAC:你擁有自己的檔案、你選擇分享它們,隨你喜好授予或撤銷權限。它靈活又直覺,但它的弱點正是那份裁量——一個粗心或被騙的擁有者會外洩資料,而且你一旦授予讀取權,幾乎沒什麼能阻止接收者把檔案再複製出去。強制存取控制(MAC)把決定權從擁有者手中拿走:一套由管理員設定的全系統政策,依標籤(安全等級與機密分類)治理所有存取,連擁有者都不能放寬它。MAC 強制像「不准向上讀、不准向下寫」這樣的規則,以阻止資訊從高機密流向低機密;它較僵硬、較難管理,但對內部人與被騙的擁有者強得多。角色存取控制(RBAC)把權限指派給角色(像會計或管理員),再把使用者指派給角色,於是你管理的是「為數不多、可掌握的幾個角色」,而非「每個人各自的權限」——這是大型組織的主流模型,因為它能擴展、又契合真實工作的組織方式。
這些模型並非互斥——真實系統會層層併用,而正確的選擇取決於威脅。DAC 適合個人機器,那裡看重方便、擁有者也受信任。MAC 適合高保證的場合(軍方,以及用 SELinux 或 AppArmor 加固的系統),那裡你必須連「被攻陷的特權行程」都加以圍堵。RBAC 適合規模與管理。誠實的提醒是:DAC 的靈活也正是它的危險:因為擁有者能自由把權限傳遞下去,DAC 本身無法阻止機密資料最終洩漏給某個未授權者,而這恰恰是 MAC 被發明來補上的缺口。
在純 Linux(DAC)上,Alice 執行 chmod 644 report,可以把讀取權交給她喜歡的任何人。加上 SELinux(MAC),政策便能禁止網頁伺服器行程「在任何情況下」讀取使用者的家目錄——即便它以 root 執行、即便 Alice 的權限本會允許。系統政策凌駕擁有者之上。
DAC 聽擁有者的;MAC 的系統政策連擁有者都能凌駕。
DAC 的靈活也是它的極限:因為擁有者能自由傳遞權限,單靠 DAC 無法阻止機密資料最終流到某個未授權者手中——正是這個「流動控制」的缺口,才有了 MAC 的存在。