存取矩陣(access matrix)
假設你想完整且精確地寫下:在一個系統裡,誰被允許對所有東西做什麼。最直接的辦法是一張大表。側邊列出行動者——也就是各個保護域。頂端列出他們可能作用的東西——各個物件(檔案、裝置,甚至其他域)。每個格子裡寫下這個行動者對那個物件被允許的操作。這張表就是存取矩陣:把系統中所有權限一次呈現的抽象而完整的圖像。
每一列是一個保護域;每一行是一個物件;格子(列 D,行 O)裝著域 D 對物件 O 所擁有的權限集合——像讀、寫、執行或擁有者這樣的項目。若某格為空,代表該域對那物件完全沒有存取權。這矩陣甚至能描述它自己的「管理」:像擁有者或複製這類特殊權限可放進格子裡,讓一個域去授予或撤銷另一個域的存取;而一個域也能同時以「行」的身分出現,好讓「切換進它」的權限被記錄下來。所以矩陣不只記錄大家可以做什麼,也記錄誰可以更改這些權限。
存取矩陣主要是一個思考工具,而非真實的資料結構,因為對任何稍具規模的系統,它都會龐大且幾乎全空——大多數域只對少數幾個物件擁有權限。所以真實系統從不儲存完整矩陣;它們以兩種自然方式之一稀疏地儲存。沿著「行」切,你就在每個物件旁存下「誰可以碰它」的清單——這就是存取控制清單。沿著「列」切,你就給每個域一份「它可以碰哪些物件」的清單,做成不可偽造的權杖——那些就是能力(capability)。理解這個矩陣,正是讓這兩種編碼豁然開朗的鑰匙,因為每一種都只是同一張概念表的壓縮視角。
一張迷你矩陣:列為 D1、D2;行為檔案 F、印表機 P。格(D1, F)= 讀、寫;(D1, P)= 空;(D2, F)= 讀;(D2, P)= 列印。沿 F 那一行往下讀,得到 F 的存取控制清單({D1: 讀,寫}, {D2: 讀});沿 D2 那一列橫著讀,得到 D2 的能力(讀 F、列印 P)。
各行變成 ACL;各列變成能力清單——同一矩陣的兩種視角。
沒有人會直接實作完整矩陣——它幾乎全是零。它的價值在於概念:它展示了 ACL(以物件為單位)與能力(以域為單位)只是同一組權限的兩種稀疏編碼。