第3章 CMK(客户主密钥)简介:创建、轮换、禁用等操作及其日志记录

聊完DEK,咱们得说说它的"顶头上司"——CMK。我个人习惯把CMK看成一把"金钥匙",它不直接加密你的业务数据,而是加密那些负责加密数据的DEK。说白了,CMK就是加密密钥的密钥,在KMS体系里属于最顶层的根密钥。

很多云厂商都提供CMK托管服务,比如AWS的KMS、阿里云的KMS、腾讯云的Cloud HSM。你创建CMK之后,它的明文只有你能够控制(或者根本不存在明文),所有操作都有审计日志。嗯,这里要注意:CMK一旦创建,它的密钥材料是无法导出的——这是设计上故意的,为了安全。

3.1 CMK的生命周期:从生到死

一个CMK从创建到禁用/删除,会经历几个关键状态。我画了一张图帮你快速理解:

CMK 生命周期状态流转 等待创建 已启用 (Enabled) 已禁用 (Disabled) 轮换中 计划删除 创建 禁用 启用 轮换 完成 计划删除 注意:删除操作通常有等待期(如7~30天),期间可取消。 日志记录:每个状态变更都对应一个 CloudTrail / ActionTrail 事件。
个人经验:我在项目中遇到过有人暴力删除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 事件,包含调用者身份、创建时间、密钥类型等信息。

字段示例值说明
eventNameCreateKey操作名称
keyId1234abcd-12ab-34cd-56ef-1234567890ab生成的CMK ID
keySpecSYMMETRIC_DEFAULT密钥规格
keyUsageENCRYPT_DECRYPT用途
callerIdentityarn:aws:iam::123456789012:user/admin谁干的
避坑指南:我曾经在创建CMK时忘了指定描述信息,结果一堆测试密钥和生产密钥混在一起,后面排查日志时一头雾水。建议创建时强制加描述和标签,KMS支持给密钥打标签,别偷懒。

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 "轮换后新密钥"
重点:自动轮换不会废弃旧的密钥材料,而是保留历史版本的密钥。解密时CMK会自动回溯到正确的版本。日志里会记录每次轮换的时间点,你查询时可以用 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禁用了,导致所有应用异常。赶紧查日志,发现是一个误操作的脚本。从那以后我强制所有禁用操作都要走审批流,并且审计日志要实时告警。

操作日志事件名典型错误码
禁用DisableKeyKMSInvalidStateException
启用EnableKey-
计划删除ScheduleKeyDeletionKMSInvalidStateException(如密钥已禁用)
取消删除CancelKeyDeletion-
小技巧:你可以在日志服务中针对 DisableKey 设置一个警报,每次都邮件通知你。这样万一有人误操作,你能第一时间收到消息。

3.5 日志记录归纳:CMK全操作一览

下面我把CMK的常见操作及对应的审计日志事件名做成一张清单,方便你快速查阅:

  1. 创建 — CreateKey
  2. 开启自动轮换 — EnableKeyRotation
  3. 关闭自动轮换 — DisableKeyRotation
  4. 手动轮换 — 实际为 CreateKey(新密钥)
  5. 禁用 — DisableKey
  6. 启用 — EnableKey
  7. 计划删除 — ScheduleKeyDeletion
  8. 取消删除 — CancelKeyDeletion
  9. 修改描述 — UpdateKeyDescription
  10. 打标签 — TagResource

日志查询时,你可以用这些事件名做 eventName 过滤,再结合 requestParameters.keyId 定位到具体的CMK。嗯,这里要注意:不同云厂商的事件名可能略有差异(比如阿里云是 CreateKey 一样但前缀不同),但核心逻辑相通。

总结一下:CMK是全加密体系的"锚点",它自己的生命周期操作会生成清晰的审计日志。你把本章的这些事件名记牢,后面做DEK与CMK的关联查询时,就能快速从海量日志里揪出关键线索。