2、创建对称密钥:对称CMK的创建步骤、密钥规格(AES_256)选择、密钥复用策略与别名建议

对称CMK,说白了就是一把既能锁又能开的钥匙。你在KMS里创建的第一个密钥,八成就是它。我见过不少团队刚上云时,觉得随便建一个密钥就行,结果后面权限混乱、别名冲突,全都得返工。这一节我把自己踩过的坑和总结的习惯都摊开聊,你照着做至少能省一半的后期维护成本。

创建对称CMK的步骤

步骤其实不难,但几个关键参数得搞明白。我用的是AWS控制台演示,CLI和SDK的原理一样。

  1. 登录KMS控制台,点击「创建密钥」。
  2. 选择密钥类型:选「对称」。别犹豫,非对称的用途完全不同,我们后面章节再讲。
  3. 密钥规格:选「AES_256」。实际上「SYMMETRIC_DEFAULT」也是AES_256,我习惯直接用AES_256,一目了然。
  4. 密钥用途:默认就是「加密和解密」,别改。
  5. 填写别名:这一步很关键,后面单独讲。
  6. 定义密钥管理员:谁可以修改、删除这个密钥。我建议至少加两个IAM用户或角色,防止单点故障。
  7. 定义使用权限:谁可以用这个密钥进行加密解密。这里按最小权限原则,只给真正需要的服务或用户。
  8. 完成创建:系统会生成一个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创建流程总览

下面这张图把整个创建到使用的关键步骤串了起来,方便你对照。

对称CMK创建流程与关键决策点 发起创建密钥请求 密钥规格:AES_256 用途:加密 / 解密 设置别名 & 标签 定义管理员 & 使用者 ⚠️ 注意 • 规格创建后不可更改 • 别名全局唯一 • 权限需要最小化 • 建议添加Environment标签 图:对称CMK创建流程,从请求到权限定义共5个关键步骤

创建完成后记得做一件事:测试加密和解密。我习惯用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