第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 用户、组或服务主体,然后赋予一组权限。比如:
- 密钥权限: 获取、列出、创建、加密、解密、签名、验证等。
- 机密权限: 获取、列出、设置、删除等。
- 证书权限: 获取、列出、创建、更新、删除等。
这里有个常见的坑。我曾经发现有人把同一个服务主体同时加到多个访问策略里,结果权限叠加,变成了一个权限集合。其实 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 给删了。
幸好软删除是开着的。恢复流程是这样的:
- 登录 Azure 门户,进入「Key Vault」服务页面,选择「已删除的保管库」。
- 找到
prod-app-kv,点击「恢复」。 - 等待几分钟,vault 恢复完成,所有密钥、机密、证书都回来了。
- 验证一下:通过 Azure CLI 执行
az keyvault secret list --vault-name prod-app-kv,确认机密还在。 - 发个通知:告诉团队没问题了。
整个过程不到 10 分钟。如果没有软删除,那恢复难度就大多了,比如从备份里恢复,或者联系 Azure 支持进行数据恢复,那时间就不是按分钟算了。
az keyvault backup 命令把整个 vault 备份到存储账户。这样即使软删除也救不回来,你还有个兜底。
3.5 核心结构图:Azure Key Vault 工作流程
下面这张图展示了 Key Vault 的核心组件和它们之间的关系。从上层应用如何通过访问策略获取机密,到软删除如何兜底,再到 ARM 模板如何统一管理部署。
这张图把 Key Vault 的三个核心功能串在了一起。你通过 ARM 模板定义好 vault 和它的访问策略,部署后应用通过 HTTPS 请求获取机密,而软删除作为最后一道防线,保护你不因误操作而丢失数据。