创建第一个对称 CMK
好,咱们开始动手了。
前面的章节聊了不少理论,我知道你肯定忍不住想:到底怎么在 AWS 控制台或者命令行里创建一把自己的主密钥?
别急,这一章我们就来实操。
我个人习惯把 CMK 叫做「钥匙的钥匙」。
它不直接加密你的数据,而是用来加密那些「真正加密数据的数据密钥」。
说白了,你创建好这把 CMK,后续所有密钥轮换、权限控制都围着它转。
我记得刚接触 KMS 的时候,总觉得创建 CMK 不就是点几个按钮嘛,有啥好学的?
结果有一次在生产环境里忘了禁用「密钥管理员」的删除权限,差点酿成大祸。
嗯,从那以后我每次创建 CMK 都会仔细确认所有选项。
对称 CMK 的核心概念
对称 CMK 意味着加密和解密用同一把密钥。
AWS KMS 帮你保管密钥材料,你永远拿不到它的明文。
你只能通过 API 调用去使用它——加密、解密、生成数据密钥。
对称 CMK 的特点:
- 密钥材料永不离岸,KMS 硬件安全模块(HSM)保护
- 支持自动轮换(每年一次)和手动轮换
- 费用:每月 1 USD(前 20 个免费),API 调用另计
- 最常用场景:S3 服务端加密、RDS 加密、Lambda 环境变量加密
你想想看,如果哪天你的应用需要对数据加密,但又不想自己管理密钥的存储和轮换,对称 CMK 就是最佳选择。
通过控制台创建对称 CMK
我会先演示 AWS 管理控制台的方式,因为它最直观。
等你看明白关键选项,我们再切到命令行。
步骤 1:进入 KMS 服务
在 AWS 控制台搜索「KMS」,点击进入。左侧菜单选择「客户管理型密钥」。
步骤 2:点击「创建密钥」
密钥类型选「对称」。
注意,一旦创建,对称 CMK 的密钥类型就不能改了。
步骤 3:配置别名和描述
别名建议遵循命名规范,比如:alias/prod-db-encryption-key。
我个人习惯在描述里注明用途、创建人和预计轮换周期。
步骤 4:定义密钥管理员
这里可以添加 IAM 用户或角色,他们能管理密钥的启用/禁用、设置轮换策略,但不能直接用密钥加解密。
避坑提示: 我曾经在测试环境直接把「密钥管理员」和「使用者」设为同一个角色,结果后续审计时发现权限没有分离,违反了最小权限原则。建议分开管理。
步骤 5:定义使用者
添加那些需要使用 CMK 进行加密/解密操作的角色或用户。
步骤 6:设置轮换策略
勾选「自动轮换」,KMS 每年自动生成新密钥材料,旧材料保留用于解密旧数据。
点击「完成」,一个对称 CMK 就诞生了。
通过 AWS CLI 创建对称 CMK
控制台适合学习,但自动化场景下,CLI 才是王道。
小技巧: 请确保你的 CLI 已经配置好凭证和默认区域。运行 aws sts get-caller-identity 验证身份。
创建命令很简单:
aws kms create-key \
--description "用于生产数据库加密的CMK" \
--key-usage ENCRYPT_DECRYPT \
--origin AWS_KMS \
--tags TagKey=Environment,TagKey=prod
命令会返回包含 KeyId 和 Arn 的 JSON。
拿到 KeyId 后,记得创建别名,不然你每次都要记一长串 UUID:
aws kms create-alias \
--alias-name alias/prod-db-key \
--target-key-id <你的KeyId>
为什么要单独创建别名?
原因很简单:应用程序里配置的是别名,轮换时只需要指向新的 CMK,不需要改代码。
创建时的关键选项对比
| 选项 | 控制台示例 | CLI 参数 | 注意事项 |
|---|---|---|---|
| 密钥类型 | 对称 | --key-spec SYMMETRIC_DEFAULT | 一旦创建不可更改 |
| 密钥用途 | 加密与解密 | --key-usage ENCRYPT_DECRYPT | 对称只能用于加解密 |
| 密钥材料来源 | AWS KMS | --origin AWS_KMS | 默认选项,也可选外部导入 |
| 标签 | 可选 | --tags | 建议加上,方便成本分摊 |
| 别名 | 创建时填写 | create-alias 单独命令 | 别名是软链接,可删除重建 |
核心流程:创建对称 CMK 的完整链路
下面这张 SVG 图把整个流程串起来,你一看就明白:
创建后的验证操作
我建议你拿到新 CMK 后立刻做两件事:
- 列出所有 CMK:
aws kms list-keys,确认你的 Key 在列表中。 - 加密一段测试数据:用
aws kms encrypt加密一个字符串,再解密回来,确保链路通畅。
命令示例:
# 加密
aws kms encrypt \
--key-id alias/prod-db-key \
--plaintext "Hello, KMS!" \
--output text \
--query CiphertextBlob > ciphertext.b64
# 解密
aws kms decrypt \
--ciphertext-blob fileb://ciphertext.b64 \
--output text \
--query Plaintext | base64 --decode
如果输出是 Hello, KMS!,恭喜你,第一个对称 CMK 创建成功。
经验之谈: 我在项目中经常遇到有人把 KeyId 和别名搞混。记住:Arn 是唯一标识,KeyId 是短 ID,别名只是便于管理的标签。代码里尽量用别名或 Arn,不要用 KeyId。
几个容易踩的坑
- 误删 CMK:KMS 默认有 7-30 天的等待期,但如果你取消计划删除,还能恢复。我曾经在测试环境手快点了「计划删除」,结果第二天才想起来,幸好还没到等待期。
- 跨区域调用:CMK 是区域资源,你创建在 us-east-1,就不能直接用 ap-southeast-1 的 API 调用它。需要在每个区域分别创建。
- 别名冲突:同一区域不允许两个 CMK 共用同一个别名。删除别名后,立即可以复用。
好了,现在你已经掌握了创建对称 CMK 的两种方式,也知道了背后的关键决策点。
接下来,你就可以基于这个 CMK 去加密你的数据了。
记住:密钥是安全的基础,创建时多花一分钟规划,后面能省一百分钟排错。