什么是基于属性的访问控制 (ABAC)?
ABAC 是一种 访问控制 (Access control) 模型,使用属性来做出访问控制决策。这些属性可以包括各种因素,例如:
- 用户属性:例如角色、部门、位置等。
- 资源属性:例如敏感级别、所有者、类型等。
- 环境属性:例如访问时间、位置、设备等。
通过评估这些属性并根据一组规则运行,ABAC 可以确定主体(如用户、服务)是否应该被授予访问资源的权限。这种方法允许基于上下文的细粒度访问控制和动态策略执行。
ABAC 如何工作?
ABAC 使用基于策略的方法进行访问控制。典型的 ABAC 策略包括:
- 主体:请求访问的实体(如用户、服务、设备)。
- 操作:资源上进行的操作(如读取、写入、删除)。
- 资源:被访问的实体(如文件、数据库、API)。
- 环境:请求访问的上下文(如时间、位置、设备)。
- 属性:主体、资源和环境的属性,用于评估访问决策。
- 策略:定义授予或拒绝访问条件的一组规则。
ABAC 策略比传统访问控制模型如 基于角色的访问控制 (Role-based access control, RBAC) 更复杂。另一方面,ABAC 在访问控制决策中提供了更大的灵活性和粒度。
ABAC 策略示例
例如,系统有几个 ABAC 策略:
-
策略 1:允许访问如果:
- (主体)主体角色是
manager
。 - (属性)资源敏感级别是
high
。 - (环境)位置是
internal
。 - (操作)任何操作。
- (环境)时间是上午 9 点到下午 5 点(办公时间)。
- (主体)主体角色是
-
策略 2:拒绝访问如果:
- (主体)主体角色不是
manager
。 - (属性)资源敏感级别是
high
。 - (环境)任意位置。
- (操作)任何操作。
- (环境)任意时间。
- (主体)主体角色不是
-
策略 3:允许访问如果:
- (主体)主体角色是
employee
或manager
。 - (属性)资源敏感级别是
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) 可以帮助你理解这两种模型之间的差异:
RBAC | ABAC | |
---|---|---|
访问控制策略 | 基于角色 | 基于属性 |
粒度 | 粗粒度 | 细粒度 |
灵活性 | 有限的 | 高度灵活 |
复杂性 | 较简单 | 更复杂 |
性能影响 | 最小 | 可能较大 |
访问管理 | 角色管理 | 策略管理 |
适合 | 定义良好的权限结构 | 动态和上下文感知的访问控制 |