在很多工程师的技术直觉里,AWS KMS(Key Management Service)只是一个提供加密接口的“大号 SDK”。
但这种理解,恰恰忽略了 KMS 在 AWS 安全体系中的真实位置,在 AWS 的设计哲学中,KMS 的核心价值并不在于“加密运算”而在于“授权与鉴权”。
**KMS 本质上是一套:**以 密钥 为资源中心、以 身份 为鉴权对象、以 策略 为授权规则的 云原生密钥鉴权体系。
一、重新定义 KMS:它鉴权的核心不是“能不能加密”,而是“信不信任你”
如果我们把 AWS 的安全体系抽象成一套法律系统:
IAM 决定的是:
你是谁?你主张自己能做什么?
KMS 决定的是:
这把密钥,是否信任你代表它行使加解密能力?
这两者的区别非常关键。
IAM 是主体视角(Subject-centric), 而 KMS 是资源视角(Resource-centric)。
Key Policy 的存在,本质上是对密钥的一次“授权确认”。

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

在绝大多数 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):谁能“决定密钥的命运”

控制面关心的是:
- 谁能修改 Key Policy
- 谁能轮转密钥
- 谁能删除或禁用密钥
典型动作包括:
| |
这些权限通常只授予 Key Administrators。
关键点在于:
拥有控制面权限的人,默认不具备任何加解密能力。
数据面(Data Plane):谁能“使用密钥的能力”

数据面关心的是:
- 谁能 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 有两个极端特性:
- 强制存在 每一把 KMS Key 都必须有且只有一个 Key Policy
- 绝对权威 如果 Key Policy 不授权,IAM 权限完全失效
这使得 KMS 成为了 AWS 中基于资源授权最严格的服务。
五、读懂一份真实的 Key Policy:信任是如何被编码的
第一层:IAM 账号授权(Enable IAM)
| |
这不是给 Root 使用的权限,而是:
允许账号通过 IAM 间接管理这把密钥
如果缺失这一段:
- 所有 IAM Policy 将失效
- 密钥可能永久失控
这是 Key Policy 中最重要、也最容易被误删的一段。
第二层:控制面授权(Key Administrators)
| |
这一层定义的是:
谁能“管密钥”,而不是“用密钥”
它是防止密钥被误操作、误删除的第一道防线。
第三层:数据面授权(Key Users)
| |
这里可以同时出现:
- 人类用户
- 应用角色
- 云服务角色
他们在这一层的身份只有一个:Key User。
第四层:Grant —— 信任的工程化流转
| |
Grant 是 KMS 最容易被忽视、却最“云原生”的设计。
它解决的是:
如何在不修改 Key Policy 的前提下,让云服务安全地使用密钥
Grant 具备:
- 临时性
- 可撤销
- 作用域明确
这是 KMS 能被 S3 / EBS / RDS 大规模集成的工程前提。
六、Quick Setup 与云服务角色:他们是谁?
在很多 Key Policy 中,你会看到一些“陌生角色”,例如:
| |
这些角色是AWS 控制面代表某项托管能力运行时的执行身份
它们的特点是:
- 不拥有密钥
- 不持久化权限
- 只能在 Key Policy 明确允许下,通过 Grant 使用密钥
它们本质上是:被密钥临时信任的“代理”。
七、为什么云产品必须“集成 KMS”
云服务不能被允许自行决定加密策略。
如果:
- RDS 自己生成主密钥
- EBS 自己判断谁能解密
- S3 自己管理密钥生命周期
那么:
- 信任将碎片化
- 权限不可统一审计
- 撤权几乎不可能
KMS 的价值在于:
把所有加解密行为,统一拉回到“以密钥为中心”的鉴权体系中
这带来了:
- 统一审计(CloudTrail)
- 统一撤权(Disable / Revoke)
- 统一信任模型(Key Policy + Grant)
八、IAM / Key Policy / Grant 的三层授权逻辑
| |
这是 AWS 在不牺牲安全性的前提下,实现云规模自动化的核心机制。
- IAM 负责身份合法性
- Key Policy 负责密钥资源最终鉴权
- Grant 负责信任下发
在 AWS 上,加密不是一个功能点,而是权限边界的自然延伸。