3. AWS KMS 自动轮换:托管密钥与客户管理密钥的轮换机制

密钥轮换这件事,说白了就是「定期换锁」。你想想看,一把锁用久了,总归有被配出钥匙的风险。AWS KMS 的自动轮换,就是帮你定期换锁,而且换锁的过程对上层应用完全透明。

我个人习惯把 KMS 的密钥分成两类来讨论:AWS 托管密钥和客户管理密钥。这两者的轮换机制,差异还挺大的。

3.1 两类密钥的轮换能力对比

先看一张对比表,心里有个底:

特性 AWS 托管密钥 客户管理密钥 (CMK)
自动轮换 ✅ 强制启用,不可关闭 ✅ 可选,默认关闭
轮换周期 约 3 年(1095 天) 可配置,默认 365 天
轮换策略自定义 ❌ 不支持 ✅ 支持自定义轮换频率
密钥材料导入 ❌ 不支持 ✅ 支持(导入后自动轮换不可用)
费用 免费 按 KMS 密钥计费

嗯,这里要注意:AWS 托管密钥的轮换周期是固定的 3 年多,这个时间对于很多合规标准来说其实偏长。我记得有一次帮客户做 PCI DSS 审计,审计员直接问:「你们 KMS 密钥多久轮换一次?」客户答「3 年」,对方当场就皱眉头了。

3.2 自动轮换的工作原理

KMS 的自动轮换,并不是把原来的密钥删掉重建。它采用的是「多版本密钥」机制。

每次轮换时,KMS 会生成一个新的密钥材料,并关联到同一个密钥 ID(Key ID)上。老的密钥材料保留,用于解密旧数据。新的加密操作默认使用最新的密钥材料。

我画了一张图,帮你理解这个流程:

KMS 自动轮换:多版本密钥机制 初始密钥 v1 轮换后 v2 轮换后 v3 当前 v4 🔒 加密操作: 新数据加密 → 自动使用当前最新版本(v4) 🔓 解密操作: 旧数据解密 → 自动查找对应版本的密钥材料(v1~v4 均可) 💡 密钥 ID 不变,应用程序无需修改代码。轮换对业务完全透明。

这个设计很巧妙。你想想看,如果轮换直接把旧密钥删了,那所有用旧密钥加密的数据就全废了。KMS 的做法是「老钥匙留着开门,新钥匙用来锁门」。

3.3 启用客户管理密钥的自动轮换

对于客户管理密钥,AWS 默认不开启自动轮换。你需要手动启用。我个人建议:只要合规要求允许,就打开它。

启用方式很简单,可以通过 AWS 控制台、CLI 或 SDK:

# 通过 AWS CLI 启用自动轮换
aws kms enable-key-rotation --key-id 1234abcd-12ab-34cd-56ef-1234567890ab

# 验证是否启用
aws kms get-key-rotation-status --key-id 1234abcd-12ab-34cd-56ef-1234567890ab
# 返回: { "KeyRotationEnabled": true }

如果你用 Terraform 管理基础设施,可以这样配置:

resource "aws_kms_key" "my_key" {
  description             = "用于加密敏感数据的 CMK"
  deletion_window_in_days = 30
  enable_key_rotation     = true  # 开启自动轮换
  rotation_period_in_days = 365   # 自定义轮换周期
}
💡 小提示: 从 2023 年开始,AWS 支持自定义轮换周期(rotation_period_in_days),范围是 90 到 2560 天。如果你需要更频繁的轮换,比如每 90 天一次,现在可以做到了。

3.4 一个常见的坑:导入密钥材料的 CMK

我曾经在项目中踩过一个坑。客户有合规要求,必须使用自己生成的密钥材料,于是通过 import-key-material 导入到 KMS。结果发现自动轮换选项是灰色的,根本点不了。

为什么?因为 KMS 自动轮换的本质是「自动生成新的密钥材料」。如果你用的是自己导入的密钥材料,KMS 没有权限替你生成新的。这就好比你把自家锁芯换了,物业没法帮你自动换锁。

⚠️ 重要警告: 如果你使用导入密钥材料的 CMK,自动轮换功能不可用。你必须手动导入新的密钥材料来实现轮换。而且,每次手动轮换时,旧密钥材料会被标记为「待删除」,你需要确保所有用旧密钥加密的数据都已经重新加密。

3.5 轮换对合规审计的影响

从合规角度看,自动轮换解决了两个核心问题:

  1. 密钥生命周期可追溯:每次轮换都会在 CloudTrail 中生成 RotateKey 事件,审计员可以清楚看到「什么时候换了钥匙」。
  2. 降低密钥泄露影响面:即使某个版本的密钥材料泄露,攻击者也只能解密该版本加密的数据。新数据用的是新密钥,安全。

我记得有一次做 SOC 2 审计,审计员要求提供「密钥轮换策略文档」和「轮换执行记录」。如果你开启了自动轮换,CloudTrail 日志就是最好的证据。如果用手动轮换,你得自己写脚本记录每次操作,麻烦不少。

3.6 最佳实践建议

最后,给你几个我自己的实践建议:

  • 能用自动就别用手动:自动轮换省心、可审计、不出错。手动轮换容易漏掉,或者忘记更新密钥材料。
  • 轮换周期别太短也别太长:90 天对于大多数场景足够安全,365 天是默认值。太短(比如 30 天)会增加 CloudTrail 日志量和密钥版本管理复杂度。
  • 定期验证解密能力:开启自动轮换后,建议每季度做一次解密测试,确保旧版本密钥材料仍然可用。别等到数据恢复时才发现问题。
  • 监控轮换失败事件:在 CloudWatch 中设置告警,监控 RotateKey 操作是否成功。如果轮换失败,你需要及时介入。
📌 核心要点: AWS KMS 自动轮换采用多版本密钥机制,加密用最新版本,解密兼容所有历史版本。客户管理密钥支持自定义轮换周期,但导入密钥材料的 CMK 无法使用自动轮换。从合规角度看,自动轮换是满足「密钥定期更换」要求的最简单方式。