KMS密钥轮转操作实战课 - 第2节

一、AWS KMS 服务的总体架构

AWS KMS 说白了就是一个托管密钥中心。你不需要自己建 HSM 集群,也不用操心密钥怎么存、怎么换。KMS 把这些都包了。我刚开始接触时也有点懵——密钥到底放在哪?谁有权访问?后来拆开看了才发现,它的架构设计挺巧妙的。

一句话总结: KMS 是一个区域化、硬件隔离、全托管的密钥管理服务。它的核心是 CMK,所有操作都围着 CMK 转。

1.1 核心组件

  • 客户主密钥 (CMK) — 逻辑上的密钥容器,里面存的是真正的加密材料。CMK 可以自动轮转(一年一次),也可以手动创建。
  • 硬件安全模块 (HSM) — FIPS 140-2 Level 3 认证的硬件。密钥材料生成、解密操作都在 HSM 里完成,内存中不出现明文密钥。嗯,这里要留意:HSM 集群是跨可用区部署的,单点故障不会影响你。
  • 区域隔离 — 每个区域的 KMS 是完全独立的。密钥不能跨区域共享,除非你手动复制。
  • IAM 权限控制 — 谁能用哪个密钥,全走 IAM policy 和 key policy。我曾经见过团队把 key policy 写错了,结果其他账号调加密 API 一直报 AccessDenied,排查半天才发现是策略里少了 principal。

1.2 密钥层级

KMS 的密钥体系是分层的,你直接操作的是 CMK,但真正加密大量数据用的是数据密钥 (Data Key)。为什么这么设计?

原因很简单:CMK 加密解密很慢,而且有 API 调用限额。数据量一上来就得用对称加密的数据密钥。KMS 帮你生成数据密钥,你拿它去加密文件,用完就扔掉。下次加密再生成一把新的。

层级名称存储位置生命周期
L0主密钥 (CMK)KMS HSM长期,可自动轮转
L1数据密钥 (Data Key)由调用方管理(密文+明文)短,每次加密生成新密钥
L2加密后的数据S3 / EBS / 本地文件长期

我的习惯: 生产环境只用 AWS 托管的自动轮转 CMK(一年一次),省心。但如果你需要更频繁的轮转(比如每季度),那就得用自定义 CMK 配合 Lambda 自己实现轮转逻辑。我做过一个金融项目,合规要求密钥 90 天轮换一次,自动轮转满足不了,最后写了个 Step Functions 状态机来处理。

下面这张图帮你看清 KMS 的整体结构:

AWS KMS 架构图 应用程序 通过 AWS SDK / CLI 调用 KMS API KMS API Encrypt / Decrypt GenerateDataKey HSM 集群 FIPS 140-2 Level 3 密钥材料 加解密操作 CMK 存储 自动轮转(可选) 区域隔离 IAM 权限 Key Policy + IAM 数据密钥 明文 + 密文返回 CloudTrail 审计 记录所有 KMS 调用 要点 密钥材料永不离开 HSM 内存 数据密钥由应用程序在本地使用

二、AWS KMS 的主要功能

2.1 密钥创建与管理

你可以创建两种 CMK:AWS 托管(服务替你管)和客户托管(你自己管)。差别在哪?

  • AWS 托管 CMK — 不能手动轮转,不能修改 key policy,不能删除。适合“开箱即用”的场景,比如 S3 默认加密。
  • 客户托管 CMK — 完全控制。可以启停、轮转、配置别名、跨账号授权。我建议:如果你要对接合规审计,必须用客户托管。

2.2 加密解密操作

KMS 提供四个核心 API:Encrypt、Decrypt、GenerateDataKey、GenerateDataKeyWithoutPlaintext。前两个直接操作 CMK,后两个生成数据密钥。

我曾经踩过坑: 调用 Encrypt 时传了超过 1MB 的数据,结果报错。KMS 只支持 1MB 以内的数据直接加解密。大型文件必须用数据密钥 + 本地对称加密(比如 AES-256-GCM)。

2.3 自动密钥轮转

客户托管 CMK 可以开启自动轮转,每年换一次密钥材料。AWS 托管 CMK 的轮转由服务控制,你甚至不知道它什么时候换了。

轮转后的旧密钥材料会保留,用于解密历史数据。新数据默认用新材料加密。嗯,这里要强调:轮转不会影响现有加密数据,因为 Decrypt 会自动帮你找到对应的密钥版本。

2.4 集成服务

服务集成方式我的评价
S3服务端加密(SSE-KMS)最常用,但注意请求延迟比 SSE-S3 高一点
EBS加密卷(直接关联 CMK)冷启动时第一次读取会慢,之后有块缓存
RDS加密存储(TDE 走 KMS)性能开销很小,推荐开启
Lambda环境变量加密签名和加密分离,安全但要多一次 API 调用
Secrets Manager自动轮转 + KMS 加密我偏爱这个组合,比 Parameter Store 更可靠

三、典型使用场景

3.1 数据加密存储

最直接的场景:把 KMS 作为 S3 的加密钥匙。你上传文件时指定 aws:kms 作为加密方式,KMS 会自动生成数据密钥加密对象。我在一个日志归档项目里就是这样做的——每天 TB 级日志写入 S3,全量加密,性能几乎没影响。

3.2 应用层加密

如果你的应用需要自己控制加密粒度,比如只加密某些字段(信用卡号、身份证),那就用 KMS 生成数据密钥,在应用内存中完成加解密。注意:数据密钥的明文只在内存里存在,用完后要立马清零。

我建议: 用 GenerateDataKey 拿到密文和明文后,把密文和加密数据一起存起来,明文用完即焚。解密时再调用 Decrypt 把密文还原成明文密钥。这样数据密钥生命周期非常短,安全性高。

3.3 跨账号密钥共享

通过 key policy 授权其他账号使用你的 CMK。比如,让子账号的 S3 桶能加密写入主账号的 KMS 密钥。不过要注意:IAM 和 key policy 两端都必须放开,缺一个都会报 403。

我曾经见过: 团队只配了 key policy,忘了给子账号 IAM 权限。结果子账号调用 Encrypt 时一直说“权限不足”。排查了一个小时才发现是 IAM 里没加上 kms:Encrypt。记住:两边都得放行。

好了,以上就是 AWS KMS 的架构、功能和使用场景的全景视图。搞清楚这些,你后面学密钥轮转操作时会轻松很多。