什麼是基於屬性的存取控制 (ABAC)?
ABAC 是一種 存取控制 (Access control) 模型,使用屬性來做出存取控制決策。這些屬性可以包括多種因素,例如:
- 用戶屬性:如角色、部門、所在地等。
- 資源屬性:如敏感性級別、所有者、類型等。
- 環境屬性:如存取時間、地點、設備等。
通過評估這些屬性並通過一組規則運行它們,ABAC 可以確定主體(例如,用戶、服務)是否應該被授予對資源的存取權限。這種方法允許基於上下文的細粒度存取控制和動態策略執行。
ABAC 如何運作?
ABAC 使用一種基於策略的存取控制方法。一個典型的 ABAC 策略包括:
- Subject: 請求存取的實體(例如,使用者、服務、設備)。
- Action: 在資源上執行的操作(例如,讀取、寫入、刪除)。
- Resource: 被存取的實體(例如,檔案、資料庫、API)。
- Environment: 請求存取的上下文(例如,時間、地點、設備)。
- Attributes: 主體、資源和環境的屬性,用於評估以做出存取決策。
- Policies: 一組定義授予或拒絕存取的條件的規則。
ABAC 策略比傳統的存取控制模型如 基於角色的存取控制 (Role-based access control, RBAC) 更為複雜。另一方面,ABAC 在存取控制決策中提供了更多的靈活性和細緻性。
ABAC 策略的例子
例如,一個系統有幾個 ABAC 策略:
-
策略 1: 允許存取,如果:
- (Subject) 主體角色是
manager
。 - (Attribute) 資源敏感性級別是
high
。 - (Environment) 地點是
internal
。 - (Action) 任何操作。
- (Environment) 時間是在 9 AM 到 5 PM(辦公時間)之間。
- (Subject) 主體角色是
-
策略 2: 拒絕存取,如果:
- (Subject) 主體角色不是
manager
。 - (Attribute) 資源敏感性級別是
high
。 - (Environment) 任何地點。
- (Action) 任何操作。
- (Environment) 任何時間。
- (Subject) 主體角色不是
-
策略 3: 允許存取,如果:
- (Subject) 主體角色是
employee
或manager
。 - (Attribute) 資源敏感性級別是
low
。 - (Environment) 任何地點。
- (Action)
read
操作。 - (Environment) 任何時間。
- (Subject) 主體角色是
策略評估引擎將按順序檢查這些策略,並且第一個滿足條件的策略將決定存取決策。同時,若沒有其他策略匹配,則強制執行默認拒絕策略。
讓我們通過一些情景來理解 ABAC 如何運作:
情景 1. 一個用戶想要存取(執行
read
操作)一份高敏感性級別的文件(資源),處於辦公室外(環境)。用戶在系統中被標記為manager
角色。
決策: 存取被拒絕,因為用戶處於辦公室外(地點不是 internal
)。
情景 2. 一個用戶想要存取(執行
read
操作)一份高敏感性級別的文件(資源),在辦公時間(環境)內辦公網絡上(地點=internal
)。用戶擁有manager
角色。
決策: 存取被允許,因為策略 1 的所有條件都滿足。
情景 3. 圖 2 的所有條件都相同,但用戶的角色是
employee
而不是manager
。
決策: 存取被拒絕,因為用戶的角色不滿足策略 1 的條件。
情景 4. 用戶想要存取(執行
read
操作)一份低敏感性級別的文件(資源)。用戶擁有employee
角色。
決策: 存取被允許,因為策略 3 的所有條件都滿足。
情景 5. 用戶想要刪除(執行
delete
操作)一份低敏感性級別的文件(資源)。用戶擁有employee
角色。
決策: 存取被拒絕,因為沒有允許對低敏感性級別文件進行 delete
操作的策略。
你可能會注意到並非在每個策略中都需要所有屬性。這種靈活性允許更具動態性和上下文認知的存取控制機制。
可擴展訪問控制標記語言 (XACML)
XACML 是一種基於 XML 的訪問控制策略標準。雖然它並未定義特定的訪問控制模型,但 XACML 常用於實現 ABAC 策略。讓我們來看一個非規範的例子,展示如何使用 XACML 表示前面例子中的 ABAC 策略:
<PolicySet PolicySetId="ABAC_Policies" PolicyCombiningAlgId="urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-overrides">
<Description>ABAC Policies</Description>
<Policy PolicyId="Policy1" RuleCombiningAlgId="urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides">
<Description>Employees can read data</Description>
<Target>
<AnyOf>
<AllOf>
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">read</AttributeValue>
<AttributeDesignator
AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id"
Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="true"
/>
</Match>
</AllOf>
</AnyOf>
</Target>
<Rule RuleId="Rule1" Effect="Permit">
<Target>
<AnyOf>
<AllOf>
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">employee</AttributeValue>
<AttributeDesignator
AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id"
Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="true"
/>
</Match>
</AllOf>
</AnyOf>
</Target>
</Rule>
<Rule RuleId="Rule2" Effect="Deny">
<Target>
<AnyOf>
<AllOf>
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">user</AttributeValue>
<AttributeDesignator
AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id"
Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="true"
/>
</Match>
</AllOf>
</AnyOf>
</Target>
</Rule>
</Policy>
<!-- ...other policies... -->
</PolicySet>
有關 XACML 的更多資訊,請參閱 可擴展存取控制標記語言 (XACML) 。
實施考量
雖然 ABAC 提供了一種強大的方式來管理存取控制,但它也伴隨著一些實施考量:
- 系統複雜度:隨著屬性和規則數量的增加,ABAC 策略可能變得復雜。正確的策略管理和測試比簡單的存取控制模型更耗時。
- 性能:評估複雜的 ABAC 策略可能影響系統性能。緩存和優化技術可以幫助緩解這個問題。
- 策略衝突:衝突的策略可能導致不可預測的存取決策。定期的策略審查和衝突解決應該是策略管理過程的一部分。
ABAC 與 RBAC 的比較
比較 ABAC 和 基於角色的存取控制 (Role-based access control, RBAC) 可以幫助你理解這兩種模型之間的差異:
RBAC | ABAC | |
---|---|---|
存取控制策略 | 基於角色 | 基於屬性 |
粒度 | 粗粒度 | 細粒度 |
靈活性 | 有限 | 高度靈活 |
複雜度 | 簡單 | 更複雜 |
性能影響 | 最小 | 可能顯著 |
存取管理 | 角色管理 | 策略管理 |
最適合 | 定義良好的權限結構 | 動態且上下文感知的存取控制 |