授权模型对比:Azure RBAC vs 访问策略

在Key Vault这里,你可能会遇到一个挺有意思的问题:为什么有两套权限模型?嗯,这确实是Azure里为数不多的“双体系”设计之一。我个人刚接触时也纳闷,后来踩了几个坑才搞清楚里面的门道。

为什么会有两套授权模型?

说白了,是历史演进的产物。

  • 访问策略:Key Vault刚上线时就有的原生模型,专用于控制数据平面的操作。比如,谁可以读取机密、谁可以创建密钥。
  • Azure RBAC:后来Azure统一了资源管理的权限体系,RBAC覆盖了所有Azure资源。Key Vault在2019年才加入了RBAC支持,用于管理平面权限,再到2020年扩展到了数据平面。

我记得在2018年做第一个Key Vault项目时,只有访问策略可用。那时候要给应用分配权限,必须在Key Vault的刀片里一个一个添加服务主体,操作起来很繁琐。现在好了,RBAC让你可以用管理组、订阅或资源组级别统一授权。

一句话总结:访问策略是Key Vault专属的“老办法”,RBAC是Azure通用的“新标准”。两者目前共存,各有侧重。

管理平面 vs 数据平面

要理解这两套模型,首先得搞明白Key Vault的两个操作平面。

操作平面 作用范围 支持的授权模型
管理平面 控制Key Vault本身的配置,如创建/删除Vault、设置诊断日志、配置网络ACL 仅Azure RBAC
数据平面 操作Vault内部存储的机密、密钥、证书,如获取机密、签名、加密、导入证书 访问策略 + Azure RBAC(二选一或共存)

你想想看,管理平面平时谁会碰?大多是运维或安全团队。数据平面呢?应用、开发者、CI/CD系统天天在用。这两个平面的粉丝群体完全不同,所以权限模型的设计思路也不同。

两种模型的核心差异

我从四个维度来对比,你在实际选型时可以对着这个表格考虑。

对比维度 Azure RBAC 访问策略
授权粒度 角色级别(Key Vault Contributor、Key Vault Secrets User等) 操作级别(Get Secret、List Keys、Encrypt等,可单独勾选)
管理方式 通过Azure门户的“访问控制(IAM)”或Azure CLI/ARM模板管理 在Key Vault刀片的“访问策略”中管理
作用范围 可分配到管理组、订阅、资源组、Key Vault实例 仅可分配到单个Key Vault实例
继承性 支持从上级作用域继承(比如给整个订阅分配Secrets User角色) 不支持继承,每个Vault必须单独配置

我记得有一次,客户有200多个Key Vault,每个Vault都要给同一个服务主体分配Get Secret权限。用访问策略的话,你得手动点200次,或者写脚本批量操作。用RBAC就简单了:把服务主体加到订阅级别的Key Vault Secrets User角色,所有Vault一把搞定。这个对比很直观吧?

我的建议:如果你管理的Key Vault数量多、团队结构复杂,优先考虑RBAC。如果只有几个Vault、需要精细化控制具体操作的权限,访问策略反而更灵活。

性能与规模差异

这也是一个容易被忽略的点。我曾经遇到一个问题:一个应用上线后,每次访问Key Vault都慢了几十毫秒。查了半天,发现罪魁祸首是访问策略配置过多。

  • 访问策略:Key Vault内部会缓存策略表,如果策略条目数量超过1000条,缓存的更新和查询都会变慢,间接影响API响应时间。
  • RBAC:权限判断由Azure的统一RBAC服务处理,不直接消耗Key Vault实例的资源。所以从性能角度看,RBAC对大规模场景更友好。

当然,对大多数中小规模项目来说,这个差别几乎感觉不到。只有当你一个Vault里塞了上百个服务主体时,才会遇到这种尴尬情况。

混合使用场景

你可能会问:能不能两套模型同时用?答案是可以,但有规则。

# 启用RBAC授权后,访问策略会被忽略
az keyvault update --name MyVault --enable-rbac-authorization true

# 关闭RBAC授权后,访问策略重新生效
az keyvault update --name MyVault --enable-rbac-authorization false
  • 如果开启RBAC授权(--enable-rbac-authorization true),访问策略配置将被忽略。此时只有RBAC分配的权限生效。
  • 如果关闭RBAC授权(默认),只有访问策略生效。RBAC在这一层不会影响数据平面操作(但控制平面仍受RBAC控制)。
  • 注意:打开或关闭RBAC授权是Key Vault级别的开关,不能做到部分用户用RBAC、部分用户用访问策略。
我曾经踩过一个坑:在某次迁移中,我给Vault开了RBAC,但忘了检查访问策略是否已禁用。结果运维团队急得跳脚,说所有应用都访问不了机密。原来访问策略被忽略后,他们只配置了RBAC的管理角色,忘了分配数据平面角色。所以迁到RBAC前一定要做好权限清单。

如何选择?

这个没有银弹。我给你画个决策参考图,你可以对着看看自己属于哪一类。

授权模型选择决策图 授权模型决策参考 Key Vault 授权 小规模 / 精细操作控制 建议使用:访问策略 大规模 / 多团队 / 统一管理 建议使用:Azure RBAC 判断要素: • Key Vault数量 > 20? • 团队数量 > 5? • 需要继承权限? • 需要精细到操作级别?

我个人的经验是:新项目直接上RBAC。原因很简单——以后所有Azure资源的授权模型都向RBAC收敛,Key Vault不会例外。访问策略属于历史包袱,未来可能会被逐步淘汰。但如果你已经在用访问策略,且系统稳定,没必要立即迁移。毕竟,“能跑就别动”在生产环境里是一条金科玉律。

一点补充:不管选哪种模型,访问控制要遵循最小权限原则。给应用只分配它需要的操作(Get Secret就够了,不要给List权限)。你可以从审计日志入手,观察每个服务主体实际调用哪些API,再据此配置权限。嗯,这招是我被审计组问住之后悟出来的。