KMS密钥轮转操作实战课 - 第2节
一、AWS KMS 服务的总体架构
AWS KMS 说白了就是一个托管密钥中心。你不需要自己建 HSM 集群,也不用操心密钥怎么存、怎么换。KMS 把这些都包了。我刚开始接触时也有点懵——密钥到底放在哪?谁有权访问?后来拆开看了才发现,它的架构设计挺巧妙的。
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 的主要功能
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 的架构、功能和使用场景的全景视图。搞清楚这些,你后面学密钥轮转操作时会轻松很多。