CMK与数据密钥:KMS的核心概念
说到KMS,很多人第一反应就是“加密的”。但真要动手做密钥轮换,你得先搞明白两个最基础的东西:CMK和数据密钥。这两个概念搞混了,后面的轮换策略就会跑偏。
我记得刚开始做AWS安全架构时,就吃过这个亏。当时我以为直接轮换CMK就万事大吉,结果发现加密的数据全都读不出来了。嗯,这节课咱们就把这两个概念彻底掰扯清楚。
什么是CMK(客户主密钥)
CMK,全称Customer Master Key。说白了,它就是你在KMS里创建的那个“根密钥”。你想想看,KMS所有加密操作的源头,其实都是CMK。
CMK有几个关键属性,我建议你记牢了:
| 属性 | 说明 | 我踩过的坑 |
|---|---|---|
| 密钥ID | 全局唯一标识符,例如 1234abcd-12ab-34cd-56ef-1234567890ab |
别用ID做显示,用户看不懂 |
| ARN | 资源名称,例如 arn:aws:kms:us-east-1:123456789012:key/1234abcd-... |
IAM策略里必须用ARN |
| 密钥规范 | AES-256(对称)或RSA-2048(非对称) | 对称密钥轮换简单,非对称要小心 |
| 密钥状态 | 启用、禁用、待删除、过期 | 别禁用还在用的CMK |
我个人习惯将CMK看作“保险箱的钥匙模板”。它不直接加密你的大文件,而是用来加密那些“真正干活”的密钥——数据密钥。
密钥状态与生命周期
CMK有几种状态,我在项目中遇到过客户因为搞混状态导致服务中断的情况。这里列出来,你注意看:
- 启用:正常使用状态。CMK可以用于加密和解密操作。
- 禁用:暂停使用。CMK无法执行任何加密操作,但数据还在。
- 待删除:设置删除等待期(7-30天)。期间可以取消删除。
- 过期:自定义密钥存储(Custom Key Store)中的CMK过期。
- 不可用:CMK被外部密钥管理器限制时出现。
什么是数据密钥
数据密钥(Data Key)才是真正用来加密你业务数据的“工作密钥”。它由KMS基于CMK生成,有两种形态:
- 明文数据密钥:用于加密数据,使用后应立即从内存中清除。
- 密文数据密钥:由CMK加密后的版本,可以安全存储。
你想想看为什么要区分这两种状态?因为它解决了一个核心问题:
你的数据可能很大(比如GB级文件),如果用CMK直接加密,每次都要请求KMS,性能和成本都受不了。数据密钥方案让加密操作本地化:用CMK生成数据密钥,然后用数据密钥在本地加解密数据。整个过程CMK只参与一次——生成密钥的时候。
| 对比项 | CMK | 数据密钥 |
|---|---|---|
| 存储位置 | KMS服务端 | 本地(密文形式) |
| 轮换方式 | 自动/手动创建新版本 | 重新生成即可 |
| 使用频率 | 低频(生成/解密数据密钥时) | 高频(加解密业务数据时) |
| 成本 | 按API调用次数计费 | 无额外KMS费用 |
| 安全边界 | 永不离开KMS | 明文只在内存中存在 |
CMK与数据密钥的关系
它们之间的协作流程,我用一个典型的加密场景来说明:
- 你的应用向KMS发起
GenerateDataKey请求,指定目标CMK。 - KMS使用CMK生成一个随机的数据密钥,返回明文和密文两个版本。
- 你用明文数据密钥在本地加密业务数据(比如一个文件)。
- 加密完成后,立即从内存中清除明文数据密钥。
- 密文数据密钥与加密后的数据一起存储(比如放在文件头或数据库字段中)。
- 解密时,读取密文数据密钥,调用KMS的
Decrypt还原出明文数据密钥。 - 用还原出的明文数据密钥解密业务数据。
说白了一句话概括就是:CMK保护数据密钥,数据密钥保护你的数据。这是一种分层密钥体系,也是KMS安全设计的精髓。
密钥轮换的切入点
理解了CMK和数据密钥的关系,咱们再来看密钥轮换就清晰多了:
- CMK轮换:KMS会自动创建新的密钥版本(每年一次),或者你可以手动创建。老的密钥版本保留,用于解密历史数据。
- 数据密钥轮换:每次加密新数据时,调用
GenerateDataKey生成新的密钥。旧的密文数据不受影响。
这里有一个容易被忽略的点:CMK轮换不会自动重新加密你的数据。你存储在S3或RDS里的加密数据,用的还是旧版本数据密钥加密的。要真正轮换数据密钥,需要重新加密数据。这个我们在后面的实操章节会专门讲。
- CMK是基础,数据密钥是工具
- CMK轮换创建新版本,不影响已有数据密钥
- 数据密钥轮换需要重新加密业务数据
- 分层密钥体系决定了轮换策略
好了,这是KMS的两个核心概念。CMK像是“密钥的总管”,数据密钥是真正干活的“工人”。搞懂它们的关系,后面的章节你就能理解为什么有些轮换策略复杂,有些简单。