在很多工程师的技术直觉里,AWS KMS(Key Management Service)只是一个提供加密接口的“大号 SDK”。

但这种理解,恰恰忽略了 KMS 在 AWS 安全体系中的真实位置,在 AWS 的设计哲学中,KMS 的核心价值并不在于“加密运算”而在于“授权与鉴权”。

**KMS 本质上是一套:**以 密钥 为资源中心、以 身份 为鉴权对象、以 策略 为授权规则的 云原生密钥鉴权体系

一、重新定义 KMS:它鉴权的核心不是“能不能加密”,而是“信不信任你”

如果我们把 AWS 的安全体系抽象成一套法律系统:

  • IAM 决定的是:

    你是谁?你主张自己能做什么?

  • KMS 决定的是:

    这把密钥,是否信任你代表它行使加解密能力?

这两者的区别非常关键。

IAM 是主体视角(Subject-centric), 而 KMS 是资源视角(Resource-centric)。

Key Policy 的存在,本质上是对密钥的一次“授权确认”。

Clipboard_Screenshot_1768276540

二、Key Policy:权限的“最终解释权”

Clipboard_Screenshot_1768276443

在绝大多数 AWS 服务中,IAM Policy 是权限判断的核心依据。 但在 KMS 中,这条规则被彻底打破:

如果 Key Policy 未授权,那么IAM权限无法对密钥进行管理和使用

在 AWS 中,IAM 负责身份意图,而对密钥、Secret 等高敏感资源,最终是否被信任,永远由资源自己的 Policy 来裁决

对于 KMS 来说,这是一种强制设计

IAM Policy vs Key Policy

  • IAM Policy
    • 表达“身份想做什么”
    • 由账号统一管理
    • 偏向意图声明
  • Key Policy
    • 表达“密钥信任谁”
    • 与密钥同生共死
    • 偏向资源鉴权

KMS 采用的是一种双向握手模型

身份声明 + 资源信任 = 有效权限

任何一环缺失,调用都会失败。

为什么这是必要的?

因为密钥是一种一旦失控即不可挽回的资产

如果仅依赖 IAM:

  • 管理员误授权 = 数据永久泄露
  • 权限漂移 = 无法感知
  • 回滚困难 = 无法止损

Key Policy 的存在,本质上是给密钥加上了一层不可被绕过的资源防火墙

三、控制面与数据面:KMS 最重要的信任分界线

要真正理解 KMS,必须明确一个核心划分:

管理密钥 ≠ 使用密钥

AWS 将这两种能力,刻意拆分为两个信任平面。

控制面(Control Plane):谁能“决定密钥的命运”

Clipboard_Screenshot_1768276610

控制面关心的是:

  • 谁能修改 Key Policy
  • 谁能轮转密钥
  • 谁能删除或禁用密钥

典型动作包括:

1
2
3
4
CreateKey
PutKeyPolicy
ScheduleKeyDeletion
RotateKeyOnDemand

这些权限通常只授予 Key Administrators

关键点在于:

拥有控制面权限的人,默认不具备任何加解密能力。

数据面(Data Plane):谁能“使用密钥的能力”

Clipboard_Screenshot_1768276663

数据面关心的是:

  • 谁能 Encrypt / Decrypt
  • 谁能 GenerateDataKey
  • 谁能 ReEncrypt

这些权限通常授予 Key Users

关键点在于:

使用密钥的人,无法改变密钥的任何生命周期状态。

这种拆分的安全意义

即使在极端情况下:

  • 运维人员被入侵
  • 控制面权限泄露

攻击者依然无法通过 KMS 解密任何业务数据

这是最小权限原则在云原生体系中的一次极致实践。

四、Key Policy 并不“独有”,但它最“彻底”

Key Policy 属于 Resource-based Policy 的一种。

类似的设计还包括:

  • S3 Bucket Policy
  • Secrets Manager Secret Policy
  • Lambda Resource Policy

KMS 的 Key Policy 有两个极端特性

  1. 强制存在 每一把 KMS Key 都必须有且只有一个 Key Policy
  2. 绝对权威 如果 Key Policy 不授权,IAM 权限完全失效

这使得 KMS 成为了 AWS 中基于资源授权最严格的服务。

五、读懂一份真实的 Key Policy:信任是如何被编码的

第一层:IAM 账号授权(Enable IAM)

1
2
3
4
5
6
7
8
9
    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::353472442111:root"
      },
      "Action": "kms:*",
      "Resource": "*"
    },

这不是给 Root 使用的权限,而是:

允许账号通过 IAM 间接管理这把密钥

如果缺失这一段:

  • 所有 IAM Policy 将失效
  • 密钥可能永久失控

这是 Key Policy 中最重要、也最容易被误删的一段

第二层:控制面授权(Key Administrators)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    {
      "Sid": "Allow access for Key Administrators",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::353472442111:user/bowenerchen",
          "arn:aws:iam::353472442111:role/AWS-QuickSetup-EnableJITNA-V2-LA-ap-northeast-1",
          "arn:aws:iam::353472442111:role/AWS-QuickSetup-JITNA-LocalAdministrationRole",
          "arn:aws:iam::353472442111:role/AWS-QuickSetup-JITNA-LocalExecutionRole"
        ]
      },
      "Action": [
        "kms:Create*",
        "kms:Describe*",
        "kms:Enable*",
        "kms:List*",
        "kms:Put*",
        "kms:Update*",
        "kms:Revoke*",
        "kms:Disable*",
        "kms:Get*",
        "kms:Delete*",
        "kms:TagResource",
        "kms:UntagResource",
        "kms:ScheduleKeyDeletion",
        "kms:CancelKeyDeletion",
        "kms:RotateKeyOnDemand"
      ],
      "Resource": "*"
    }

这一层定义的是:

谁能“管密钥”,而不是“用密钥”

它是防止密钥被误操作、误删除的第一道防线。

第三层:数据面授权(Key Users)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
    {
      "Sid": "Allow use of the key",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::353472442111:user/bowenerchen",
          "arn:aws:iam::353472442111:role/AWS-QuickSetup-EnableJITNA-V2-LA-ap-northeast-1",
          "arn:aws:iam::353472442111:role/AWS-QuickSetup-JITNA-LocalAdministrationRole",
          "arn:aws:iam::353472442111:role/AWS-QuickSetup-JITNA-LocalExecutionRole",
          "arn:aws:iam::353472442111:role/AWS-QuickSetup-SSM-DefaultEC2MgmtRole-ap-northeast-1"
        ]
      },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": "*"
    },

这里可以同时出现:

  • 人类用户
  • 应用角色
  • 云服务角色

他们在这一层的身份只有一个:Key User。

第四层:Grant —— 信任的工程化流转

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    {
      "Sid": "Allow attachment of persistent resources",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::353472442111:user/bowenerchen",
          "arn:aws:iam::353472442111:role/AWS-QuickSetup-EnableJITNA-V2-LA-ap-northeast-1",
          "arn:aws:iam::353472442111:role/AWS-QuickSetup-JITNA-LocalAdministrationRole",
          "arn:aws:iam::353472442111:role/AWS-QuickSetup-JITNA-LocalExecutionRole",
          "arn:aws:iam::353472442111:role/AWS-QuickSetup-SSM-DefaultEC2MgmtRole-ap-northeast-1"
        ]
      },
      "Action": [
        "kms:CreateGrant",
        "kms:ListGrants",
        "kms:RevokeGrant"
      ],
      "Resource": "*",
      "Condition": {
        "Bool": {
          "kms:GrantIsForAWSResource": "true"
        }
      }
    }

Grant 是 KMS 最容易被忽视、却最“云原生”的设计。

它解决的是:

如何在不修改 Key Policy 的前提下,让云服务安全地使用密钥

Grant 具备:

  • 临时性
  • 可撤销
  • 作用域明确

这是 KMS 能被 S3 / EBS / RDS 大规模集成的工程前提。

六、Quick Setup 与云服务角色:他们是谁?

在很多 Key Policy 中,你会看到一些“陌生角色”,例如:

1
2
3
     "arn:aws:iam::353472442111:role/AWS-QuickSetup-EnableJITNA-V2-LA-ap-northeast-1",
     "arn:aws:iam::353472442111:role/AWS-QuickSetup-JITNA-LocalAdministrationRole",
     "arn:aws:iam::353472442111:role/AWS-QuickSetup-JITNA-LocalExecutionRole"

这些角色是AWS 控制面代表某项托管能力运行时的执行身份

它们的特点是:

  • 不拥有密钥
  • 不持久化权限
  • 只能在 Key Policy 明确允许下,通过 Grant 使用密钥

它们本质上是:被密钥临时信任的“代理”。

七、为什么云产品必须“集成 KMS”

云服务不能被允许自行决定加密策略

如果:

  • RDS 自己生成主密钥
  • EBS 自己判断谁能解密
  • S3 自己管理密钥生命周期

那么:

  • 信任将碎片化
  • 权限不可统一审计
  • 撤权几乎不可能

KMS 的价值在于:

把所有加解密行为,统一拉回到“以密钥为中心”的鉴权体系中

这带来了:

  • 统一审计(CloudTrail)
  • 统一撤权(Disable / Revoke)
  • 统一信任模型(Key Policy + Grant)

八、IAM / Key Policy / Grant 的三层授权逻辑

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
┌────────────┐
│   IAM      │  ← 你是谁?你想做什么?
└─────┬──────┘
┌────────────┐
│ Key Policy │  ← 这把密钥信任你吗?
└─────┬──────┘
┌────────────┐
│   Grant    │  ← 临时、可撤销的能力借用
└────────────┘

这是 AWS 在不牺牲安全性的前提下,实现云规模自动化的核心机制。

  • IAM 负责身份合法性
  • Key Policy 负责密钥资源最终鉴权
  • Grant 负责信任下发

在 AWS 上,加密不是一个功能点,而是权限边界的自然延伸。