4. 权限模型设计
一旦签发,就相当于把系统的一把“钥匙”交给了调用方。如果这把钥匙能打开的门过多、能停留的时间过长、能绕过的检查过少,那么密钥泄露带来的损失就会被成倍放大。权限模型设计要解决的核心问题,就是让每一把“只够用、不过界、可追溯、能隔离”。本节围绕RBAC、ABAC、最小权限原则、权限边界与职责分离五个概念,说明它们如何共同构成权限治理的骨架。
核心原理:从“角色”到“属性”再到“边界”
RBAC(基于角色的访问控制)以“角色”为授权中介:先定义角色,再把权限绑定到角色,最后把角色授予或密钥所属的服务身份。它的优势是结构清晰、易于审计,适合权限集合相对稳定的内部系统。例如,一个订单服务密钥被授予“订单只读角色”,它天然只能调用订单查询接口,而无法触碰支付或用户管理接口。
ABAC(基于属性的访问控制)则把授权决策交给属性表达式:主体属性(密钥所属应用、环境、团队)、资源属性(接口敏感级别、数据归属)、操作属性(读/写/删除)和环境属性(时间、来源IP、调用频率)共同参与判断。ABAC更灵活,能表达“仅允许生产环境密钥在工作日9:00—18:00调用退款接口,且单笔金额不超过5000元”这类细粒度策略。RBAC与ABAC并非互斥,实践中常用RBAC做粗粒度分层,用ABAC做细粒度兜底。
最小权限原则要求密钥只拥有完成当前任务所必需的最小权限集合,并且默认拒绝、按需申请、定期回收。权限边界则是一道“上限护栏”:即使某个角色被误授予了越权权限,边界策略仍能阻止其突破预设范围。职责分离(SoD)强调关键操作不能由单一密钥独立完成,例如“创建退款”和“审批退款”必须由两把不同密钥分别执行,避免一把密钥被滥用后直接完成全链路高风险操作。
方法流程:把模型落到密钥生命周期
权限模型不能只停留在策略文档里,必须嵌入的创建、使用、轮换和回收流程。推荐按以下步骤实施:
- 权限盘点与分级:梳理全部API接口,按敏感级别分为公开、内部、敏感、高危四级,并标注所需操作类型。
- 角色建模:基于业务职责定义角色,避免“一人一角色”的碎片化,也避免“超级角色”的过度集中。
- 属性策略编写:对高危接口补充ABAC条件,例如来源IP白名单、时间窗口、金额阈值、调用频次。
- 边界策略配置:在网关或授权服务中设置全局拒绝规则,任何未显式允许的调用一律拒绝。
- 职责分离校验:识别互斥角色与互斥操作,确保同一密钥不能同时拥有“申请”和“审批”权限。
- 持续审计与回收:定期输出密钥权限快照,对比实际调用记录,回收长期未使用权限。
在网关侧,权限校验通常体现为一段策略配置。例如以下伪代码展示了RBAC与ABAC的组合判断逻辑:
policy:
role: order_readonly
allow:
- action: "order:query"
resource: "order/*"
abac_condition:
- env == "prod"
- source_ip in ["10.20.0.0/16"]
- request_time between "09:00" and "18:00"
deny:
- action: "order:refund"
- action: "order:delete"
boundary:
max_amount: 0
require_mfa: false
当请求到达时,授权服务先匹配角色权限,再校验ABAC条件,最后检查边界策略。任何一层不通过,都返回拒绝并记录审计日志。日志中应包含密钥ID、角色、请求接口、决策结果和拒绝原因,便于事后复盘。
案例场景:一次越权调用如何被拦截
某电商平台的“订单查询服务”使用了一把,该密钥被授予“订单只读角色”。某天,开发人员为了调试方便,临时把该密钥加入“订单管理角色”,但忘记移除。攻击者通过泄露的密钥尝试调用退款接口。此时:
- RBAC层:密钥当前拥有“订单管理角色”,退款接口在角色权限内,第一层通过。
- ABAC层:退款接口要求来源IP属于财务网段,而攻击者IP不在白名单,第二层拒绝。
- 边界层:退款属于高危操作,边界策略要求双人审批令牌,攻击者未携带,第三层拒绝。
- 职责分离:即使攻击者伪造了审批令牌,创建与审批密钥分离,仍无法独立完成退款。
这个案例说明,单一模型往往不够。RBAC提供了基础权限集合,ABAC补充了上下文约束,边界策略兜底,职责分离防止单点滥用。四者叠加,才能把“密钥泄露”从“直接损失”降级为“可拦截事件”。
常见误区:很多团队只做RBAC,认为“角色分好了就安全了”。但角色一旦被误授予,权限就会静默扩大;也有团队把ABAC条件写得过于复杂,导致策略难以维护和审计。建议RBAC保持稳定,ABAC只用于高危接口的补充约束,边界策略保持简单明确。
误区复盘与检查清单
权限模型设计中最常见的失败模式包括:默认允许而非默认拒绝;密钥权限长期不回收;高危操作缺少职责分离;ABAC条件散落在代码中而非集中管理;审计日志缺少决策依据。以下清单可用于自查:
| 检查项 | 合格标准 | 常见问题 |
|---|---|---|
| 默认策略 | 未显式允许一律拒绝 | 默认放行,靠黑名单拦截 |
| 角色粒度 | 角色对应业务职责,权限可解释 | 超级角色、一人一角色 |
| ABAC条件 | 仅用于高危接口,集中配置 | 条件散落代码,难以审计 |
| 权限边界 | 有全局上限,越权可拦截 | 边界缺失,角色即上限 |
| 职责分离 | 互斥角色、双密钥确认 | 同一密钥可创建并审批 |
| 回收机制 | 定期快照比对,自动回收 | 权限只增不减 |
实践建议:把权限模型当作治理的“操作系统”,而不是一次性配置。每次新增接口、新增角色或新增密钥,都应触发一次权限评审;每次密钥轮换,都应同步复核权限是否仍然必要。只有让权限模型持续运转,最小权限和职责分离才不会退化为纸面原则。