AWS Key Management Service
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 AWS KMS 中的密钥策略

密钥策略是在 AWS KMS 中控制对客户主密钥 (CMK) 的访问的主要方式。它们不是控制访问的唯一方式,但如果没有它们,您就无法控制访问。有关更多信息,请参阅管理对 AWS KMS CMK 的访问

密钥策略概述

密钥策略是一个文档,该文档使用 JSON (JavaScript 对象表示法) 指定权限。您可以直接使用这些 JSON 文档,也可以通过 AWS 管理控制台中名为默认视图的图形界面来使用这些文档。有关密钥策略的控制台默认视图的更多信息,请参阅默认密钥策略更改密钥策略

密钥策略文档不能超过 32 KB(32,768 字节)。密钥策略文档与 AWS 中的其他权限策略使用相同的 JSON 语法,并且具有以下基本结构:

{ "Version": "2012-10-17", "Statement": [{ "Sid": "statement identifier", "Effect": "effect", "Principal": "principal", "Action": "action", "Resource": "resource", "Condition": {"condition operator": {"condition context key": "context key value"}} }] }

密钥策略文档必须有一个 Version 元素。我们建议将版本设置为 2012-10-17 (最新版本)。此外,密钥策略文档还必须具有一个或多个语句,且每个语句最多包含六个元素:

  • Sid –(可选)Sid 是一个语句标识符,是可用于标识语句的任意字符串。

  • Effect –(必需)Effect 指定是允许还是拒绝该策略语句中的权限。Effect 必须为 Allow 或 Deny。如果您没有显式允许对 CMK 的访问,则隐式拒绝访问。您也可显式拒绝对 CMK 的访问。您可以通过这种方式确保用户无法访问 CMK,即使其他策略允许访问也是如此。

  • Principal –(必需)Principal 是获取策略语句中指定的权限的身份。您可以指定 AWS 账户(根)、IAM 用户、IAM 角色和一些 AWS 服务作为密钥策略中的委托人。IAM 组不是有效的委托人。

    注意

    请不要在任何允许权限的关键策略语句中将委托人设置为星号 (*)。星号向每个 AWS 账户中的每个身份授予 CMK 的使用权限,除非另一个策略语句明确拒绝此权限。其他 AWS 账户中的用户只需要他们自己账户中的相应 IAM 权限便能使用 CMK。

  • Action –(必需)Action 指定要允许或拒绝的 API 操作。例如,kms:Encrypt 操作对应于 AWS KMS Encrypt API 操作。您可以在策略语句中列出多个 Action。有关更多信息,请参阅AWS KMS API 权限参考

  • Resource –(必需)在密钥策略中,使用 "*" 表示资源,意味着“此 CMK”。 密钥策略仅适用于它附加到的 CMK。

  • Condition –(可选)Condition 指定要使密钥策略生效而必须满足的要求。通过使用条件,AWS 可评估 API 请求的上下文,以确定策略语句是否适用。有关更多信息,请参阅使用策略条件

有关 AWS 策略语法的更多信息,请参阅 IAM 用户指南 中的 AWS IAM 策略参考

默认密钥策略

以编程方式创建 CMK 时采用的默认密钥策略

当您以编程方式 — 即利用 AWS KMS API(包括通过 AWS 开发工具包命令行工具)创建 CMK 时 — 您可以选择为新 CMK 提供密钥策略。如果您未提供密钥策略,则 AWS KMS 将为您创建一个。此默认密钥策略包含一个策略语句,此语句为 CMK 提供拥有 CMK 完全访问权限的 AWS 账户(根用户),并在账户中启用 IAM 策略以允许访问 CMK。有关此策略语句的更多信息,请参阅允许访问 AWS 账户并启用 IAM 策略

通过 AWS 管理控制台创建 CMK 时采用的默认密钥策略

当您通过 AWS 管理控制台创建 CMK 时,您可以选择有权访问该 CMK 的 IAM 用户、IAM 角色和 AWS 账户。您选择的用户、角色和账户将添加到控制台为您创建的默认密钥策略中。借助控制台,您可以使用默认视图查看或修改此密钥策略,也可以直接使用密钥策略文档。控制台创建的默认密钥策略允许以下权限,其中每项权限都会在相应部分中进行说明。

允许访问 AWS 账户并启用 IAM 策略

此默认密钥策略为 CMK 提供拥有 CMK 完全访问权限的 AWS 账户(根用户),从而达到以下两个目的。

1.降低 CMK 变得不可管理的风险。

您无法删除 AWS 账户的根用户,因此向此用户授予访问权限可降低 CMK 变得不可管理的风险。请考虑以下情况:

  1. CMK 的密钥策略 允许一个 IAM 用户 (Alice) 管理 CMK。此密钥策略未向根用户授予访问权限。

  2. 有人删除了 IAM 用户 Alice。

在此情况下,CMK 现在无法管理,您必须联系 AWS Support 才能重新获得对 CMK 的访问权限。根用户无权访问 CMK,因为根用户仅在密钥策略显式允许它访问 CMK 时才能访问。这与 AWS 中的其他大多数资源不同,这些资源可向根用户隐式授予访问权限。

2.启用 IAM 策略以允许访问 CMK。

IAM 策略本身不足以允许对 CMK 的访问。但是,如果 CMK 密钥策略启用了该策略,您就可以将它们与密钥策略配合使用。向 AWS 账户授予对 CMK 的完全访问权限即可实现这一点;这样一来,您就可以使用 IAM 策略向账户中的 IAM 用户和角色授予对 CMK 的访问权限。这种操作本身并不能向任何 IAM 用户或角色授予对 CMK 的访问权限,但让您能够借助 IAM 策略来实现这一目的。有关更多信息,请参阅管理对 AWS KMS CMK 的访问

以下示例显示的是向 AWS 账户授予访问权限并因此启用 IAM 策略的策略语句。

{ "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:root"}, "Action": "kms:*", "Resource": "*" }

允许密钥管理员管理 CMK

控制台创建的默认密钥策略允许您选择账户中的 IAM 用户和角色,并使其成为密钥管理员。密钥管理员有权管理 CMK,但无权使用 CMK 加密和解密数据。

警告

虽然密钥管理员无权使用 CMK 加密和解密数据,但是他们有权修改密钥策略。这意味着他们可以向自己授予这些权限。

在创建 CMK 时,您可以将 IAM 用户和角色添加到密钥管理员列表。您也可以使用控制台的默认密钥策略视图来编辑该列表,如下图所示。默认密钥策略视图可从每个 CMK 的密钥详细信息页面获取。


          控制台默认密钥策略中的密钥管理员,默认视图

当您使用控制台的默认视图来修改密钥管理员列表时,控制台会修改密钥策略中特定语句中的 Principal 元素。此语句称为密钥管理员语句。以下示例显示了密钥管理员语句。

{ "Sid": "Allow access for Key Administrators", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/KMSAdminUser", "arn:aws:iam::111122223333:role/KMSAdminRole" ]}, "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" ], "Resource": "*" }

此密钥管理员语句允许以下权限:

  • kms:Create* – 允许密钥管理员为此 CMK 创建别名和授权

  • kms:Describe* – 允许密钥管理员检索有关此 CMK 的信息,其中包括其标识符、创建日期、状态等。要在 AWS 管理控制台中查看密钥详细信息页面,需要获得此权限。

  • kms:Enable* – 允许密钥管理员将此 CMK 的状态设置为已启用,并指定每年轮换 CMK 的密钥材料

  • kms:List* – 允许密钥管理员检索包含此 CMK 的别名、授权、密钥策略和标签的列表。要在 AWS 管理控制台中查看此 CMK 列表,需要获得此权限。

  • kms:Put* – 允许密钥管理员修改此 CMK 的密钥策略。

  • kms:Update* – 允许密钥管理员更改此 CMK 别名的目标,并修改此 CMK 的描述。

  • kms:Revoke* – 允许密钥管理员撤销通过授权授予的针对此 CMK 的权限。

  • kms:Disable* – 允许密钥管理员将此 CMK 的状态设置为已禁用,并禁止每年轮换此 CMK 的密钥材料

  • kms:Get* – 允许密钥管理员检索此 CMK 的密钥策略,以及确定此 CMK 的密钥材料是否每年轮换。如果此 CMK 的源是外部的,则还允许密钥管理员下载公有密钥,并导入此 CMK 的令牌。有关 CMK 源的更多信息,请参阅导入密钥材料

  • kms:Delete* – 允许密钥管理员删除指向此 CMK 的别名,如果此 CMK 的源是外部的,则还允许删除已导入的密钥材料。有关已导入密钥材料的更多信息,请参阅导入密钥材料。请注意,此权限不允许密钥管理员删除 CMK

  • kms:ImportKeyMaterial – 允许密钥管理员将密钥材料导入 CMK。

    注意

    以上示例策略语句中未显示此权限。此权限仅适用于其源是外部的 CMK。当您使用控制台创建不带密钥材料的 CMK 时,它会自动包含在密钥管理员语句中。有关更多信息,请参阅导入密钥材料

  • kms:TagResource – 允许密钥管理员为此 CMK 添加和更新标签。

  • kms:UntagResource – 允许密钥管理员删除此 CMK 的标签。

  • kms:ScheduleKeyDeletion – 允许密钥管理员删除此 CMK

  • kms:CancelKeyDeletion – 允许密钥管理员取消待处理的删除此 CMK 的操作。

当您创建 CMK 时,会默认包含以上列表中的最后两个权限 kms:ScheduleKeyDeletionkms:CancelKeyDeletion。不过,在创建 CMK 时,您可以通过清除允许密钥管理员删除此密钥对应的框,选择性地将其从密钥策略中删除。同样,您也可以通过密钥详细信息页面将其从现有 CMK 的默认密钥策略中删除。有关更多信息,请参阅编辑密钥

这些权限中有很多都包含通配符 (*)。这意味着,如果 AWS KMS 将来添加新 API 操作,系统将自动允许密钥管理员执行所有以 Create、Describe、Enable、List、Put、Update、Revoke、Disable、Get 或 Delete 开头的新 API 操作。

注意

上一部分中所述的密钥管理员语句所在的默认密钥策略是最新版本。有关先前版本的默认密钥策略的信息,请参阅将您的密钥策略保持最新

允许密钥用户使用 CMK

控制台创建的默认密钥策略允许您选择账户和外部 AWS 账户中的 IAM 用户和角色,并使其成为密钥用户。密钥用户有权直接使用 CMK 进行加密和解密。它们还有权将自己的一部分权限委派给某些与 AWS KMS 集成的 AWS 服务。密钥用户可以向这些服务隐式授予以特定的受限方式使用 CMK 的权限。这种隐式委派通过授权完成。例如,密钥用户可以执行下列操作:

  • 将此 CMK 用于 Amazon Elastic Block Store (Amazon EBS) 和 Amazon Elastic Compute Cloud (Amazon EC2),以将加密的 EBS 卷挂载到 EC2 实例。密钥用户向 Amazon EC2 隐式授予使用 CMK 将加密卷挂载到实例的权限。有关更多信息,请参阅Amazon Elastic Block Store (Amazon EBS) 如何使用 AWS KMS

  • 将此 CMK 用于 Amazon Redshift 以启动加密群集。密钥用户向 Amazon Redshift 隐式授予使用 CMK 启动加密群集并创建加密快照的权限。有关更多信息,请参阅Amazon Redshift 如何使用 AWS KMS

  • 将此 CMK 用于其他与 AWS KMS 集成的 AWS 服务,尤其是使用授权的服务,以为这些服务创建、管理或使用加密资源。

默认密钥策略向密钥用户授予权限,可允许这些集成服务使用 CMK,但用户仍然需要具有相应权限才能使用这些集成服务。有关授权用户访问与 AWS KMS 集成的 AWS 服务的详细信息,请查阅有关集成服务的文档。

默认密钥策略向密钥用户授予权限,可将 CMK 用于使用授权的所有集成服务,或者不能用于任何这些服务。您不能使用默认密钥策略来允许密钥用户将 CMK 用于一部分集成服务,而不用于其他集成服务。但是,您可以创建自定义密钥策略来达到这一目的。有关更多信息,请参阅 kms:ViaService 条件键。

创建 CMK 时,您可以将 IAM 用户、IAM 角色和其他 AWS 账户添加到密钥用户列表。您也可以使用控制台的默认密钥策略视图来编辑该列表,如下图所示。默认密钥策略视图可从密钥详细信息页面获取。有关允许其他 AWS 账户中的用户使用 CMK 的更多信息,请参阅允许其他账户中的用户使用 CMK


          控制台默认密钥策略中的密钥用户,默认视图

当您使用控制台的默认视图来修改密钥用户列表时,控制台会修改密钥策略中两个语句中的 Principal 元素。这些语句称为密钥用户语句。以下示例显示了密钥用户语句。

{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/KMSUser", "arn:aws:iam::111122223333:role/KMSRole", "arn:aws:iam::444455556666:root" ]}, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }
{ "Sid": "Allow attachment of persistent resources", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/KMSUser", "arn:aws:iam::111122223333:role/KMSRole", "arn:aws:iam::444455556666:root" ]}, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": {"Bool": {"kms:GrantIsForAWSResource": true}} }

这两个语句中的第一个允许密钥用户直接使用 CMK,并包含以下权限:

  • kms:Encrypt – 允许密钥用户成功请求 AWS KMS 使用此 CMK 加密数据。

  • kms:Decrypt – 允许密钥用户成功请求 AWS KMS 使用此 CMK 解密数据。

  • kms:ReEncrypt* – 允许密钥用户成功请求 AWS KMS 重新加密最初通过此 CMK 加密的数据,或者使用此 CMK 重新加密之前已加密的数据。ReEncrypt API 操作需要访问两个 CMK,最初的一个用于解密,另一个用于后续加密。为此,您可以允许这两个 CMK 的 kms:ReEncrypt* 权限 (请注意权限中的通配符“*”)。或者,您也可以允许解密 CMK 的 kms:ReEncryptFrom 权限和加密 CMK 的 kms:ReEncryptTo 权限。

  • kms:GenerateDataKey* – 允许密钥用户成功请求用于客户端加密的数据加密密钥(数据密钥)。密钥用户可以选择接收两份数据密钥副本 — 一份采用纯文本格式,另一份使用此 CMK 进行了加密 — 或者只接收加密格式的数据密钥。

  • kms:DescribeKey – 允许密钥用户检索有关此 CMK 的信息,其中包括其标识符、创建日期、状态等。

这两个语句中的第二个语句允许密钥用户使用授权将自己的一部分权限委派给一些与 AWS KMS 集成的 AWS 服务,尤其是使用授权的服务。仅当密钥用户将权限委派给集成的 AWS 服务时,此策略语句才会使用 condition 元素允许这些权限。有关在密钥策略中使用条件的更多信息,请参阅使用策略条件

示例密钥策略

以下示例显示了一个完整的密钥策略。此密钥策略将之前默认密钥策略部分的示例策略语句合并为一个密钥策略,该密钥策略可完成以下操作:

  • 向 AWS 账户(根用户)111122223333 授予对 CMK 的完全访问权限,并因此在该账户中启用 IAM 策略以允许访问 CMK。

  • 允许 IAM 用户 KMSAdminUser 和 IAM 角色 KMSAdminRole 管理 CMK。

  • 允许 IAM 用户 KMSUser、IAM 角色 KMSRole 和 AWS 账户 444455556666 使用 CMK。

{ "Version": "2012-10-17", "Id": "key-consolepolicy-2", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:root"}, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow access for Key Administrators", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/KMSAdminUser", "arn:aws:iam::111122223333:role/KMSAdminRole" ]}, "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" ], "Resource": "*" }, { "Sid": "Allow use of the key", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/KMSUser", "arn:aws:iam::111122223333:role/KMSRole", "arn:aws:iam::444455556666:root" ]}, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }, { "Sid": "Allow attachment of persistent resources", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/KMSUser", "arn:aws:iam::111122223333:role/KMSRole", "arn:aws:iam::444455556666:root" ]}, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": {"Bool": {"kms:GrantIsForAWSResource": "true"}} } ] }

下图举例说明了此密钥策略在控制台的默认密钥策略视图中所呈现的样子。


        控制台默认密钥策略视图中的密钥策略