Skip to content

第11篇: ABAC模型

第11篇:更精细的授权:基于属性的访问控制(ABAC)模型解析

在上一篇文章中,我们详细讲解了基于角色的访问控制(RBAC)模型,它通过将权限与角色关联,再将角色分配给用户,极大地简化了权限管理。然而,在面对日益复杂、动态变化的业务场景时,仅仅依靠预定义的角色可能显得力不从心。例如,“一个部门经理只能查看其本部门员工的绩效报告”——这个“本部门”的限制,是RBAC难以直接表达的。

为了实现更灵活、更细粒度、更动态的授权决策,基于属性的访问控制(Attribute-Based Access Control,简称ABAC) 模型应运而生。ABAC不依赖于固定的角色,而是通过评估请求中各种属性(如用户属性、资源属性、环境属性)来做出访问决策。

1. ABAC的核心概念:属性与策略

ABAC模型的核心在于“属性(Attributes)”和“策略(Policies)”。它通过定义一系列策略规则,这些规则基于主体、资源和环境的属性来决定是否允许访问。

1.1 主体属性(Subject Attributes)

定义: 描述尝试访问资源的用户或实体自身的属性。这些属性定义了“谁”在尝试访问。

示例:

  • 用户ID: user:id="alice"
  • 角色(RBAC中的角色也可以作为ABAC的一个属性): user:role="manager"
  • 部门: user:department="sales"
  • 地理位置: user:location="shanghai"
  • 雇佣类型: user:employmentType="full-time"
  • 安全级别: user:securityLevel="confidential"

1.2 资源属性(Resource Attributes)

定义: 描述用户尝试访问的资源本身的属性。这些属性定义了“什么”被访问。

示例:

  • 资源类型: resource:type="document"
  • 资源ID: resource:id="report_Q2_2024"
  • 所有者: resource:owner="alice"
  • 密级: resource:classification="top_secret"
  • 部门: resource:department="finance"
  • 创建日期: resource:createDate="2024-05-01"

1.3 环境属性(Environment Attributes)

定义: 描述访问发生时所处的上下文环境的属性。这些属性定义了“何时”、“何地”、“如何”访问。

示例:

  • 时间/日期: environment:timeOfDay="business_hours", environment:date="2024-06-30"
  • 网络位置: environment:ipAddress="192.168.1.x" (来自内部网络)
  • 设备类型: environment:deviceType="corporate_laptop"
  • 会话强度: environment:authenticationStrength="MFA_enabled"
  • 操作类型: action:type="read", action:type="write"

1.4 策略(Policy)

定义: 策略是ABAC的核心。它是一组规则,通过评估主体属性、资源属性和环境属性来做出授权决策(允许或拒绝)。策略通常以某种结构化的语言(如XACML - eXtensible Access Control Markup Language)表达。

策略结构示例:

Permit if (Subject.department == Resource.department AND Subject.role == "manager" AND Action.type == "read")

工作流程:

  1. 用户尝试执行某个操作(Action)访问某个资源(Resource)。
  2. 授权系统收集请求中主体、资源和环境的所有相关属性。
  3. 授权决策引擎根据预定义的策略评估这些属性。
  4. 如果所有策略条件都满足,则允许访问;否则,拒绝访问。

2. ABAC与RBAC的对比

ABAC和RBAC都是重要的授权模型,但它们在设计理念、灵活性和适用场景上存在显著差异。

特征 基于角色的访问控制(RBAC) 基于属性的访问控制(ABAC)
核心理念 将权限分配给角色,用户分配给角色 基于属性策略动态评估访问请求
管理粒度 粗粒度到中粒度,通过角色进行抽象 精细到极细粒度,直接操作属性,可控制到单个数据实例
灵活性/动态性 较低,角色预定义,新增或变更规则需修改角色或重新分配 极高,可根据实时上下文和属性动态决策,无需修改角色
复杂性 相对简单,易于理解和管理 较高,策略设计和属性管理可能很复杂
规则变更 变更规则可能需要调整角色定义和用户-角色分配 只需修改或添加策略规则,无需改变用户或角色结构
合规性 难以直接表达复杂的合规性规则(如职责分离) 能更精确地表达和强制复杂的合规性规则
适用场景 静态、层级明确的权限场景(如组织架构、部门职责) 动态、高变化、细粒度需求、大量用户/资源、合规性要求高的场景
可读性 通常较高,角色名称直观 策略可能较抽象,需要专业知识理解

简而言之:

  • RBAC: “你是销售经理,所以你可以查看所有销售报告。”(基于角色定义权限)
  • ABAC: “如果你是销售部门的经理,并且当前访问时间在工作日,并且你请求的是你所在销售部门的客户报告,那么你可以查看。”(基于属性动态组合权限)

3. ABAC的优势

  • 极高的灵活性和精细度: 能够应对各种复杂的授权场景,实现数据层面、操作层面甚至上下文层面的细粒度控制。
  • 动态适应性: 当业务需求、用户属性或环境发生变化时,只需修改策略,无需调整大量的角色和用户分配。这在弹性、敏捷的云计算和微服务环境中尤为重要。
  • 降低管理负担(长期): 虽然初始策略设计可能复杂,但一旦策略建立,管理大量用户和资源的权限变更会变得更加自动化和高效。
  • 更强的可表达性: 能够清晰地表达“如果A,并且B,并且C,那么允许X”这样的复杂业务规则。
  • 零信任(Zero Trust)模型的理想授权方式: ABAC的动态、上下文感知特性与零信任架构中“永不信任,始终验证”的原则高度契合。

4. ABAC的适用场景

ABAC并非万能药,其复杂性也意味着并非所有场景都适合。它最适用于以下情况:

  • 大数据和多租户环境: 需要根据数据的拥有者、敏感度、租户ID等属性进行动态隔离和访问控制。例如,医疗健康平台中,医生只能查看其负责病人的医疗记录。
  • 微服务架构: 微服务之间需要基于服务ID、API类型、请求上下文等属性进行细粒度授权。
  • 物联网(IoT)安全: 根据设备类型、位置、状态、传感器数据等属性,决定哪些用户或服务可以控制哪些设备。
  • 金融、医疗等强合规性行业: 需要强制执行复杂的合规性规则,如职责分离(SoD)、数据隔离等。
  • 动态和弹性环境: 用户数量、资源类型、业务规则频繁变化的云原生应用场景。
  • 联邦身份管理: 跨组织共享资源时,可以基于外部用户的属性进行授权。

结合RBAC: 在很多实际应用中,ABAC并非完全取代RBAC,而是作为其补充。常见的做法是:

  • RBAC处理粗粒度权限: 将大部分用户归入基于职责的角色,处理通用权限。
  • ABAC处理细粒度权限: 针对特定的高敏感资源或复杂业务逻辑,通过属性策略进行额外的过滤和控制。例如,“一个拥有‘订单查看员’角色(RBAC)的用户,只能查看他自己创建或他所在区域的订单(ABAC基于订单所有者/区域属性)”。

总结

基于属性的访问控制(ABAC)模型为我们提供了比RBAC更灵活、更精细的授权能力。它通过在运行时评估主体、资源和环境的各种属性,根据预定义的策略动态地做出访问决策。虽然其初始设计和管理复杂度较高,但在面对动态、大规模、高合规性要求以及需要细粒度控制的现代应用场景时,ABAC的优势尤为突出。