Logo Logo
GitHub Designed by Logto

什么是基于属性的访问控制 (ABAC)?

ABAC 是一种 访问控制 (Access control) 模型,使用属性来做出访问控制决策。这些属性可以包括各种因素,例如:

  • 用户属性:例如角色、部门、位置等。
  • 资源属性:例如敏感级别、所有者、类型等。
  • 环境属性:例如访问时间、位置、设备等。

通过评估这些属性并根据一组规则运行,ABAC 可以确定主体(如用户、服务)是否应该被授予访问资源的权限。这种方法允许基于上下文的细粒度访问控制和动态策略执行。

ABAC 如何工作?

ABAC 使用基于策略的方法进行访问控制。典型的 ABAC 策略包括:

  • 主体:请求访问的实体(如用户、服务、设备)。
  • 操作:资源上进行的操作(如读取、写入、删除)。
  • 资源:被访问的实体(如文件、数据库、API)。
  • 环境:请求访问的上下文(如时间、位置、设备)。
  • 属性:主体、资源和环境的属性,用于评估访问决策。
  • 策略:定义授予或拒绝访问条件的一组规则。

ABAC 策略比传统访问控制模型如 基于角色的访问控制 (Role-based access control, RBAC) 更复杂。另一方面,ABAC 在访问控制决策中提供了更大的灵活性和粒度。

ABAC 策略示例

例如,系统有几个 ABAC 策略:

  1. 策略 1:允许访问如果:

    • (主体)主体角色是 manager
    • (属性)资源敏感级别是 high
    • (环境)位置是 internal
    • (操作)任何操作。
    • (环境)时间是上午 9 点到下午 5 点(办公时间)。
  2. 策略 2:拒绝访问如果:

    • (主体)主体角色不是 manager
    • (属性)资源敏感级别是 high
    • (环境)任意位置。
    • (操作)任何操作。
    • (环境)任意时间。
  3. 策略 3:允许访问如果:

    • (主体)主体角色是 employeemanager
    • (属性)资源敏感级别是 low
    • (环境)任意位置。
    • (操作)read 操作。
    • (环境)任意时间。

策略评估引擎将按顺序检查这些策略,匹配条件的第一个策略将决定访问决策。同时,如果没有其他策略匹配,默认执行拒绝策略。

通过一些场景来理解 ABAC 如何工作:

场景 1。用户希望访问(执行 read 操作)一份高敏感级别文件(资源),但在公司办公室外(环境)。系统中存储的用户角色是 manager

决策:访问被拒绝,因为用户在办公室外(位置不是 internal)。

场景 2。用户希望在工作时间(环境)通过公司网络(位置=internal)访问(执行 read 操作)一份高敏感级别文件(资源)。用户角色是 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
访问控制策略基于角色基于属性
粒度粗粒度细粒度
灵活性有限的高度灵活
复杂性较简单更复杂
性能影响最小可能较大
访问管理角色管理策略管理
适合定义良好的权限结构动态和上下文感知的访问控制

另请参阅