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 的做法是「老钥匙留着开门,新钥匙用来锁门」。
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 # 自定义轮换周期
}
3.4 一个常见的坑:导入密钥材料的 CMK
我曾经在项目中踩过一个坑。客户有合规要求,必须使用自己生成的密钥材料,于是通过 import-key-material 导入到 KMS。结果发现自动轮换选项是灰色的,根本点不了。
为什么?因为 KMS 自动轮换的本质是「自动生成新的密钥材料」。如果你用的是自己导入的密钥材料,KMS 没有权限替你生成新的。这就好比你把自家锁芯换了,物业没法帮你自动换锁。
3.5 轮换对合规审计的影响
从合规角度看,自动轮换解决了两个核心问题:
- 密钥生命周期可追溯:每次轮换都会在 CloudTrail 中生成
RotateKey事件,审计员可以清楚看到「什么时候换了钥匙」。 - 降低密钥泄露影响面:即使某个版本的密钥材料泄露,攻击者也只能解密该版本加密的数据。新数据用的是新密钥,安全。
我记得有一次做 SOC 2 审计,审计员要求提供「密钥轮换策略文档」和「轮换执行记录」。如果你开启了自动轮换,CloudTrail 日志就是最好的证据。如果用手动轮换,你得自己写脚本记录每次操作,麻烦不少。
3.6 最佳实践建议
最后,给你几个我自己的实践建议:
- 能用自动就别用手动:自动轮换省心、可审计、不出错。手动轮换容易漏掉,或者忘记更新密钥材料。
- 轮换周期别太短也别太长:90 天对于大多数场景足够安全,365 天是默认值。太短(比如 30 天)会增加 CloudTrail 日志量和密钥版本管理复杂度。
- 定期验证解密能力:开启自动轮换后,建议每季度做一次解密测试,确保旧版本密钥材料仍然可用。别等到数据恢复时才发现问题。
- 监控轮换失败事件:在 CloudWatch 中设置告警,监控
RotateKey操作是否成功。如果轮换失败,你需要及时介入。