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 执行部署”等条件约束 |
| 审计追溯 | 通过角色归属可快速定位权限来源 | 细粒度审计困难,无法记录“为什么这个用户有这个权限”的完整上下文 |
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、身份提供商)获取,而非用户请求中携带。
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 服务目录场景下,选型不应追求“最先进”,而应追求“最匹配”。以下是基于实际工程经验的选型决策树:
- 先评估组织规模与角色数量:如果角色数量 < 20 且权限粒度要求为“角色级”,优先选择 RBAC。
- 再评估条件约束复杂度:如果存在“仅允许特定时间/IP/环境”等条件约束,必须引入 ABAC 或 RBAC+ABAC 混合模型。
- 再评估资源层级深度:如果资源存在多层嵌套关系(如 组织→项目→流水线→部署环境),且权限需要沿层级传播,优先选择 ReBAC。
- 最后评估团队运维能力: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 需要额外扩展)。