谁来管控密钥

开发者的 AWS 安全实践

Rahul Singh

Technical Product Manager

两类 KMS 密钥

AWS 托管

  • 由服务创建,别名 aws/s3
  • 策略可读不可改
  • 无月费

两张叠放的卡片,对比 AWS 托管密钥与客户托管密钥在三行要素上的差异:密钥策略、轮换与成本。客户托管卡片的密钥策略一行被高亮。每张卡片都显示其别名:aws 斜杠 s3 和 alias 斜杠 reports。

开发者的 AWS 安全实践

两类 KMS 密钥

AWS 托管

  • 由服务创建,别名 aws/s3
  • 策略可读不可改
  • 无月费

客户托管

  • 由您创建,别名 alias/reports,策略由您编写
  • 轮换周期由您设定
  • 每把密钥每月 1 美元

两张叠放的卡片,对比 AWS 托管密钥与客户托管密钥在三行要素上的差异:密钥策略、轮换与成本。客户托管卡片的密钥策略一行被高亮。每张卡片都显示其别名:aws 斜杠 s3 和 alias 斜杠 reports。

开发者的 AWS 安全实践

两道闸门,需同时放行

一个解密请求正接近两个闸门中的第一个。标号 1 的 IAM 策略闸门为实线,后面的密钥策略闸门为灰色虚线,二者都尚未给出回答。

  1. IAM 策略:调用方可请求的操作
开发者的 AWS 安全实践

两道闸门,需同时放行

一个解密请求从左至右通过两个标号闸门,1 为 IAM 策略,2 为密钥策略,之后到达 KMS 密钥。下方括号标注二者为独立判断。

  1. IAM 策略:调用方可请求的操作
  2. 密钥策略:密钥会回应的对象

默认密钥策略:委托给 IAM

授权(Grants):为单一主体授予特定密钥操作,可单独撤销

开发者的 AWS 安全实践

主密钥不直接接触您的数据

Amazon S3 代表您在标号 1 调用 AWS KMS,KMS 返回一把数据密钥的明文副本和加密副本。加密副本与对象密文一起存储,虚线回路在标号 2 通过解密调用取回。

信封加密(Envelope encryption)

直接加密:上限 4 KB

开发者的 AWS 安全实践

主密钥不直接接触您的数据

Amazon S3 代表您在标号 1 调用 AWS KMS,KMS 返回一把数据密钥的明文副本和加密副本。加密副本与对象密文一起存储,虚线回路在标号 2 通过解密调用取回。

信封加密(Envelope encryption)

直接加密:上限 4 KB

  1. GenerateDataKey,返回两份副本
  2. 对存储的副本执行 kms:Decrypt
开发者的 AWS 安全实践

跨账户时,双方各管一半

调用方账户

  • IAM 中允许相应操作
  • 资源:该密钥的 ARN

两个用虚线框出的账户面板,被账户边界分隔。上方面板放置调用方的角色与 IAM 策略;下方面板放置密钥策略与 KMS 密钥;请求跨越二者之间的边界。

开发者的 AWS 安全实践

跨账户时,双方各管一半

调用方账户

  • IAM 中允许相应操作
  • 资源:该密钥的 ARN

密钥所属账户

  • 在密钥策略中点名调用方
  • 可为整个账户,或其内某角色

两个用虚线框出的账户面板,被账户边界分隔。上方面板放置调用方的角色与 IAM 策略;下方面板放置密钥策略与 KMS 密钥;请求跨越二者之间的边界。

开发者的 AWS 安全实践

读拒绝信息,而非盲猜

基于身份

  • AccessDeniedException,随后给出指明闸门的子句

  • no identity-based policy allows

  • 修正调用方的 IAM 策略

 

解密请求被第一道闸门拦下;IAM 策略处打红叉,后方的密钥策略灰显且未被触达。图下注释为:no identity-based policy allows。

 

开发者的 AWS 安全实践

读拒绝信息,而非盲猜

基于身份

  • AccessDeniedException,随后给出指明闸门的子句

  • no identity-based policy allows

  • 修正调用方的 IAM 策略

基于资源

  • no resource-based policy allows
  • 修正密钥策略

解密请求被第一道闸门拦下;IAM 策略处打红叉,后方的密钥策略灰显且未被触达。图下注释为:no identity-based policy allows。

解密请求通过带绿勾的 IAM 策略后,被第二道闸门拦下;密钥策略处打红叉。图下注释为:no resource-based policy allows。

开发者的 AWS 安全实践

轮换实际改变了什么

自动轮换

  • 默认 365 天
  • 范围 90 至 2,560 天

三张卡片给出自动轮换的最小、默认与最大天数;其下三行展示哪些类型的密钥会轮换以及由谁安排。

开发者的 AWS 安全实践

轮换实际改变了什么

自动轮换

  • 默认 365 天
  • 范围 90 至 2,560 天

按需轮换

  • RotateKeyOnDemand,每把密钥最多 25 次

两项限制

  • AWS 托管密钥,固定每年一次
  • 自动轮换仅适用于对称、由 KMS 生成的材料

三张卡片给出自动轮换的最小、默认与最大天数;其下三行展示哪些类型的密钥会轮换以及由谁安排。

开发者的 AWS 安全实践

轮换无法修复的事

轮换线两侧对比四行。密钥材料从版本一变为版本二;而密钥标识符、别名与密钥策略,以及早期写入的对象在两侧均保持不变。

改变:底层密钥材料

不变:密钥 ID、ARN、别名、密钥策略

开发者的 AWS 安全实践

轮换无法修复的事

轮换线两侧对比四行。密钥材料从版本一变为版本二;而密钥标识符、别名与密钥策略,以及早期写入的对象在两侧均保持不变。

改变:底层密钥材料

不变:密钥 ID、ARN、别名、密钥策略

  • 您的代码无需改动
  • 旧对象与过宽策略:均不变
开发者的 AWS 安全实践

为何要开启轮换

价值所在

  • 单一版本不会覆盖全部数据
  • 满足强制轮换的合规与合同要求

绿色卡片标题为 价值所在,标签为 开启轮换。其给出审计规则"每 365 天轮换一次"并打勾;一把密钥显示为 v1、v2、v3 三个连续版本,注明各自仅覆盖其写入的数据。

开发者的 AWS 安全实践

为何要开启轮换

价值所在

  • 单一版本不会覆盖全部数据
  • 满足强制轮换的合规与合同要求

 

代价所在

  • 无需改代码,无需重加密

同样的绿色"价值所在"卡片,下方新增一张"代价所在"卡片。该卡两行:您的代码,保持不变;旧对象,无需重加密。

开发者的 AWS 安全实践

让我们一起练习吧!

开发者的 AWS 安全实践

Preparing Video For Download...