Logo Logo
GitHub Designed by Logto

什麼是基於屬性的存取控制 (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. 策略 1: 允許存取,如果:

    • (Subject) 主體角色是 manager
    • (Attribute) 資源敏感性級別是 high
    • (Environment) 地點是 internal
    • (Action) 任何操作。
    • (Environment) 時間是在 9 AM 到 5 PM(辦公時間)之間。
  2. 策略 2: 拒絕存取,如果:

    • (Subject) 主體角色不是 manager
    • (Attribute) 資源敏感性級別是 high
    • (Environment) 任何地點。
    • (Action) 任何操作。
    • (Environment) 任何時間。
  3. 策略 3: 允許存取,如果:

    • (Subject) 主體角色是 employeemanager
    • (Attribute) 資源敏感性級別是 low
    • (Environment) 任何地點。
    • (Action) read 操作。
    • (Environment) 任何時間。

策略評估引擎將按順序檢查這些策略,並且第一個滿足條件的策略將決定存取決策。同時,若沒有其他策略匹配,則強制執行默認拒絕策略。

讓我們通過一些情景來理解 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) 可以幫助你理解這兩種模型之間的差異:

RBACABAC
存取控制策略基於角色基於屬性
粒度粗粒度細粒度
靈活性有限高度靈活
複雜度簡單更複雜
性能影響最小可能顯著
存取管理角色管理策略管理
最適合定義良好的權限結構動態且上下文感知的存取控制

另見