4、密钥管理服务(KMS):三大云厂商的基本使用与轮换策略

说到密钥管理,我见过太多团队把密钥硬编码在代码里,或者放在配置文件里就上生产了。说实话,每次看到这种操作,我心里都咯噔一下。密钥管理服务(KMS)就是来解决这个问题的——它帮你把密钥锁在硬件安全模块(HSM)里,你只管用,不用管它怎么存。

这一章,咱们就聊聊 AWS KMS、Azure Key Vault 和阿里云 KMS 的基本用法。我会结合我自己的踩坑经历,把密钥创建、使用和轮换这些关键操作讲清楚。

4.1 为什么需要 KMS?

你想想看,如果密钥放在磁盘上,数据库被拖库了怎么办?如果密钥在内存里,被 dump 出来怎么办?KMS 的核心思路就是:密钥永远不离开 HSM。你只能通过 API 去「用」密钥,但拿不到密钥本身的明文。

KMS 的核心价值:

  • 集中管理:所有密钥在一个地方创建、轮换、审计
  • 硬件隔离:密钥存储在 FIPS 140-2 认证的 HSM 中
  • 细粒度权限:谁可以用、什么时候用、用来做什么,都能控制
  • 自动轮换:支持定期自动生成新密钥版本

我在一个金融项目里遇到过这种情况:开发人员为了方便,把数据库加密密钥写死在代码里。结果代码泄露到 GitHub 上,整个数据库的数据都暴露了。后来我们迁移到 KMS,密钥由安全团队统一管理,开发人员只拿到一个 Key ID,再也不用担心密钥泄露了。

4.2 AWS KMS 的基本使用

AWS KMS 是我用得最多的。它的设计很简洁——你创建密钥,然后通过 API 加密/解密数据。但要注意,KMS 直接加密的数据最大只有 4KB。超过这个大小,你得用信封加密。

4.2.1 创建对称密钥

我个人习惯用 AWS CLI 来创建密钥,这样方便自动化。当然,控制台操作也完全没问题。

# 创建对称密钥
aws kms create-key \
    --description "用于加密数据库连接字符串" \
    --key-usage ENCRYPT_DECRYPT \
    --origin AWS_KMS

# 创建别名,方便引用
aws kms create-alias \
    --alias-name alias/db-connection-key \
    --target-key-id <key-id>

嗯,这里要注意:--origin 参数决定了密钥是在 AWS 的 HSM 里生成,还是你导入自己的密钥材料。我建议默认用 AWS_KMS,除非你有合规要求必须用自己的密钥。

4.2.2 使用密钥加密数据

加密和解密操作很简单,但有个坑——加密时一定要指定加密上下文。加密上下文是个键值对,它会被用于验证解密请求的合法性。

# 加密
aws kms encrypt \
    --key-id alias/db-connection-key \
    --plaintext fileb://secret.txt \
    --encryption-context "department=finance,env=prod" \
    --output text \
    --query CiphertextBlob | base64 --decode > encrypted.txt

# 解密
aws kms decrypt \
    --ciphertext-blob fileb://encrypted.txt \
    --encryption-context "department=finance,env=prod" \
    --output text \
    --query Plaintext | base64 --decode

我曾经踩过的坑:解密时如果加密上下文不匹配,KMS 会直接拒绝请求。有一次我加密时写了 env=prod,解密时写成了 env=production,结果解密失败。所以加密上下文一定要标准化,最好用配置管理工具统一维护。

4.2.3 密钥轮换

AWS KMS 支持自动轮换,每年一次。我个人觉得这个频率对大多数场景来说够了。但如果合规要求更严格,你可以手动触发轮换。

# 启用自动轮换
aws kms enable-key-rotation --key-id <key-id>

# 手动创建新密钥版本(相当于手动轮换)
aws kms create-key --description "新版本密钥"

自动轮换的好处是:旧密钥版本仍然可以解密历史数据,但新加密操作会使用新版本。说白了,就是无缝过渡。

4.3 Azure Key Vault 的基本使用

Azure Key Vault 和 AWS KMS 的思路不太一样。它更像一个「保险箱」——不光存密钥,还能存证书和机密(比如数据库密码)。我刚开始用的时候觉得它功能太多,后来发现其实挺方便的。

4.3.1 创建密钥保管库和密钥

在 Azure 里,你得先有个 Key Vault 实例,然后在里面创建密钥。我习惯用 Azure CLI 操作:

# 创建资源组
az group create --name MyKeyVaultRG --location eastus

# 创建 Key Vault
az keyvault create \
    --name my-secure-vault \
    --resource-group MyKeyVaultRG \
    --location eastus \
    --sku premium

# 创建密钥
az keyvault key create \
    --vault-name my-secure-vault \
    --name my-encryption-key \
    --protection hsm \
    --kty RSA-HSM \
    --size 4096

注意 --sku premium 和 --protection hsm 这两个参数。只有 Premium 层才支持 HSM 保护,Standard 层用的是软件保护。我个人建议,生产环境一定要用 Premium + HSM。

4.3.2 使用密钥加密数据

Azure Key Vault 的加密操作和 AWS 类似,但有个区别——它支持密钥标识符的概念。你可以通过版本号引用特定版本的密钥。

# 加密
az keyvault key encrypt \
    --vault-name my-secure-vault \
    --name my-encryption-key \
    --algorithm RSA-OAEP \
    --value "敏感数据" \
    --data-type plaintext

# 解密
az keyvault key decrypt \
    --vault-name my-secure-vault \
    --name my-encryption-key \
    --algorithm RSA-OAEP \
    --value "加密后的数据" \
    --data-type base64

小技巧:Azure Key Vault 支持软删除和清除保护。开启后,删除的密钥会保留 90 天,防止误删。我建议所有生产环境的 Key Vault 都开启这两个功能。

4.3.3 密钥轮换

Azure Key Vault 的自动轮换需要自己写逻辑。官方推荐用 Event Grid 监听密钥过期事件,然后触发 Azure Function 来创建新密钥。说白了,就是半自动。

我自己的做法是:用 Azure DevOps Pipeline 定期执行轮换脚本,每次轮换后更新密钥版本,然后通知相关应用重新加载配置。

4.4 阿里云 KMS 的基本使用

阿里云 KMS 和 AWS KMS 非常像,都是基于 HSM 的。如果你用过 AWS,上手阿里云会很快。但有几个细节不一样,我重点说一下。

4.4.1 创建密钥

阿里云 KMS 的密钥分为「默认密钥」和「用户主密钥」。默认密钥是阿里云服务(如 OSS、RDS)自动创建的,用户主密钥是你自己创建的。

# 使用阿里云 CLI 创建密钥
aliyun kms CreateKey \
    --KeySpec AES_256 \
    --KeyUsage ENCRYPT_DECRYPT \
    --Origin Aliyun_KMS \
    --Description "用于加密应用配置"

这里有个坑:阿里云 KMS 的 KeySpec 参数决定了密钥类型。AES_256 是对称密钥,RSA_2048 是非对称密钥。我建议大部分场景用 AES_256,性能更好。

4.4.2 使用密钥加密数据

阿里云 KMS 的加密操作和 AWS 几乎一样,也是用信封加密。但它的 SDK 封装得更好,你不需要手动处理数据密钥。

# 加密
aliyun kms Encrypt \
    --KeyId <key-id> \
    --Plaintext "敏感数据" \
    --EncryptionContext '{"department":"finance"}'

# 解密
aliyun kms Decrypt \
    --CiphertextBlob "加密后的数据" \
    --EncryptionContext '{"department":"finance"}'

阿里云 KMS 的独特功能:

  • BYOK(Bring Your Own Key):你可以导入自己的密钥材料到 HSM 中
  • 密钥标签:支持给密钥打标签,方便成本分摊和权限管理
  • 密钥托管:可以授权其他阿里云账号使用你的密钥

4.4.3 密钥轮换

阿里云 KMS 支持自动轮换,但需要手动开启。轮换周期可以设置为 365 天、180 天或 90 天。

# 开启自动轮换,周期 180 天
aliyun kms SetKeyRotationPolicy \
    --KeyId <key-id> \
    --EnableAutomaticRotation true \
    --RotationInterval 180

我个人建议,如果合规要求不严格,用 365 天就够了。但如果涉及金融或医疗数据,最好用 90 天。

4.5 三大云厂商 KMS 对比

为了方便你选择,我整理了一个对比表格:

特性 AWS KMS Azure Key Vault 阿里云 KMS
HSM 支持 默认 HSM Premium 层支持 默认 HSM
自动轮换 支持(每年一次) 需自定义 支持(可配置周期)
加密上下文 支持 不支持 支持
BYOK 支持 支持 支持
最大加密数据量 4KB 无限制(通过 SDK) 4KB
密钥别名 支持 不支持 支持

4.6 密钥轮换策略的最佳实践

密钥轮换是个老生常谈的话题,但真正做好的团队不多。我总结了几条经验:

  1. 自动轮换优于手动轮换:人总会忘,机器不会。能用自动轮换就别手动。
  2. 轮换周期要合理:太频繁影响性能,太稀疏增加风险。我一般建议 180 天。
  3. 旧密钥不要立即删除:保留至少一个轮换周期,确保历史数据都能解密。
  4. 轮换后更新依赖:如果应用缓存了密钥版本,轮换后要通知它们刷新。
  5. 审计轮换操作:每次轮换都要记录日志,方便事后追溯。

我曾经犯过的错:有一次我手动轮换了 AWS KMS 密钥,但忘了更新 Lambda 函数的权限。结果 Lambda 还在用旧密钥的权限,新密钥没有授权,导致线上服务中断了 10 分钟。从那以后,我每次轮换都会先检查权限策略,确保新旧密钥都有对应的授权。

4.7 本章知识体系

下面这张图总结了三大云厂商 KMS 的核心流程和轮换策略:

KMS 密钥生命周期与轮换策略 AWS KMS Azure Key Vault 阿里云 KMS 创建密钥 (create-key) 创建密钥 (az keyvault key create) 创建密钥 (CreateKey) 加密/解密 (encrypt/decrypt) 加密/解密 (key encrypt/decrypt) 加密/解密 (Encrypt/Decrypt) 自动轮换 (enable-key-rotation) 自定义轮换 (Event Grid + Function) 自动轮换 (SetKeyRotationPolicy) CloudTrail 审计 Azure Monitor 审计 操作审计 (ActionTrail) 核心原则:密钥永不离开 HSM,轮换后旧版本保留用于解密历史数据

从这张图可以看出,三大云厂商的 KMS 流程基本一致:创建密钥 → 使用密钥加密/解密 → 定期轮换 → 审计监控。区别主要在于轮换的实现方式和自动化程度。

好了,这一章的内容就到这里。密钥管理是个细活,但只要你用好 KMS,就能把大部分风险挡在门外。记住:密钥不在你手里,才是最安全的。