第3章:Azure Key Vault — 软删除、访问策略与ARM模板集成

聊到云上密钥和机密的管理,Azure Key Vault 算是微软云生态里最核心的服务之一。我个人用了好几年,从最初只是在里面存个数据库连接串,到后来承载整个微服务架构的证书轮换,经历了不少坑。这一章我们聚焦三个最关键的实操点:软删除怎么用、访问策略怎么配、以及怎么用 ARM 模板把它管起来。

3.1 软删除 — 你以为是删掉了,其实还能救回来

先说说软删除。很多新手刚接触 Key Vault 时会觉得:「我删个机密,不就是点一下删除吗?」嗯,没那么简单。

Key Vault 默认启用了软删除。这意味着你删除一个机密或一个 vault 本身后,它不会立即消失,而是进入一个「已软删除」状态。默认保留 90 天。这 90 天内,你可以恢复它。90 天后,系统才会真正清理掉。

注意: 一旦过了保留期,数据就真的没了。没有后悔药。我曾经在项目中碰到过团队不小心删除了生产环境的证书,幸好软删除还在保留期内,我们及时恢复了,否则那天的故障复盘会很难看。

软删除的状态变化大概是这样:

  • 启用: 创建 vault 时默认开启。也可以在创建后手动启用,但如果你在创建时没开,后面再想开就有些麻烦了。
  • 删除 vault: vault 进入「已软删除」状态,你可以在 Azure 门户的「已删除的保管库」列表里看到它。
  • 恢复: 在保留期内,你可以恢复整个 vault,里面的所有密钥、机密、证书也都一起回来。
  • 清除: 如果确定不要了,可以手动「清除」(purge),这会让 vault 立即永久删除。

我个人习惯保留这个功能。除非有合规要求必须立即清理,否则开着软删除等于多了一道保险。你想想看,万一哪天误删了东西,能省去多少麻烦?

3.2 访问策略 — 谁可以干什么,你说了算

接下来是访问策略。这是 Key Vault 权限模型里最基础、最常用的一块。

Key Vault 的访问控制分为两层:

  • 管理平面: 通过 Azure RBAC 控制。谁可以创建、删除、修改 vault 本身。
  • 数据平面: 通过 Key Vault 访问策略控制。谁可以读取、写入、删除 vault 里的密钥、机密、证书。

数据平面就是我们通常说的「访问策略」。每个访问策略绑定一个 Azure AD 用户、组或服务主体,然后赋予一组权限。比如:

  • 密钥权限: 获取、列出、创建、加密、解密、签名、验证等。
  • 机密权限: 获取、列出、设置、删除等。
  • 证书权限: 获取、列出、创建、更新、删除等。
最佳实践: 我建议你尽量把权限切细。不要把「全部权限」给一个服务主体,而是只给需要的操作。比如一个只读服务,只给 Get 和 List 就够了。给多了,万一被利用,风险就大了。

这里有个常见的坑。我曾经发现有人把同一个服务主体同时加到多个访问策略里,结果权限叠加,变成了一个权限集合。其实 Key Vault 会自动合并同一个主体的权限,但你最好还是保持每个主体只配一个策略,这样更清晰。

访问策略的配置方式很简单。在 Key Vault 的「访问策略」边栏下,点击「+ 添加访问策略」,选好主体和权限,保存就行。但你如果觉得每次手动配太麻烦,那就该上 ARM 模板了。

3.3 与 ARM 模板集成 — 基础设施即代码的关键一步

说到 ARM 模板,这是把 Key Vault 纳入基础设施即代码(IaC)流程的核心手段。你想想看,如果每次创建 vault 都要去门户点鼠标,那还叫什么自动化?

ARM 模板是 JSON 格式的文件,描述了你想要部署的 Azure 资源。下面是一个最简单的 Key Vault 模板片段:

{
  "type": "Microsoft.KeyVault/vaults",
  "apiVersion": "2022-07-01",
  "name": "[parameters('vaultName')]",
  "location": "[resourceGroup().location]",
  "properties": {
    "sku": {
      "family": "A",
      "name": "Standard"
    },
    "tenantId": "[subscription().tenantId]",
    "enableSoftDelete": true,
    "softDeleteRetentionInDays": 90,
    "accessPolicies": [
      {
        "tenantId": "[subscription().tenantId]",
        "objectId": "[parameters('objectId')]",
        "permissions": {
          "keys": ["get", "list"],
          "secrets": ["get", "list"],
          "certificates": ["get", "list"]
        }
      }
    ]
  }
}

看到没?这里面明确配了 enableSoftDelete 和 accessPolicies。用模板部署时这俩参数都会生效。

这里有个小技巧。如果你在模板里写了访问策略,部署时会完全覆盖 vault 上已有的策略。也就是说,如果你之前手动加了一些策略,再跑一次模板,那些手动加的会被模板定义的策略直接替换掉。我吃过这个亏。后来我规范了流程:所有访问策略统一通过模板管理,手动操作一律禁止。

提示: 模板里可以使用 reference 函数或者 listKeys 之类的函数吗?不可以。ARM 模板的表达式在部署时执行,不能读取 vault 里的机密值。想要在部署时动态获取机密,得用其它方式,比如部署脚本或者嵌套模板的 reference 配合 outputs。

另外,模板里的 accessPolicies 数组可以包含多个主体。我习惯在模板参数里传一个对象数组,这样每次部署时可以灵活调整哪些主体有哪些权限。

3.4 实战经验:一次误删恢复的完整流程

我分享一下之前项目里的一个真实案例。当时我们有个 Key Vault 叫 prod-app-kv,里面存放了数据库连接串和一个 TLS 证书。某天新来的运维同学在清理资源时,不小心把这个 vault 给删了。

幸好软删除是开着的。恢复流程是这样的:

  1. 登录 Azure 门户,进入「Key Vault」服务页面,选择「已删除的保管库」。
  2. 找到 prod-app-kv,点击「恢复」。
  3. 等待几分钟,vault 恢复完成,所有密钥、机密、证书都回来了。
  4. 验证一下:通过 Azure CLI 执行 az keyvault secret list --vault-name prod-app-kv,确认机密还在。
  5. 发个通知:告诉团队没问题了。

整个过程不到 10 分钟。如果没有软删除,那恢复难度就大多了,比如从备份里恢复,或者联系 Azure 支持进行数据恢复,那时间就不是按分钟算了。

重要: 即便有软删除,也建议定期备份机密。可以使用 az keyvault backup 命令把整个 vault 备份到存储账户。这样即使软删除也救不回来,你还有个兜底。

3.5 核心结构图:Azure Key Vault 工作流程

下面这张图展示了 Key Vault 的核心组件和它们之间的关系。从上层应用如何通过访问策略获取机密,到软删除如何兜底,再到 ARM 模板如何统一管理部署。

Azure Key Vault 核心组件与工作流程 你的应用 Key Vault 实例 机密 / 密钥 / 证书 HTTPS 请求 存储 访问策略 主体 + 权限集合 软删除 默认保留 90 天 ARM 模板 IaC 部署 控制权限 保护删除 定义部署 关键要点 1. 应用通过 HTTPS 访问 Key Vault,访问策略决定权限;2. 软删除提供误删恢复能力;3. ARM 模板将所有配置代码化,便于版本管理和自动化部署。 推荐组合:开启软删除 + 细致的访问策略 + ARM 模板统一管理

这张图把 Key Vault 的三个核心功能串在了一起。你通过 ARM 模板定义好 vault 和它的访问策略,部署后应用通过 HTTPS 请求获取机密,而软删除作为最后一道防线,保护你不因误操作而丢失数据。

一句话总结: Azure Key Vault 的核心就是三件事——软删除保命、访问策略控权、ARM 模板管部署。把这三点用好,你的密钥管理就稳了。