4. KMS密钥轮换:自动轮换策略、手动轮换场景、轮换对现有加密数据的影响

密钥轮换,说白了就是定期换锁。你想想看,一把锁用久了,总归有被破解的风险。云上的密钥也一样,虽然KMS底层做了大量保护,但安全最佳实践还是建议我们定期轮换。

这一章,我主要跟你聊聊轮换的两种玩法——自动和手动,以及轮换之后那些老数据怎么处理。这些都是我在生产环境里踩过的坑,希望能帮你少走弯路。

4.1 自动轮换策略:让系统帮你干活

我个人习惯,能用自动轮换的场合,绝不动手。KMS的自动轮换很省心,你配置好周期,剩下的交给系统。

自动轮换的核心逻辑:

  • KMS会为你的CMK创建新版本(Key Version),旧版本保留。
  • 加密时默认使用最新版本。
  • 解密时,KMS会自动识别数据是用哪个版本加密的。

关键点:自动轮换≠旧密钥失效。旧版本依然可用,只是不再用于加密新数据。

配置自动轮换(以AWS KMS为例):

# 启用自动轮换
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

轮换周期:AWS默认是每年一次。你可以用CloudWatch Events自己写定时任务,实现更灵活的周期。

我记得有一次,客户要求每90天轮换一次。嗯,AWS默认不支持改周期,我们就用了Lambda+EventBridge,每个月触发一次手动轮换。说白了,自动和手动结合才最灵活。

4.2 手动轮换场景:什么时候必须自己来?

自动轮换虽然好,但有些场景你必须亲自上手。我在项目中遇到过以下几种情况:

场景 说明 处理方式
合规要求 审计要求立即轮换,不等自动周期 立即创建新CMK,更新应用配置
密钥泄露风险 怀疑密钥被滥用 立即禁用旧密钥,创建新密钥
跨区域迁移 需要把密钥复制到其他区域 手动创建CMK,迁移数据后重新加密
版本回退 新密钥出问题,需要回滚 重新启用旧版本(如果未删除)

手动轮换的标准流程:

  1. 创建新CMK:用全新KeyId,别试图复用旧ID。
  2. 更新应用配置:把KeyId换成新的。
  3. 保留旧CMK:别急着删,旧数据还需要解密。
  4. 逐步迁移数据:用新密钥重新加密旧数据。
  5. 清理旧密钥:确认所有数据都迁移完后,再禁用并删除旧CMK。

我曾经遇到一个坑:手动轮换后,旧CMK的别名可能还在被引用。应用只改KeyId,没改别名,结果解密时还是走到了旧密钥。所以我建议:轮换时把别名也一并更新,或者直接删掉旧别名。

4.3 轮换对现有加密数据的影响

这个点,我觉得是本章最重要的。很多人以为轮换后旧数据就自动解密不了,其实不是。

对称加密:

  • 轮换后,旧版本CMK还在,解密不受影响。
  • 但加密新数据会使用新版本。
  • 旧数据卷,如果不重新加密,就会一直绑着旧版本。

非对称加密:

  • 私钥轮换后,旧私钥依然可以解密。
  • 公钥轮换后,新数据用新公钥加密,旧数据用旧私钥解密。
  • 签名验证也不受影响,新旧公钥都保留。

避坑指南:轮换不会自动重新加密你的数据。如果你有敏感数据需要重新加密,得单独写一个re-encryption任务。我个人习惯在轮换后一周内,把最近30天的数据重新加密一遍。

4.4 密钥轮换的生命周期管理

为了让你更直观地理解,我画了一张图。这张图展示了密钥从创建、轮换到退役的完整流程。

密钥轮换生命周期 创建CMK 初始版本 v1 自动轮换 新增版本 v2 手动轮换 新CMK v3 旧版本 v1、v2 继续保留,用于解密 退役旧版本 确认无数据引用后禁用/删除 数据重新加密 用新版本 v3 重新加密 提示: 退役旧版本前,务必确认所有依赖该密钥的数据已重新加密或解密完毕。

个人推荐:别把密钥轮换当成一次性任务。我建议你把它集成到CI/CD流水线里。每次发版时,检查一下当前密钥的创建时间,超过90天的自动触发轮换通知。这样既省心又合规。

4.5 轮换策略的选择建议

不同场景用不同策略,我整理了一个参考表:

业务场景 推荐策略 轮换周期 备注
通用数据加密 自动轮换 1年 省心,安全基线
金融/医疗 自动+手动结合 90天 合规要求高,手动应对紧急情况
核心数据库加密 手动轮换+维护窗口 按需 避免自动轮换影响读写性能
临时测试密钥 手动轮换 每次测试后 用完就换,避免遗留

为什么金融行业要用90天?我举个例子。你去银行办业务,银行柜员的系统密码是90天一换的。密钥轮换也是一样,缩短周期可以降低单个密钥泄露带来的影响范围。

记住了:轮换不是万能的。它只解决“密钥泄露”这一种风险。如果你遇到的是算法漏洞、实现漏洞,那得走升级CMK或迁移到新算法的路子。