第3章 CMK(客户主密钥)简介:创建、轮换、禁用等操作及其日志记录
聊完DEK,咱们得说说它的"顶头上司"——CMK。我个人习惯把CMK看成一把"金钥匙",它不直接加密你的业务数据,而是加密那些负责加密数据的DEK。说白了,CMK就是加密密钥的密钥,在KMS体系里属于最顶层的根密钥。
很多云厂商都提供CMK托管服务,比如AWS的KMS、阿里云的KMS、腾讯云的Cloud HSM。你创建CMK之后,它的明文只有你能够控制(或者根本不存在明文),所有操作都有审计日志。嗯,这里要注意:CMK一旦创建,它的密钥材料是无法导出的——这是设计上故意的,为了安全。
3.1 CMK的生命周期:从生到死
一个CMK从创建到禁用/删除,会经历几个关键状态。我画了一张图帮你快速理解:
3.2 创建CMK:第一步要谨慎
创建CMK的方式通常有两种:控制台创建、API/SDK创建。我一般推荐用代码创建,方便自动化。下面是一个AWS KMS通过CLI创建CMK的示例:
# 创建一个对称CMK(默认)
aws kms create-key --description "生产环境主密钥" --key-usage ENCRYPT_DECRYPT --origin AWS_KMS
# 创建一个非对称CMK(用于数字签名)
aws kms create-key --description "签名密钥" --key-usage SIGN_VERIFY --key-spec RSA_2048
创建完后,系统会返回一个KeyId和Arn。这个KeyId在后续所有操作中都会用到,我习惯把它存到环境变量里。日志方面,云厂商会在审计服务中记录 CreateKey 事件,包含调用者身份、创建时间、密钥类型等信息。
| 字段 | 示例值 | 说明 |
|---|---|---|
| eventName | CreateKey | 操作名称 |
| keyId | 1234abcd-12ab-34cd-56ef-1234567890ab | 生成的CMK ID |
| keySpec | SYMMETRIC_DEFAULT | 密钥规格 |
| keyUsage | ENCRYPT_DECRYPT | 用途 |
| callerIdentity | arn:aws:iam::123456789012:user/admin | 谁干的 |
3.3 轮换CMK:安全必修课
密钥轮换是安全合规的硬性要求。很多标准(如PCI DSS、SOC2)都要求定期轮换密钥。CMK轮换有两种模式:自动轮换和手动轮换。
- 自动轮换:每年轮换一次(AWS默认支持,阿里云也类似)。你只需在创建时开启自动轮换功能,KMS会替你生成新的密钥材料,但CMK的ID不变。
- 手动轮换:创建新CMK,然后更新应用中的引用。适合需要自定义轮换周期的场景。
轮换的日志非常关键。自动轮换时,审计日志里会出现 RotateKey 事件,记录轮换的密钥ID和时间。手动轮换则是先 CreateKey,然后你手动更新引用,日志里会有两笔记录。
# 开启自动轮换(AWS CLI)
aws kms enable-key-rotation --key-id 1234abcd-12ab-34cd-56ef-1234567890ab
# 手动轮换时,创建新密钥后用新KeyId替换旧引用
aws kms create-key --description "轮换后新密钥"
filter="{eventName:['RotateKey','CreateKey']}" 快速定位。3.4 禁用与启用CMK:临时止血
当怀疑密钥泄露或需要临时停止某个服务时,禁用CMK是常用的操作。禁用后,所有使用该CMK加密/解密的请求都会失败,返回 DisabledException。启用则恢复。
# 禁用CMK
aws kms disable-key --key-id 1234abcd-12ab-34cd-56ef-1234567890ab
# 启用CMK
aws kms enable-key --key-id 1234abcd-12ab-34cd-56ef-1234567890ab
禁用操作在日志里对应 DisableKey,启用是 EnableKey。我遇到过最头疼的场景:运维不小心把生产环境的CMK禁用了,导致所有应用异常。赶紧查日志,发现是一个误操作的脚本。从那以后我强制所有禁用操作都要走审批流,并且审计日志要实时告警。
| 操作 | 日志事件名 | 典型错误码 |
|---|---|---|
| 禁用 | DisableKey | KMSInvalidStateException |
| 启用 | EnableKey | - |
| 计划删除 | ScheduleKeyDeletion | KMSInvalidStateException(如密钥已禁用) |
| 取消删除 | CancelKeyDeletion | - |
DisableKey 设置一个警报,每次都邮件通知你。这样万一有人误操作,你能第一时间收到消息。3.5 日志记录归纳:CMK全操作一览
下面我把CMK的常见操作及对应的审计日志事件名做成一张清单,方便你快速查阅:
- 创建 —
CreateKey - 开启自动轮换 —
EnableKeyRotation - 关闭自动轮换 —
DisableKeyRotation - 手动轮换 — 实际为
CreateKey(新密钥) - 禁用 —
DisableKey - 启用 —
EnableKey - 计划删除 —
ScheduleKeyDeletion - 取消删除 —
CancelKeyDeletion - 修改描述 —
UpdateKeyDescription - 打标签 —
TagResource
日志查询时,你可以用这些事件名做 eventName 过滤,再结合 requestParameters.keyId 定位到具体的CMK。嗯,这里要注意:不同云厂商的事件名可能略有差异(比如阿里云是 CreateKey 一样但前缀不同),但核心逻辑相通。