1、KMS概述与核心概念
做云上安全的人,十有八九绕不过 AWS KMS。我最早接触它是在一个金融项目里,客户要求所有信用卡号必须在存储前加密。那时候我满脑子想的都是「自建 HSM + 自己管理密钥」——但后来发现,KMS 这玩意儿确实省心多了。它不只是一个密钥仓库,更是一整套密钥生命周期管理的底座。
今天这一章,咱们先把地基打牢:KMS 到底干嘛的、主密钥和数据密钥是什么关系、以及那个听起来有点玄乎的「信封加密」到底怎么玩。
1.1 AWS KMS 是什么
AWS Key Management Service(KMS)说白了就是一个托管的密钥服务。你不需要自己搭 HSM,也不需要自己写密钥轮换的逻辑。它帮你创建、存储、轮换、审计密钥,还能跟其他 AWS 服务深度集成——比如 S3 的服务端加密、EBS 的加密卷、RDS 的加密存储,底层基本都是靠 KMS 来撑的。
我个人习惯把 KMS 比作一个「密钥保险柜」:你把最重要的主密钥放进去,剩下的加密操作都交给它。它不直接加密你的大文件或数据库记录,而是加密那些保护数据的小密钥。
- 创建和管理客户主密钥(CMK)
- 生成数据密钥(Data Key)用于本地加密
- 密钥自动轮换(每年或自定义周期)
- 与 CloudTrail 集成审计密钥使用情况
- 细粒度访问控制(IAM + KMS Policies)
1.2 CMK 与 Data Key 的区别
你可能会问:KMS 里面存的是 CMK(客户主密钥),但真正加密数据时用的却是 Data Key。为什么不直接用 CMK 加密数据?
嗯,这里有个关键点:CMK 的生命周期特别长,而且它本身不离开 KMS 服务。如果你拿 CMK 去加密一个 1TB 的文件,网络传输开销和性能损失都扛不住。Data Key 是临时生成的,用完就丢掉或加密存储,性能好得多。
看看下表就清楚了:
| 特性 | CMK(客户主密钥) | Data Key(数据密钥) |
|---|---|---|
| 存储位置 | 始终保存在 KMS 服务内 | 可被导出(加密后的密文可存本地) |
| 用途 | 用于加密 Data Key | 用于加密实际数据 |
| 生命周期 | 长期(可设定自动轮换) | 短暂(每次调用 GenerateDataKey 生成新的) |
| 性能 | 较慢(受 KMS API 调用限制) | 快速(本地使用对称算法) |
| 是否可导出明文 | ❌ 永远不能导出 | ✅ 可以(但建议只使用密文版本) |
1.3 加密服务模型:信封加密
信封加密(Envelope Encryption)是整个 KMS 加密模型的核心。名字挺形象——就像套娃一样,一层包一层。
具体流程:
- 你请求 KMS 生成一个 Data Key,KMS 返回两个版本:明文 Data Key(Plaintext)和加密后的 Data Key(CiphertextBlob,用 CMK 加密)。
- 应用程序用明文 Data Key 加密实际数据,得到密文。
- 丢弃明文 Data Key(只保留内存中的副本),把加密后的 Data Key 和密文一起存储。
- 解密时,先从存储中读取密文和加密后的 Data Key。
- 调用 KMS Decrypt,传入加密后的 Data Key,KMS 用 CMK 解密得到明文 Data Key。
- 用明文 Data Key 解密数据,然后立即丢弃明文 Data Key。
这样做的好处是:CMK 只在 KMS 内部流转,网络传输的都是密文或短命的明文 Key。而且你可以把同一份加密后的 Data Key 复制到多个地方,只要 CMK 在,就能解。
OK,至此第一章的核心概念就铺完了。你记住三个关键词就行:CMK 是根、Data Key 是工具、信封加密是兵法。后面章节我们会逐一深入,比如 CMK 的创建策略、自动轮换怎么配、以及如何用 KMS 做跨区域备份。不过那是后话,先把这个模型刻在脑子里再说。