Azure Key Vault:核心概念与架构

Azure Key Vault 是我在云上管理敏感信息时最常用的服务之一。说白了,它就是一个专门存密码、密钥、证书的保险柜。但我发现很多团队只把它当成一个“高级密码本”,其实它的能力远不止于此。

我们先从几个核心概念入手,把骨架搭清楚。

什么是 Key Vault?

Key Vault 是微软提供的托管密钥管理服务。它可以安全存储三类东西:

  • 密钥(Key)—— 对称/非对称加密密钥,用于加解密、签名验签
  • 机密(Secret)—— 几乎任何字符串:数据库密码、API 、证书私钥
  • 证书(Certificate)—— X.509 证书及其私钥,支持自动续期

我个人习惯把 Key Vault 看作一个“统一凭据接入点”。应用不要自己记密码,运行时去 Key Vault 里取就对了。

架构层次

理解 Key Vault 的架构,记住两条线:资源组织和访问控制。

资源组织

一个 Azure 订阅下可以有多个 Key Vault 实例(Vault)。每个 Vault 属于一个资源组,部署在特定区域。Vault 内部不设二级目录,所有 Secret、Key、Certificate 都平铺在同一个命名空间下。

嗯,这里有个常见坑:

注意:Vault 名称是全局唯一的(因为 DNS 名称必须唯一)。我曾经在同一个订阅里想建两个同名的 Vault,结果第二个死活创建失败——Azure 提示“名称已被占用”。记着带上环境标识,比如 prod-xxx-vault。

我把架构逻辑画成了一张图,方便理解:

Azure Key Vault 核心架构 Azure 订阅 资源组 (Resource Group) Key Vault (区域) 机密密文 Secret / Key / Cert 访问策略 Access Policy 托管标识 Managed Identity 说明 1. 每个 Vault 独立存储,命名空间扁平。 2. 访问策略控制用户/应用权限;托管标识让 Azure 资源免密访问。 3. 软删除和清除保护是恢复与安全的重要保障。

访问控制模型

Key Vault 提供了两套权限体系:访问策略(经典)和 RBAC(Azure 基于角色的访问控制)。

维度 访问策略 RBAC
粒度 Vault 级别,可单独对 Secret/Key/Cert 授权 细粒度到单个密钥/机密,可继承
管理入口 Key Vault 的“访问策略”边栏 IAM(访问控制)
适用范围 仅对 Key Vault 有效 Azure 所有资源统一管理
推荐场景 传统应用,小团队 企业级,多团队,策略复用

我自己在实践中更倾向 RBAC。为什么?因为可以用同一个 Azure AD 角色定义来管理多个 K8s 集群的密钥访问,省得在几十个 Vault 里点点点。但要注意:两种模式互斥——你启用了 RBAC,访问策略边栏就失效了。

小经验:如果你用 Terraform 部署,记得在 azurerm_key_vault 资源里设置 enable_rbac_authorization = true。我曾经因为忘记设置,结果上线后运维非要手动配访问策略,搞得手忙脚乱。

软删除与清除保护

这两个特性是我觉得 Key Vault 最“人性化”的设计。软删除默认开启:你删掉一个 Secret 后,它不会被立即销毁,而是进入“已删除”状态,保留 90 天。期间可以恢复。

清除保护则是给删除行为加一把锁:即使你手动执行了清除操作,Vault 也会拒绝,除非你联系 Azure 支持。这在生产环境非常有必要。

实用场景:一次我在 CI/CD 流水线里误删了生产数据库密码的 Secret,当时脑子一片空白。幸好软删除开启了,我直接调用了 az keyvault secret recover 命令,30 秒内恢复。要是没有它,那天就得加班回滚部署了。

托管标识 —— 免密访问的最佳实践

托管标识(Managed Identity)是 Key Vault 与 Azure 资源之间的“握手”方式。说白了,就是 Azure 帮你生成一个服务主体,自动轮换凭证。你只需要在应用(比如 VM、Functions、AKS)上开启托管标识,然后给这个标识分配 Key Vault 的权限。

举个例子:

# 为 VM 启用系统托管标识
az vm identity assign -g myResourceGroup -n myVM

# 给该标识分配读取 Secret 的权限
az keyvault set-policy --name myVault \
  --object-id <principal-id-from-above> \
  --secret-permissions get list

这样应用代码里只需要用到 DefaultAzureCredential,不需要硬编码任何连接字符串。我个人强烈建议团队把所有云原生应用都迁移到这种模式。

备份与恢复

Key Vault 自身有高可用(同区域多副本),但跨区域容灾需要你主动备份。注意:只能备份单个 Secret/Key/Cert,不能备份整个 Vault。

  • 备份命令:az keyvault secret backup / az keyvault key backup
  • 备份内容:当前版本的所有元数据和加密材料(以 .keyvault 文件保存)
  • 恢复限制:只能恢复到相同区域(同城灾备)或相同地理位置的另一个 Vault
我曾经踩过的坑:以为备份文件可以跨区域还原。结果在另一个区域的 Vault 上 restore 时一直报错“无法将备份还原到不同地理区域”。后来查文档才发现备份文件绑定了区域哈希。所以跨区域灾备得用 Azure Site Recovery 或 Key Vault 的“异地复制”功能(目前仅支持部分区域)。

总结这张图

回到我画的那张架构图:订阅→资源组→Vault→三个核心组件(机密、策略、标识)。连接线是它们的交互关系。其实你把这几个点搞懂了,Key Vault 80% 的场景都能覆盖。

还有一个小细节:Key Vault 的网络隔离可以通过防火墙和 VNet 服务端点来控制。如果你有加密合规要求,记得开启“仅允许受信任的 Microsoft 服务访问”。

好了,这一节的内容就到这里。记住核心原则:不要把密码写在代码里,交给 Key Vault 打理。