存取控制 清單
訪問控制清單 (ACL) 是操作系統所建立的存取控制專案清單,用來控制與某種特定 (protected) 物件相關聯的安全性行為。 在 Windows 中,ACL 有兩種類型:
任意 ACL 是描述受保護物件訪問許可權的零個或多個 ACE 清單。 這是自由裁量權,因為授與的存取權是擁有者或任何具有適當許可權的使用者。
系統 ACL 是一份零個或多個 ACE 的清單,可描述受保護物件的稽核和警示原則。
「自由裁量權」一詞是指強制控制與任意控制之間的差異。 在使用強制控件的環境中,對象的擁有者可能無法授與物件的存取權。 在 Windows 等任意環境中,允許對象擁有者授與這類存取權。 強制控制通常與緊密的安全性環境相關聯,例如使用分隔式安全性的控件,其中系統必須防止在相同系統上的用戶之間洩漏敏感性資訊。
建構 ACL 的驅動程式會遵循幾個重要步驟:
配置 ACL 的記憶體。
初始化 ACL。
將零 (或更多) ACL 新增至 ACL。
下列程式代碼範例示範如何建構 ACL:
dacl = ExAllocatePool(PagedPool, PAGE_SIZE);
if (!dacl) {
return;
}
status = RtlCreateAcl(dacl, PAGE_SIZE, ACL_REVISION);
if (!NT_SUCCESS(status)) {
ExFreePool(dacl);
return;
}
先前的代碼段會建立空的 ACL。 程式代碼範例會配置大量的記憶體,因為我們不知道 ACL 所需的大小。
此時,ACL 是空的,因為它沒有 ACE 專案。 空的 ACL 會拒絕任何嘗試存取物件的存取權,因為沒有授與這類存取權的專案。 下列代碼段會將 ACE 新增至此 ACL:
status = RtlAddAccessAllowedAce(dacl, ACL_REVISION, FILE_ALL_ACCESS, SeExports->SeWorldSid);
if (!NT_SUCCESS(status)) {
ExFreePool(dacl);
return;
}
新增的 ACE 會將存取權授與存取物件的任何實體,這是世界存取 SID (SeWorldSid) 的目的。 此 SID 通常表示為其他 Windows 系統公用程式中的「所有人」存取權。
建構 ACL 時,請務必在 ACL 開頭放置拒絕存取的 ACE 專案,並在 ACL 結尾存取允許的 ACE 專案。 這個順序很重要。 否則,如果安全性參考監視器在評估 ACL 時發現存取允許的 ACE,在存取遭拒絕的 ACE 之前,就會授與存取權。 此行為記載於 Microsoft Windows SDK 中,但與安全性參考監視器用來判斷應授與或拒絕存取的特定機制有關。