Azure Key Vault 基础:核心概念、组件与工作原理

说到云上的密钥管理,Azure Key Vault 是我接触过最多的服务之一。说白了,它就是一个「云保险柜」——你把密钥、密码、证书这类敏感东西扔进去,剩下的访问控制、轮转、审计交给它来管。我最早用 Key Vault 是因为有个客户想统一管理几百个数据库连接字符串,手动配太容易出事了。

这一节我们就把 Key Vault 的核心概念、组件拆开聊聊。你想想看,一个保险柜最重要的是什么?锁、钥匙、谁有权限打开、开锁记录。Key Vault 也是这套逻辑。

核心概念:密钥、秘密、证书

Key Vault 里存三类东西,我习惯用一个类比来记:

  • 密钥(Key):纯粹的加密材料,比如 RSA、ECC 密钥对。用来做加密解密、签名验签。我在项目中经常用它来做应用程序级别的数据加密,而不是直接硬编码密钥。
  • 秘密(Secret):任何你不想让别人看到的字符串,比如数据库密码、API 、连接字符串。Key Vault 帮你加密存储,还能自动轮转。
  • 证书(Certificate):X.509 证书,包括公私钥对和证书链。Key Vault 可以自己签发证书,也可以导入已有证书。嗯,这里要注意:证书的生命周期管理比密钥和秘密复杂得多,我曾经因为证书过期没监控到,导致生产环境 TLS 握手失败……教训啊。
密钥、秘密、证书对比
类型 典型用途 是否可导出 自动轮转支持
密钥 加密/解密、签名/验签 默认不可导出(HSM 保护) 支持(手动或自动)
秘密 存储敏感字符串 可以导出(需权限) 仅限版本管理,非自动轮转
证书 TLS/SSL、客户端认证 可以导出(含私钥需标记) 支持(生命周期自动触发)

Vault 是什么?

一个 Key Vault 就是一个独立的“保险柜”实例。每个 Vault 有自己的名称(全局唯一)、区域、SKU(Standard 或 Premium)。Premium 支持 HSM 硬件保护,密钥永远不会离开 HSM 边界。我的习惯是:生产环境必用 Premium,开发测试用 Standard,省钱也够用。

Vault 本身是个资源,你用 Azure 门户、CLI、PowerShell 或 Terraform 都能创建。创建完之后,它的访问入口是 https://<vault-name>.vault.azure.net/。

一个 Vault 能存多少东西? 最多可以存 10,000 个对象(密钥+秘密+证书总和)。如果超过这个数,就需要规划多个 Vault。我在一个大客户那边就踩过这个数上限,后来按业务模块拆成多个 Vault 才解决。

组件架构:控制平面 vs 数据平面

Key Vault 架构我最想强调的就是「控制平面」和「数据平面」分开。你想想看,如果管理 Vault 的 API 和读写密钥的 API 混在一起,权限就很难控制。

  • 控制平面:管理 Vault 本身的生命周期(创建、删除、更新属性)。走 Azure Resource Manager(ARM),身份认证用 Azure AD + RBAC。
  • 数据平面:操作 Vault 里的密钥、秘密、证书(增删改查、加密解密)。直接走 Vault REST API,身份认证用 Azure AD 或 访问策略。

举个例子:我创建一个 Vault,这是控制平面操作。我把一个数据库密码存进去,这是数据平面操作。这两个平面的权限可以完全不同。

访问控制:两种授权模型

Key Vault 支持两种授权方式,我刚开始用的时候也很困惑,后来总结了一句话:RBAC 管“管理”,访问策略管“数据”。但 Azure 后来在数据平面也引入了 RBAC(叫 Key Vault RBAC),现在推荐统一用 RBAC。

RBAC 与 访问策略对比
特点 Azure RBAC Vault 访问策略
范围 控制平面 + 数据平面(预览) 仅数据平面
管理方式 ARM / Azure CLI / Portal Vault 专属 UI / CLI
粒度 粗粒度(管理、读、写等角色) 细粒度(可精确到每个密钥/秘密的操作)
建议 新项目首选 旧项目兼容,或需要极细粒度控制时

我的建议:尽量使用 RBAC 来控制数据平面,因为权限模型统一,审计日志也更清晰。但如果你有非常细粒度的需求(比如只允许 A 用户读某个特定密钥),访问策略仍然是最佳选择。

工作原理:创建、存储、检索、轮转

我们过一遍 Key Vault 的标准工作流。假设你用 Azure CLI 来操作。

1. 创建 Vault

az keyvault create \
  --name "my-prod-vault" \
  --resource-group "prod-rg" \
  --location "eastus" \
  --sku "Premium"

这会创建一个 Premium SKU 的 Vault。注意名称全局唯一,而且一旦创建不能改名。

2. 存储一个秘密

az keyvault secret set \
  --vault-name "my-prod-vault" \
  --name "DbConnectionString" \
  --value "Server=myserver;Database=mydb;User Id=sa;Password=..."

秘密的最大尺寸是 25 KB。我见过有人把整张证书的 PEM 编码当做秘密存——可以的,但建议用证书类型更规范。

3. 检索秘密

az keyvault secret show \
  --vault-name "my-prod-vault" \
  --name "DbConnectionString" \
  --query "value" \
  --output tsv

应用程序用托管身份(Managed Identity)来获取秘密,不需要硬编码任何凭证。这是我非常推荐的做法。

4. 密钥轮转

如果你用密钥而不是秘密,Key Vault 可以帮你自动生成新版本。举个例子,创建一个 RSA 密钥并启用自动轮转:

az keyvault key create \
  --vault-name "my-prod-vault" \
  --name "EncryptionKey" \
  --kty "RSA" \
  --size 4096 \
  --rotation-policy '{"lifetimeActions":[{"trigger":{"timeAfterCreate":"P30D"},"action":{"type":"rotate"}}]}'

这样 30 天后 Key Vault 会自动生成一个新版本。应用程序需要支持多版本密钥——我用过的大多数 SDK(比如 .NET 的 Azure.Security.KeyVault.Keys)默认支持。但如果你自己写加密逻辑,一定要测试你的代码是否能优雅地处理密钥版本切换。

避坑指南:我曾经在一个项目中,应用程序只缓存了第一个版本的密钥 ID,轮转后仍然用旧版本加密新数据,导致新数据无法被新版本解密。解决方案是:每次加密前都从 Key Vault 获取密钥的最新版本(不加版本号调用 API),或者使用 SDK 的自动版本解析。

日志与监控

Key Vault 所有操作都可以通过 Azure Monitor 和事件网格来记录。我每次上线 Key Vault 时一定会做两件事:

  • 开启诊断设置,把所有操作日志(AuditEvent)发送到 Log Analytics 工作区。
  • 设置告规则,比如「1 小时内 5 次密钥获取失败」就触发告警。

日志里你能看到谁、什么时候、通过哪个 IP、做了什么操作。这对合规审计非常重要。

知识结构总览

下面一张图把 Key Vault 的核心逻辑串起来。我自己经常拿这张图给团队新人讲「Key Vault 到底怎么用」。

Azure Key Vault 架构与工作流 Azure Key Vault 核心架构 控制平面 (Control Plane) ARM API · Azure RBAC 创建/删除 Vault 管理访问策略 数据平面 (Data Plane) Vault REST API · 访问策略 / RBAC 存储/读取秘密 加密/解密密钥 Key Vault 名称 · 区域 · SKU HSM / 软件保护 配额: 10,000对象 存储对象 密钥 秘密 证书 应用程序 / 用户(使用托管身份) Azure AD 认证 数据流: 应用通过 Azure AD 获取 然后调用 Vault 数据平面 API

图里分了两条主线:左边是控制平面和数据平面的活动,右边是 Vault 内部的对象。箭头标明了认证和调用路径。你会发现所有数据平面操作都绕不开 Azure AD 这一步——这也是 Key Vault 安全的核心。