3、权限模型基础:RBAC模型介绍、ABAC模型介绍、ReBAC模型介绍、权限模型选型原则

在构建平台工程的 CI/CD 服务目录时,权限模型是决定安全性与可维护性的核心架构决策。不同的权限模型在表达能力、管理成本和运行时性能上存在显著差异。本章将系统介绍三种主流权限模型——RBAC、ABAC 和 ReBAC,并给出在服务目录场景下的选型原则。

3.1 RBAC 模型(基于角色的访问控制)

RBAC(Role-Based Access Control)是当前企业级应用中最广泛使用的权限模型。其核心思想是将权限授予“角色”,再将角色授予“用户”,从而解耦用户与权限的直接绑定关系。

核心概念:用户(User)→ 角色(Role)→ 权限(Permission)→ 操作(Action)→ 资源(Resource)

RBAC 的权限判定逻辑可以形式化表示为:

# RBAC 判定伪代码
def has_permission(user, action, resource):
    user_roles = get_user_roles(user)          # 获取用户的所有角色
    for role in user_roles:
        role_permissions = get_role_permissions(role)  # 获取角色的权限集
        if (action, resource) in role_permissions:
            return True
    return False
适用场景:组织架构稳定、角色划分清晰、权限粒度要求为“粗粒度”的企业环境。例如:开发人员、测试人员、运维人员三类角色,每类角色对应一套固定的 CI/CD 流水线操作权限。

RBAC 的优缺点对比:

维度 优势 劣势
管理成本 角色数量远少于用户数,权限变更只需修改角色定义 角色爆炸:当权限组合增多时,角色数量呈指数增长
表达能力 简单直观,非技术人员也能理解 无法表达“仅允许在 9:00-18:00 执行部署”等条件约束
审计追溯 通过角色归属可快速定位权限来源 细粒度审计困难,无法记录“为什么这个用户有这个权限”的完整上下文
RBAC 模型核心结构 用户 (User) 角色 (Role) 权限 (Permission) 分配 关联 张三(开发工程师) 李四(测试工程师) developer_role tester_role code:push pipeline:trigger 特点:用户通过角色间接获得权限,权限变更只需修改角色-权限映射 缺点:无法表达“仅允许在特定时间/IP下操作”等条件约束

3.2 ABAC 模型(基于属性的访问控制)

ABAC(Attribute-Based Access Control)通过评估用户、资源、环境和操作的多维属性组合来做出权限决策。相比 RBAC 的“角色”单一维度,ABAC 提供了更细粒度和动态的权限控制能力。

核心公式:权限判定 = f(用户属性, 资源属性, 环境属性, 操作属性) → True/False

ABAC 的典型策略表达式:

# ABAC 策略示例(使用 Rego 语言风格)
allow {
    input.user.role == "developer"
    input.resource.environment == "staging"
    input.action == "deploy"
    time.now_hour >= 9
    time.now_hour <= 18
    input.user.ip in ["10.0.0.0/8", "172.16.0.0/12"]
}

ABAC 与 RBAC 的核心差异:

对比维度 RBAC ABAC
判定依据 用户所属角色 用户、资源、环境、操作的属性组合
粒度 粗粒度(角色级) 细粒度(属性级)
动态性 静态,角色变更需管理员操作 动态,属性变化自动影响权限
策略复杂度 低,易于理解和维护 高,需要策略引擎支持
性能开销 低,缓存友好 较高,每次判定需计算属性
ABAC 在 CI/CD 中的典型陷阱:属性值来源不可靠。例如,如果“环境标签”由开发者在流水线 YAML 中自行声明,则可能被绕过。建议所有属性值必须从可信源(如 CMDB、身份提供商)获取,而非用户请求中携带。
ABAC 模型判定流程 用户属性 资源属性 环境属性 操作属性 策略引擎 (策略评估) if 属性组合满足策略 → allow 判定结果 Allow / Deny + 审计日志 示例策略:允许 developer 角色用户在 9:00-18:00 从内网 IP 对 staging 环境执行 deploy 操作 属性来源必须可信:用户属性来自 IdP,资源属性来自 CMDB,环境属性来自系统时钟

3.3 ReBAC 模型(基于关系的访问控制)

ReBAC(Relationship-Based Access Control)以资源之间的“关系图”作为权限判定的核心依据。Google Zanzibar (2019)将其推广至生产级规模,现已被 Auth0、Keto、SpiceDB 等项目广泛采用。

核心思想:权限 = 用户与资源之间的路径可达性。如果用户与目标资源之间存在一条满足特定关系约束的路径,则判定为允许。

ReBAC 的典型数据模型(以 SpiceDB Schema 为例):

// ReBAC Schema 示例:CI/CD 服务目录权限
definition user {}

definition team {
    relation member: user
    relation owner: user
}

definition project {
    relation team: team
    permission view = team->member
    permission deploy = team->owner
}

definition pipeline {
    relation project: project
    permission trigger = project->deploy
    permission view_log = project->view
}

三种模型的对比总结:

维度 RBAC ABAC ReBAC
判定依据 角色归属 属性组合 关系路径
表达能力 低 高 中高
管理复杂度 低 高 中
运行时性能 高(缓存友好) 中(属性计算) 高(图遍历+缓存)
适合场景 组织层级简单 复杂条件控制 资源层级嵌套、多租户
CI/CD 典型用例 按角色控制流水线触发 按时间/IP/环境控制部署 按项目-团队-流水线层级控制

3.4 权限模型选型原则

在平台工程的 CI/CD 服务目录场景下,选型不应追求“最先进”,而应追求“最匹配”。以下是基于实际工程经验的选型决策树:

  1. 先评估组织规模与角色数量:如果角色数量 < 20 且权限粒度要求为“角色级”,优先选择 RBAC。
  2. 再评估条件约束复杂度:如果存在“仅允许特定时间/IP/环境”等条件约束,必须引入 ABAC 或 RBAC+ABAC 混合模型。
  3. 再评估资源层级深度:如果资源存在多层嵌套关系(如 组织→项目→流水线→部署环境),且权限需要沿层级传播,优先选择 ReBAC。
  4. 最后评估团队运维能力:ABAC 和 ReBAC 需要策略引擎或图数据库的运维经验,如果团队缺乏相关能力,建议从 RBAC 起步,逐步演进。
平台工程最佳实践:不要将整个平台绑定在单一权限模型上。建议采用“混合模型”——核心组织架构使用 RBAC,细粒度条件控制使用 ABAC 策略,资源层级嵌套使用 ReBAC 关系图。例如:GitHub 的权限体系就是 RBAC(组织角色)+ ReBAC(仓库关系)的混合实现。

选型决策矩阵:

评估维度 推荐模型 不推荐模型
角色 < 20,无条件约束 RBAC ABAC(过度设计)
角色 < 20,有条件约束 RBAC + ABAC 混合 纯 ReBAC(关系建模复杂)
角色 > 50,资源层级深 ReBAC 纯 RBAC(角色爆炸)
多租户 SaaS 平台 ReBAC + ABAC 纯 RBAC(隔离性不足)
团队运维能力弱 RBAC ReBAC(运维门槛高)
关键提醒:权限模型的选择直接影响 CI/CD 服务目录的审计合规能力。如果贵司需要满足 SOC2、PCI-DSS 等合规要求,建议优先选择支持“完整审计日志”和“权限变更追溯”的模型(ABAC 和 ReBAC 天然具备属性/关系级审计能力,RBAC 需要额外扩展)。