4、访问策略:基于 Azure RBAC 的访问控制、传统 Vault 访问策略、权限分配最佳实践

谈到 Key Vault 的权限管理,你可能会想:不就是给个权限嘛,有什么好纠结的?

我刚开始接触时也这么觉得。直到一次线上事故——有人给了一个应用太宽泛的权限,结果误删了一堆证书。嗯,从那天起,我每次设计访问策略都会多花十分钟仔细想想。

4.1 传统 Vault 访问策略(Vault Access Policy)

这是早期的权限模型。说白了,你在 Key Vault 资源上直接绑一个策略对象。

每个策略可以指定主体(用户、组、服务主体)和允许的操作(比如 get、list、delete)。

用 Azure CLI 设置一个传统策略的例子:

az keyvault set-policy \
    --name myVault \
    --object-id "user-object-id" \
    --secret-permissions get list \
    --key-permissions get list \
    --certificate-permissions get list

你想想看,这种方式简单直接。但问题也很明显:

  • 管理分散:每个 Vault 各自维护自己的策略,没法统一控管。
  • 数量限制:一个 Vault 最多只能绑定 1024 条策略。大企业可能不够用。
  • 粒度有限:只能控制到 get/list/delete 这一级,没法细到“只能读某个特定密钥版本”。

我记得有个客户,他们每个环境(开发、测试、生产)有单独的 Vault,但权限模型一模一样。结果每次新增应用,运维得手动改三个地方的策略……后来全部迁移到 RBAC 了。

4.2 基于 Azure RBAC 的访问控制

现在 Azure 推荐用 RBAC 来控制 Key Vault 的访问。本质上,你是在 Azure 资源管理层面管理权限,而不是 Vault 内部。

RBAC 有内置角色,比如:

角色名称 作用域 典型能干啥
Key Vault 读者 订阅/资源组/Vault 列出密钥、秘密、证书,但不能读取值
Key Vault 机密用户 Vault 或单个机密 读取机密的值(适合运行时应用)
Key Vault 管理员 Vault / 管理组 所有数据操作 + 管理策略(适合运维团队)

用 Azure CLI 给一个应用分配“机密用户”角色:

az role assignment create \
    --assignee "sp-object-id" \
    --role "Key Vault Secrets User" \
    --scope "/subscriptions/{sub-id}/resourceGroups/{rg}/providers/Microsoft.KeyVault/vaults/myVault"

好处很明显:

  • 统一管理:所有 Azure 资源共用一套 RBAC 体系,可以继承管理组权限。
  • 精细作用域:可以精确到单个密钥、秘密或证书版本(预览功能)。
  • 条件访问:支持 Azure AD 条件策略,比如要求 MFA 才能访问。

我曾经在项目中遇到过一个问题:两个模型混用。团队里部分人用传统策略,部分人用 RBAC。结果有个应用明明在 RBAC 里给了读者权限,却在传统策略里被拒绝了。Azure 会同时检查两个模型,任何一个拒绝都会导致拒绝。所以千万别混着用。

4.3 权限分配最佳实践

搞清楚了两种方式,那具体怎么选?我总结了几条:

  1. 新项目统一用 RBAC。除非你还在用不支持 RBAC 的旧 SDK 或 PowerShell 模块。
  2. 遵循最小权限原则。给应用只分配它需要的操作。比如只读密钥列表的应用,给个“Key Vault Reader”就够了,别给“Key Vault Secrets Officer”。
  3. 用托管标识代替直接分配。应用跑在 Azure VM 或 App Service 上时,用系统/用户分配托管标识。这样不需要手动管理服务主体的密钥。
  4. 定期审计。用 Azure Policy 和活动日志检查谁拿到了超出预期的权限。我每季度会跑一次脚本,把 Key Vault 的所有角色分配导出到 CSV 里审查。

有个小技巧:当你使用 RBAC 时,Key Vault 传统策略界面会灰掉,但里面还可能残留旧的策略。迁移完成后,建议手动清空传统策略,避免后续混淆。

两种 Key Vault 权限控制模型对比 传统 Vault 访问策略 Vault 资源上直接绑定策略 主体 + 操作列表 (get/list/delete) 每个 Vault 独立管理,上限 1024 条 不适合大规模 / 混合模型容易冲突 Azure RBAC 访问控制 Azure 资源管理层面定义权限 角色定义(读者/机密用户/管理员) 继承管理组、订阅、资源组作用域 可与条件访问 / 托管标识深度集成 推荐迁移

最后说一个贴士:权限分配不是一次性的。随着业务变化,某些应用可能不再需要某个机密,或者需要换角色。我记得有次审查发现,一个测试应用居然在生产 Vault 上还有“删除”权限,赶紧撤销了。所以——定期检查权限,就像定期换牙刷一样,养成了习惯就不觉得麻烦了。