跳到主要內容

Access Control List 完全解析:透過 ACE 規則集實作自主存取控制的核心機制

Access Control List 完全解析

透過 ACE 規則集實作自主存取控制的核心機制

在現代資訊系統中,誰能存取什麼資源、能做什麼操作,是資安設計的根本問題。無論是作業系統的檔案權限、雲端儲存的存取策略,還是網路設備的封包過濾,背後都仰賴一套清晰的授權機制來運作。Access Control List(ACL,存取控制清單)正是解決這個問題最廣泛採用的技術之一,它以結構化、可審計的方式,精確地定義資源與使用者之間的權限關係。

本文將從 ACL 的核心概念出發,逐步拆解其組成單元 ACE 的結構,並透過實際範例說明如何在系統中正確實作 ACL,協助開發者與系統架構師建立穩固的存取控制基礎。

什麼是 Access Control List?核心概念解析

Access Control List(ACL)是一份附加於特定資源上的規則集合,用來描述哪些主體(Subject)對該資源擁有哪些操作權限。這裡所說的「資源」可以是檔案、目錄、資料庫表格、網路介面,甚至是 API 端點;而「主體」則通常指使用者帳號或群組。ACL 是實作自主存取控制(Discretionary Access Control,DAC)的核心機制,資源的擁有者可以自主決定並管理該資源的存取規則。

與角色型存取控制(RBAC)不同,ACL 以資源為中心來描述權限,而非以角色為中心。這讓 ACL 在需要細粒度(Fine-grained)控制的場景下非常有彈性,例如:同一個目錄下的不同檔案,可以對相同的使用者設定截然不同的存取規則。理解這個以資源為錨點的設計哲學,是掌握 ACL 的第一步。

📌 ACL 與 DAC 的關係

  • DAC(自主存取控制):一種存取控制模型,允許資源擁有者自行決定存取政策
  • ACL:實作 DAC 模型最常見的技術手段,將權限規則直接繫結在資源物件上
  • 兩者關係:DAC 是「概念模型」,ACL 是「具體實作」

ACE:構成 ACL 的最小單元

ACL 並非一個單一的黑箱,它由一筆筆獨立的規則項目所組成,每一筆稱為 ACE(Access Control Entry,存取控制項目)。一條 ACE 精確描述了「特定主體特定資源特定操作是被允許(Allow)還是拒絕(Deny)」,是整個存取控制體系中不可再分割的最小語義單元。

一條完整的 ACE 通常包含四個核心欄位:主體識別(Principal)權限類型(Permission)操作類型(Action),以及效果(Effect:Allow / Deny)。當系統收到存取請求時,會依序掃描資源上的 ACL,比對請求者身份與請求操作,直到找到第一筆匹配的 ACE 為止,這個過程稱為順序比對(Sequential Evaluation)

值得特別注意的是,ACE 的排列順序(Order)至關重要。大多數系統遵循「Deny 優先」或「First-match 原則」,若規則排列不當,可能導致預期外的權限開放或封鎖。以 Windows NTFS 為例,Deny ACE 會被系統自動排在 Allow ACE 之前以確保安全性。


/* ACE 結構示意(虛擬碼) */

ACE {
  principal : "user:alice"          // 主體:使用者 alice
  action    : ["read", "write"]     // 允許的操作
  effect    : "Allow"               // 效果:允許
  resource  : "/project/report.pdf" // 資源路徑
}

ACE {
  principal : "group:interns"       // 主體:實習生群組
  action    : ["delete"]            // 操作:刪除
  effect    : "Deny"                // 效果:拒絕
  resource  : "/project/*"          // 適用所有 project 下的資源
}

ACL 的實際應用場景與實作範例

ACL 的應用場景橫跨多個技術領域。在 Linux 檔案系統中,傳統的 rwx 權限模型只能對擁有者、群組與其他人三類主體設定權限,而 POSIX ACL 則允許針對特定使用者或群組追加細粒度規則。在雲端平台(如 AWS S3、GCP Cloud Storage)中,ACL 以 JSON/XML 格式附加在儲存桶或物件上,精細控制跨帳號存取。在網路設備(如 Cisco Router)上,ACL 則用來過濾進出介面的 IP 封包。

以下以 Linux POSIX ACL 為例,示範如何使用 setfaclgetfacl 指令操作 ACE 規則,實現比傳統 chmod 更細膩的存取控制:


# 為特定使用者 alice 新增對 report.pdf 的讀取權限(ACE)
$ setfacl -m u:alice:r-- /var/project/report.pdf

# 為群組 interns 拒絕寫入與執行權限
$ setfacl -m g:interns:r-- /var/project/report.pdf

# 查看目前資源上的完整 ACL(所有 ACE 列表)
$ getfacl /var/project/report.pdf

# 輸出結果示意:
# file: var/project/report.pdf
# owner: bob
# group: devteam
# user::rw-          <-- 擁有者 bob:讀寫
# user:alice:r--     <-- ACE:alice 僅可讀
# group::r--         <-- 群組 devteam:僅可讀
# group:interns:r--  <-- ACE:interns 僅可讀
# mask::r--
# other::---         <-- 其他人:無任何權限

從上述範例可以清楚看到,ACL 將多筆 ACE 組織成一個有序清單,系統在驗證存取時會逐一比對,最終決定是否授權。這種明確、可審計、細粒度的設計,正是 ACL 在安全敏感系統中被廣泛採用的原因。

ACL 設計最佳實踐

正確設計 ACL 不僅是技術問題,更是安全策略問題。最小權限原則(Principle of Least Privilege)是 ACL 設計的黃金準則:每個主體只應被授予完成任務所需的最低限度權限,任何超出必要範圍的 Allow ACE 都是潛在的風險面。此外,應優先對群組而非個別使用者設定 ACE,以降低管理複雜度並避免規則爆炸問題。

在規則排序上,務必將明確的 Deny 規則置於 Allow 規則之前,以防止因順序問題造成的安全漏洞。同時,應定期執行 ACL 稽核(Audit),移除不再需要的 ACE,尤其是在人員異動後。最後,避免使用過於寬泛的萬用字元(如 `*:Allow:*`),每條 ACE 應精確指向特定資源與特定操作。

✅ ACL 設計最佳實踐清單

  • 最小權限原則:只授予完成任務所需的最低限度權限
  • Deny 優先排序:拒絕規則應置於允許規則之前,防止順序漏洞
  • 以群組為單位:盡量對群組設定 ACE,減少個人規則數量
  • 定期稽核清理:人員異動後立即移除對應 ACE,避免殭屍權限
  • 精確描述資源範圍:避免使用過於寬泛的萬用字元
  • 記錄與版本控管:將 ACL 配置納入 Infrastructure as Code 管理

重點整理

💡 Access Control List 核心概念總覽

  • ACL(存取控制清單):附加於資源上的規則集合,是實作 DAC

留言