授權簡單來說就是規範哪些使用者可以做什麼
每個使用者的權限都可以被記錄在一個矩陣中
| | OS | 會計軟體 | 會計資料 | 保險資料 | 薪資資料 |
| | --- | --- | --- | --- | --- |
| Bob | rx | rx | r | --- | --- |
| Alice | rx | rx | r | rw | rw |
| Sam | rwx | rwx | r | rw | rw |
| 會計軟體 | rx | rx | rw | rw | r |
可以做的三個動作分別為x
:執行r
:讀取w
:寫入
我們可以看到Bob有權限讀取和寫入OS,但他不能碰到任何薪資資料
注意到會計軟體也算是權限劃分的主體,我們可以設計讓會計資料只能由會計軟體所寫入,讓資料更好管理
不過用以上矩陣做權限管理有一些缺點,
例如一個系統可能有成千上萬個使用者,該矩陣就會變得相當龐大,在每一次動作執行前都必須檢查此龐大的矩陣將造成系統很大負擔
因此比較合理的方法是將此矩陣切割,做成一小塊一小塊的資訊
每次動作執行只需檢查一小部分的矩陣即可
第一種切割方法是按著行來切,每一行獨自存成一筆檔案檔案記錄每個人的權限
這些檔案們被稱作ACL(access control list)
例如以上保險資料的ACL可能長這樣:
(Bob, ---), (Alice, rw), (Sam, rw), (會計軟體, rw)
這些ACL可以像便利貼一樣貼給每一項資源,一但該資源被呼叫,他就會檢查手上的便利貼以及呼叫的來源,藉此管控權限
第二種切割方式可依照列來切,每一個檔案即紀錄該名使用者能對資源的操作
這些檔案被稱作C-list(capabilities)
如Alice的C-list可能長這樣:
(OS, rx), (會計軟體, rx), (會計資料, r), (保險資料, rw), (薪資資料, rw)
相較於ACL分發給資源,這些C-list則是像票券一樣分發給使用者,讓每個使用者憑藉自己的C-list向資源呼叫
考慮以下權限矩陣
| |編譯器|機密程式|
| |---|---|
|Alice| x| -|
|編譯器|rx|rw|
這個系統中有兩項資源:編譯器、以及攸關Alice性命的機密程式
編譯器有權限讀取寫入資料,例如Alice可以呼叫編譯器並提供程式名稱,該編譯器便可以讀取該程式並輸出程式的debug資訊
如此一來,Alice如果提供編譯器機密程式的名稱,代理Alice的編譯器會不知道該依據自己的權限還是依據呼叫者的權限,因而產生混亂
使用ACL來管理會發現很難(不是辦不到)避免混亂代理人問題
C-list的話就很方便,可以設計成Alice每次呼叫編譯器都必須提供自己的C-list,此時編譯器便可依據該權限行事
也因此,依照C-list設計的系統安全性較高
不過即使C-list可以處理混亂代理人問題,實務上是ACL較廣為使用:
一來權限的設計是以保護資料為主,可以很簡單地在檔案這端新增或移除使用者
二來C-list實踐起來較複雜,ACL則比較直覺