使用 AWS KMS 中的密钥策略 - AWS Key Management Service

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 AWS KMS 中的密钥策略

密钥策略是在 中控制对 客户主密钥 (CMKs) 的访问的主要方式AWS KMS。每个 CMK 必须正好有一个密钥策略。密钥策略文档中的语句确定谁有权使用 CMK 以及如何使用它。您还可以使用 IAM 策略授权来控制对 的访问CMK,但每个 CMK 都必须有一个密钥策略。有关更多信息,请参阅管理对 AWS KMS CMKs 的访问

有关编写和格式化 JSON 策略文档的帮助,请参阅 IAM 用户指南中的 IAM JSON 策略参考

密钥策略概述

每个 客户主密钥 (CMK) 必须正好有一个密钥策略。此密钥策略仅控制对其关联 CMK 以及 IAM 策略和授权的访问。与全局IAM策略不同,密钥策略是区域策略。每个密钥策略仅在托管 的区域中有效CMK。

密钥策略作为 JSON (JavaScript 对象表示法) 文档实施,最大为 32 KB (32768 字节)。您可以在 AWS KMS 控制台中或使用 AWS KMS API 操作(如 CreateKeyPutKeyPolicy创建和管理密钥策略。

密钥策略文档与 中的其他策略文档使用相同的 JSON 语法AWS,并具有以下基本结构:

{ "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"}} }] }

有关使用控制台的默认密钥策略视图的信息,请参阅默认密钥策略更改密钥策略。 有关编写和格式化 JSON 策略文档的帮助,请参阅 IAM 用户指南中的 IAM JSON 策略参考

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

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

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

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

    当委托人是另一个AWS账户或其委托人时,权限仅在具有 CMK 和 密钥策略的区域中启用账户时有效。有关未默认启用的 区域 (“选择加入区域”) AWS 的信息,请参阅 中的AWS General Reference管理区域。

    注意

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

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

  • Resource – (必需)在密钥策略中,Resource 元素的值为 "*",这意味着“this CMK”。星号 ("*") 标识密钥策略CMK附加到的 。

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

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

默认密钥策略

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

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

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

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

权限

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

默认密钥策略向拥有对 AWS 的完全访问权限的 CMK 账户(根用户)授予 CMK,这将完成以下两项操作。

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 CMKs 的访问

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

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

允许密钥管理员管理 CMK

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

警告

由于密钥管理员有权更改密钥策略并创建授权,因此他们可以为自己授予此策略中未指定AWS KMS的权限。

有权管理标签和别名的委托人还可以控制对 CMK 的访问。有关详细信息,请参阅 将 ABAC 用于 AWS KMS

在创建 时,您可以将 IAM 用户和角色添加到密钥管理员列表中CMK。您也可以使用控制台的默认密钥策略视图来编辑该列表,如下图所示。密钥策略的默认视图可在每个 的密钥详细信息页面上获得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的状态设置为已启用。对于对称 CMKs,它允许密钥管理员指定每年轮换 CMK的密钥材料

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

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

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

  • kms:Revoke* – 允许密钥管理员撤销CMK授权使用授权允许的此权限。

  • kms:Disable* – 允许密钥管理员将此 CMK的密钥状态设置为禁用。对于对称 CMKs,它允许密钥管理员禁用此 密钥材料的CMK年度轮换。

  • kms:Get* – 允许密钥管理员获取此 的密钥策略CMK,并确定此 CMK的密钥材料是否每年轮换。对于CMKs具有导入的密钥材料的导入 AWS Key Management Service (AWS KMS) 中的密钥材料对称 ,它还允许密钥管理员下载将密钥材料导入 所需的导入令牌和公有密钥CMK。对于非对称 CMKs ,它允许密钥管理员下载 的公有密钥CMK。

  • kms:Delete* – 允许密钥管理员删除与此 关联的别名CMK。对于CMKs使用导入的密钥材料的对称 ,它允许密钥管理员删除导入的密钥材料。请注意,此权限不允许密钥管理员删除 CMK

  • ImportKeyMaterial – 允许密钥管理员将密钥材料导入 CMK。仅当您创建CMK不带密钥材料的 时,此权限才包含在密钥策略中。

    注意

    以上示例策略语句中未显示此权限。

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

  • UntagResource – 允许密钥管理员从该 中删除标签CMK。

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

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

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

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

注意

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

允许密钥用户使用 CMK

控制台为对称创建的默认密钥策略CMKs允许您选择账户中的IAM用户和角色以及外部AWS账户,并使其成为密钥用户

控制台将两个策略语句添加到密钥用户的密钥策略中。

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


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

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

{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/CMKUser", "arn:aws:iam::111122223333:role/CMKRole", "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/CMKUser", "arn:aws:iam::111122223333:role/CMKRole", "arn:aws:iam::444455556666:root" ]}, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": {"Bool": {"kms:GrantIsForAWSResource": true}} }

允许密钥用户使用 CMK 进行加密操作

密钥用户有权CMK直接在上支持的所有加密操作中使用 CMK。他们还可以使用 DescribeKey 操作在 CMK 控制台AWS KMS中或通过使用 AWS KMS API 操作获取有关 的详细信息。

默认情况下,AWS KMS 控制台会将诸如以下示例的密钥用户语句添加到默认密钥策略中。由于它们支持不同的 API 操作,因此,策略语句中针对对称 CMKs、CMKs用于公有密钥加密的非对称 以及CMKs用于签名和验证的非对称 的操作略有不同。

对称 CMKs

控制台将以下语句添加到对称 的密钥策略CMKs中。

{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:user/CMKUser"}, "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:Encrypt", "kms:GenerateDataKey*", "kms:ReEncrypt*" ], "Resource": "*" }
CMKs 用于公有密钥加密的非对称

控制台将以下语句添加到非对称 的密钥策略CMKs,并使用密钥 Encrypt and decrypt。

{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:user/CMKUser"}, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:DescribeKey", "kms:GetPublicKey" ], "Resource": "*" }
CMKs 用于签名和验证的非对称

控制台将以下语句添加到非对称 的密钥策略,密钥用法为 CMKsSign and verify。

{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:user/CMKUser"}, "Action": [ "kms:DescribeKey", "kms:GetPublicKey", "kms:Sign", "kms:Verify" ], "Resource": "*" }

这些语句中的操作赋予密钥用户以下一些权限。

  • kms:Encrypt – 允许密钥用户使用此 加密数据CMK。

  • kms:Decrypt – 允许密钥用户使用此 解密数据CMK。

  • DescribeKey – 允许密钥用户获取有关此 的详细信息CMK,包括其标识符、创建日期和密钥状态。它还允许密钥用户在 CMK AWS KMS 控制台中显示有关 的详细信息。

  • kms:GenerateDataKey* – 允许密钥用户请求对称数据密钥或非对称数据密钥对,以执行客户端加密操作。控制台采用 * 通配符表示以下 API 操作的权限:GenerateDataKeyGenerateDataKeyWithoutPlaintextGenerateDataKeyPairGenerateDataKeyPairWithoutPlaintext

  • GetPublicKey – 允许密钥用户下载非对称 的公有密钥CMK。与您共享此公有密钥的各方可以在 AWS KMS 外部加密数据。但是,只能通过在 中调用 Decrypt 操作来解密这些密文AWS KMS。

  • ReEncrypt* – 允许密钥用户重新加密最初使用此 加密的数据CMK,或使用此加密CMK来重新加密之前加密的数据。ReEncrypt 操作需要访问源 和目标 CMKs。为此,您可以允许源上的 kms:ReEncryptFrom 权限CMK和目标 上的 kms:ReEncryptTo 权限CMK。但是,为简单起见, 控制台允许对两者kms:ReEncrypt*使用 (具有 * 通配符CMKs)。

  • kms:Sign – 允许密钥用户使用此对消息进行签名CMK。

  • kms:Verify – 允许密钥用户使用此 验证签名CMK。

允许密钥用户将 CMK 与 AWS 服务结合使用

控制台中的默认密钥策略还向密钥用户授予权限,允许与 集成的 AWS 服务AWS KMS使用 CMK,尤其是使用授权的服务。

密钥用户可以隐式授予这些服务以CMK特定和受限方式使用 的权限。这种隐式委派通过授权完成。这些授权允许集成的 AWS 服务使用 CMK 保护账户中的资源。

{ "Sid": "Allow attachment of persistent resources", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:user/CMKUser"}, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": {"Bool": {"kms:GrantIsForAWSResource": true}} }

例如,密钥用户可以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 与与与 集成的其他 AWSAWS KMS 服务(尤其是使用授权的服务)配合使用,以创建、管理或使用这些服务的加密资源。

kms:GrantIsForAWSResource 条件键允许密钥用户创建和管理授权,但仅当被授权者为使用授权的 AWS 服务才可如此。该权限允许密钥用户使用所有 使用授权的集成服务。但是,您可以创建自定义密钥策略,允许特定 AWS 服务代表CMK密钥用户使用 。有关更多信息,请参阅 kms:ViaService 条件键。

密钥用户需要这些授权权限才能将其CMK与集成服务结合使用,但这些权限是不够的。密钥用户还必须具备使用集成服务的权限。有关授权用户访问与 AWS 集成的 AWS KMS 服务的详细信息,请查阅有关集成服务的文档。

示例密钥策略

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

  • 允许 AWS 账户(根用户111122223333)完全访问 CMK,从而允许 账户中的IAM策略允许访问 CMK。

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

  • 允许用户IAMCMK、IAM角色CMK和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/CMKUser", "arn:aws:iam::111122223333:role/CMKRole", "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/CMKUser", "arn:aws:iam::111122223333:role/CMKRole", "arn:aws:iam::444455556666:root" ]}, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": {"Bool": {"kms:GrantIsForAWSResource": "true"}} } ] }

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


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