第4章:AWS KMS入门——创建CMK、授权策略与控制台基本操作

聊到KMS(Key Management Service),说白了就是AWS生态里管密钥的大管家。很多新手以为KMS就是一键生成密钥,再一键调用加密就行了。实际上,我当年做第一个加密合规项目时就在这上面栽过跟头——光AWS的文档就啃了好几天,才把CMK(Customer Master Key)和授权策略的逻辑理清楚。

那今天咱们就亲手走一遍。用KMS控制台,从零创建一个CMK,再把权限策略配明白。我保证,这章走完,你再看KMS文档就不会觉得头大了。

4.1 创建CMK:不是点一下“生成密钥”那么简单

CMK是KMS的核心。所有加密、解密、签名、验证,说到底都靠这个主密钥。注意,它不是你直接拿来加密明文的那个密钥——CMK是用来保护下级数据密钥(Data Key)的根密钥。嗯,这点区分很重要。

一句话记住CMK的作用:你用它不是加密数据,而是加密“用来加解密数据的密钥”。

4.1.1 创建流程(控制台)

  1. 登陆KMS控制台,默认进到“客户托管密钥”页面。
  2. 点击“创建密钥”——注意有两个选项:“对称” 和 “非对称”。
  3. 填写别名和描述。我个人习惯把别名写成alias/项目-环境-用途,比如alias/payment-prod-encrypt,时间一长也好检索。
  4. 选择密钥管理员——哪些IAM用户可以管理这个密钥(开启、禁用、轮转)。
  5. 选择密钥使用者——哪些IAM用户或角色能用这个密钥进行加密/解密操作。
  6. 预览确认,点击完成。

创建出来的CMK默认处于已启用(Enabled) 状态。但别急,这时候它还不能用——你得先想好谁有权限碰它。

4.1.2 对称 vs 非对称:我建议你选对称

属性 对称CMK 非对称CMK
密钥用途 加密/解密 加解密、签名/验签
密钥材料在KMS内 是(不可导出) 是(不可导出私钥)
适合场景 大量数据加密、S3 SSE-KMS 数字签名、外部用户公钥加密
轮转支持 自动轮转(每年一次) 手动轮转
API操作 Encrypt / Decrypt Sign / Verify / Encrypt / Decrypt

大多数场景下,我建议直接用对称CMK。原因很简单:自动轮转省心,API调用统一。非对称CMK我只在需要对外分发公钥的签名场景里才用。你想想看,如果你的微服务和外部系统做加解密,对方只持有你的公钥,那非对称确实更优雅;但内部服务间全是IAM可控的,对称完全是第一选择。

我踩过的一个坑:创建CMK时选了“自动轮转”,但下游应用只保留了一次密钥缓存,结果轮转后加密还能跑,解密全挂了。后来我给所有调用方加了一个KeyId参数——不用alias,用KEY ID——这样即使轮转了也不会拿错密钥版本。

4.2 授权策略:密钥策略 vs IAM策略,到底听谁的?

KMS的授权模型刚开始看确实绕。它不像S3那样只有资源策略,它有两套策略体系——密钥策略(Key Policy)和IAM策略(IAM Policy)。说白了,一套是“谁可以怎么用这把锁”,另一套是“谁能碰这台服务器”。两套加一起,才决定最终权限。

4.2.1 密钥策略(Key Policy)

这是CMK自带的资源策略。每个CMK创建时必须指定一个密钥策略(最少提供一个默认的)。它直接绑定在CMK上,不管IAM那边怎么说,密钥策略说不允许就不允许。

4.2.2 IAM策略(IAM Policy)

这是挂在用户/角色上的身份策略。如果CMK的密钥策略已经允许了某个IAM用户,那这个用户必须还要有IAM层面的kms权限才能实际调用。两者是“与”关系:必须两边的allow都匹配,才算有权限。

千万别犯这种错:密钥策略里允许了IAM用户A,但A的IAM策略里没有任何KMS相关的Allow,结果A调取kms:Encrypt永远是AccessDenied。我当时排查了半小时才意识到——IAM账号没给权限,资源策略给的再宽也没用。

4.2.3 核心决策规则

  • 密钥策略没有显式Allow → 直接Deny(哪怕IAM策略给了Allow也不行)
  • 密钥策略有Allow + IAM策略也Allow → 最终Permit
  • 密钥策略Allow + IAM策略Deny → 最终Deny
  • 密钥策略默认拒绝所有非根用户(创建时只能选账户根用户或指定IAM ARN)

4.2.4 实战写法:密钥策略片段

{
  "Version": "2012-10-17",
  "Id": "key-policy-payment-prod",
  "Statement": [
    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": "kms:*",
      "Resource": "*"
    },
    {
      "Sid": "Allow use of the key",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/PaymentAppRole"
      },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:GenerateDataKey"
      ],
      "Resource": "*"
    }
  ]
}

看到第二条没?我只给了PaymentAppRole三个操作,没给kms:ScheduleKeyDeletion——这样一来,即使有安全事件,应用层也删不了CMK。这是我在生产环境中建议的做做法:最小化使用者权限,永远不给删除和禁用。

4.3 控制台基本操作:该知道的几个入口

把CMK创建出来只是第一步。KMS控制台里还有几个高频操作,我简单说一下。

4.3.1 查看密钥状态

密钥列表里能直接看到五种状态:已启用、已禁用、待删除、已轮转、不可用。其中“待删除”的密钥可以指定7~30天的等待期——我建议至少设30天,给自己留够回退时间。

4.3.2 别名管理

你可以在密钥详情页的“别名”标签里添加、修改、删除别名。别名的好处是应用层可以用别名调用KMS,不需要关心KEY ID。万一哪天重新建了CMK,把别名指向新KEY ID,应用无须改代码。

4.3.3 启用/禁用/计划删除

  • 禁用:立即生效,所有加解密API调用都失败。生产环境慎用。
  • 计划删除:设一个等待期,到期自动删除。删除后数据不可恢复(除非你有备份密钥材料)。

4.3.4 轮转

对称CMK支持自动轮转(每年一次,免费)。如果你需要更细粒度的轮转周期,可以走自定义密钥轮转——不过那就得自己管版本了。

4.4 本章知识脉络图

下面这张图把CMK创建、授权策略、控制台操作串成一个完整的逻辑链路。我建议你先看一遍,再回到小节里对应着查漏补缺。

CMK创建与权限体系流程图 CMK 创建 · 授权策略 · 控制台操作 知识体系 创建CMK 对称 / 非对称 密钥类型选择 对称(推荐)| 非对称 别名 & 描述 alias/项目-环境-用途 授权策略配置 密钥策略 + IAM策略(与关系) 密钥管理员 管理操作(开启/禁用/轮转) 密钥使用者 加密/解密/生成数据密钥 控制台操作 启用/禁用/计划删除/轮转/别名管理 注意:授权策略采用“与”逻辑——key policy 和 IAM policy 必须同时允许 控制台所有操作必须经过双重权限校验
我个人建议:先把上图的“授权策略”部分仔细过一遍,再去控制台实操。先搞清楚原则,再动手就不会被AccessDenied打懵。