2、创建对称密钥:对称CMK的创建步骤、密钥规格(AES_256)选择、密钥复用策略与别名建议
对称CMK,说白了就是一把既能锁又能开的钥匙。你在KMS里创建的第一个密钥,八成就是它。我见过不少团队刚上云时,觉得随便建一个密钥就行,结果后面权限混乱、别名冲突,全都得返工。这一节我把自己踩过的坑和总结的习惯都摊开聊,你照着做至少能省一半的后期维护成本。
创建对称CMK的步骤
步骤其实不难,但几个关键参数得搞明白。我用的是AWS控制台演示,CLI和SDK的原理一样。
- 登录KMS控制台,点击「创建密钥」。
- 选择密钥类型:选「对称」。别犹豫,非对称的用途完全不同,我们后面章节再讲。
- 密钥规格:选「AES_256」。实际上「SYMMETRIC_DEFAULT」也是AES_256,我习惯直接用AES_256,一目了然。
- 密钥用途:默认就是「加密和解密」,别改。
- 填写别名:这一步很关键,后面单独讲。
- 定义密钥管理员:谁可以修改、删除这个密钥。我建议至少加两个IAM用户或角色,防止单点故障。
- 定义使用权限:谁可以用这个密钥进行加密解密。这里按最小权限原则,只给真正需要的服务或用户。
- 完成创建:系统会生成一个Key ID(形如
1234abcd-12ab-34cd-56ef-1234567890ab),这个ID是永久不变的。
个人习惯:我创建完密钥后会立刻查看「密钥策略」选项卡,确认是否已经附加了正确的Resource-based policy。有些场景下默认策略不够用,比如需要跨账号授权。
CLI下创建更直接,一行搞定:
aws kms create-key \
--key-spec AES_256 \
--key-usage ENCRYPT_DECRYPT \
--description "生产环境支付数据主密钥" \
--tags Key=Environment,Value=prod
记得加上--tags,方便后面按标签筛选和审计。我刚开始没加,后来密钥多了,查起来像大海捞针。
密钥规格选择:为什么只有AES_256?
你可能会问:为什么AWS只给对称密钥提供AES_256?没有AES_128或192?
其实深层次的原因是:NIST和加密业界已经把AES-256定为对称加密的基准。128位虽然也能用,但考虑到后续合规和安全余量,AWS干脆统一用256位。而且KMS内部做了硬件加速,256位和128位的性能差距几乎可以忽略。
| KeySpec | 算法 | 实际长度 | 我的评价 |
|---|---|---|---|
SYMMETRIC_DEFAULT |
AES-GCM | 256位 | 和AES_256完全一样,只是名字不同 |
AES_256 |
AES-GCM | 256位 | 推荐使用,语义更明确 |
避坑提醒:SYMMETRIC_DEFAULT和AES_256在创建后无法互相转换。但功能上完全相同。我个人建议统一用AES_256,因为你在CloudTrail日志里看到它会直接知道这是对称密钥,不用猜。
密钥复用策略与别名建议
这是我在项目中看到翻车最多的环节。很多人图省事,一个CMK给所有服务用。结果有一天需要轮转密钥,或者某个应用要撤销权限,发现牵一发而动全身。
我的铁律:每个业务用途的密钥单独创建,绝不复用。
- 按环境隔离:开发、测试、生产各建一个CMK。
- 按数据域隔离:用户数据用A密钥,订单数据用B密钥,日志用C密钥。
- 按团队隔离:不同团队的密钥管理员分开,避免权限扩散。
别名(Alias)是KMS提供的一个强大工具——它本质是Key ID的指针,可以随时修改指向。我习惯用以下命名规范:
alias/<应用名>/<环境>/<数据用途>
举例:alias/payment/prod/customer-card
alias/analytics/dev/raw-log
alias/backup/staging/snapshot
千万不要把敏感信息放进别名。别名是明文存储在KMS的,任何有kms:ListAliases权限的人都能看到。我曾经见过有人把数据库密码片段放进别名……后来被安全团队通报批评。
另一个坑:别名可以指向已禁用的密钥。如果你不小心把密钥禁用了,但别名还挂着,调用加密解密时会直接失败。我的做法是:停用密钥前先删除或更换别名,避免产生“幽灵引用”。
别名的创建和更新通过CLI也很简单:
# 创建别名指向一个Key ID
aws kms create-alias \
--alias-name alias/payment/prod/customer-card \
--target-key-id 1234abcd-12ab-34cd-56ef-1234567890ab
# 修改别名指向另一个密钥
aws kms update-alias \
--alias-name alias/payment/prod/customer-card \
--target-key-id 5678efgh-12ab-34cd-56ef-1234567890cd
注意:别名在同一区域必须唯一,且创建后不可更改名称(只能删了重建)。所以我强烈建议团队内先定好命名规范,避免后期不一致。
对称CMK创建流程总览
下面这张图把整个创建到使用的关键步骤串了起来,方便你对照。
创建完成后记得做一件事:测试加密和解密。我习惯用AWS CLI验证一下:
# 加密一段明文
aws kms encrypt \
--key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
--plaintext fileb://plaintext.txt \
--output text \
--query CiphertextBlob | base64 --decode > encrypted.bin
# 解密
aws kms decrypt \
--ciphertext-blob fileb://encrypted.bin \
--output text \
--query Plaintext | base64 --decode