在 AWS KMS 中使用 IAM 策略 - AWS Key Management Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

在 AWS KMS 中使用 IAM 策略

您可以使用 IAM 政策, 关键政策津贴,和 VPC端点策略,控制对您的 客户主密钥 (CMKs) AWS KMS.

注意

使用 IAM 控制访问 CMK,关键政策 CMK 必须提供账户使用权限 IAM 政策。具体而言,密钥策略必须包含启用 IAM 策略的策略语句

本节介绍如何使用 IAM 策略控制对 AWS KMS 操作的访问。有关 IAM 的一般信息,请参阅 IAM 用户指南

全部 CMKs 必须有关键政策。 IAM 策略为可选。使用 IAM 控制访问 CMK,关键政策 CMK 必须提供账户使用权限 IAM 政策。具体而言,密钥策略必须包含启用 IAM 策略的策略语句

IAM 策略可以控制对任何 AWS KMS 操作的访问。与关键政策不同 IAM 策略可控制对多个 CMKs 并提供若干相关的操作权限 AWS 服务。但是 IAM 政策对控制对操作的访问尤其有用,例如 Createkey,不能受关键政策控制,因为他们不涉及任何特定 CMK.

如果您通过 Amazon Virtual Private Cloud (Amazon VPC) 终端节点访问 AWS KMS,则也可以使用 VPC 终端节点策略限制使用终端节点对 AWS KMS 资源的访问。例如,使用 VPC 终端节点时,您可以仅允许您 AWS 账户中的委托人访问您的 CMKs。有关详细信息,请参阅 控制对VPC端点的访问

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

IAM 策略概述

您可以通过以下方式使用 IAM 策略:

  • 将权限策略附加到用户或组 – 您可以附加允许一个 IAM 用户或一组用户调用 AWS KMS 操作的策略。

  • 将权限策略附加到角色以启用联合身份验证或跨账户权限 – 您可以将 IAM 策略附加到 IAM 角色以启用联合身份验证,允许跨账户权限,或者向运行在 EC2 实例上的应用程序授予权限。有关 IAM 角色各种使用案例的更多信息,请参阅 IAM 中的 IAM 用户指南 角色

以下示例显示了一个具有 AWS KMS 权限的 IAM 策略。本政策允许 IAM 附加到列表所有的身份 CMKs 和别名。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "kms:ListKeys", "kms:ListAliases" ], "Resource": "*" } }

与所有 IAM 策略一样,此策略没有 Principal 元素。在将 IAM 策略附加到 IAM 用户或 IAM 角色时,用户或代入角色用户 将获得策略中指定的权限。

有关显示所有 AWS KMS API 操作及其适用的资源的表,请参阅 AWS KMS API 权限参考

最佳实践 IAM 政策

保护访问 AWS KMS 客户主密钥 (CMKs)对于您的所有 AWS 资源。 AWS KMS CMKs 用于保护您的 AWS 账户。花时间设计 关键政策, IAM 政策, 津贴,和 VPC端点策略 控制对您的 CMKs.

在 IAM 控制访问 CMKs,使用 最低特权原则. 提供 IAM 仅限于他们只需要上述权限 CMKs 他们必须使用或管理。

使用关键政策

尽可能提供影响一个关键政策的权限 CMK而不是 IAM 适用于许多 CMKs,包括其他 AWS 账户。对于敏感权限,这一点尤为重要 KMS:PutkeyPolicyKMS:计划键删除 同时还可以用于确定数据保护方式的加密操作。

限制创建密钥权限

允许创建密钥(KMS:创建密钥)仅适用于需要的负责人。创建一个 CMK 还制定了其关键政策,以便他们能够给自己和他人的使用和管理 CMKs 他们创建。当您允许此权限时,请考虑使用 政策条件. 例如,您可以使用 kms:CustomerMasterKeySpec 限制对称权限的条件 CMKs.

指定 CMKs 在 IAM 政策

作为最佳实践,请指定 关键ARN 每个 CMK 该许可适用于 Resource 政策声明的元素。这种做法限制了 CMKs 该委托人需要。例如 Resource 元素仅列出主要需要使用的CMKS。

"Resource": [ "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" ]

当指定CMKS不切实际时,请使用 Resource 限制可信任的CMKS访问权限的值 AWS 账户和地区,例如 arn:aws:kms:region:account:key/*。或限制访问 CMKs 可信任的所有地区(*) AWS 账户,例如 arn:aws:kms:*:account:key/*.

避免“资源”:“*” IAM 政策

请谨慎使用通配符(*)。在关键策略中, Resource 元素代表 CMK 关键政策的附件。但在 IAM 策略,单独的通配符 Resource 元素("Resource": "*")将权限应用到所有 CMKs 全部 AWS 委托人账户有权使用的账户。这可能包括 其他AWS账户中的CMKS,以及 CMKs 在委托人账户中。

例如,在另一个 AWS 账户,主要需求从外部账户的CMK主要政策中获得,并且 IAM 自己账户中的政策。假设一个任意账户给你的 AWS 账户 KMS:解密 对他们的 CMKs. 如果是, IAM 您账户中提供角色的政策 kms:Decrypt 对所有CMKS的权限("Resource": "*")将满足 IAM 要求的一部分。因此,负责人可以假设角色现在可以使用 CMK 在不可信账户中。他们的运营条目显示在两个帐户的CloudTrail日志中。

尤其是,避免使用 "Resource": "*" 在允许以下API操作的策略声明中。这些操作可以打开 CMKs 其他 AWS 账户。

何时使用“资源”:“*”

在 IAM 策略,使用 Resource 要求的权限。只有以下权限才需要 "Resource": "*" 元素。

注意

别名操作权限(KMS:创建别名KMS:更新别名KMS:删除别名)必须附加到别名和 CMK. 您可以使用 "Resource": "*" 在 IAM 代表别名和CMKS的策略,或指定别名和 CMKs 在 Resource 元素。有关示例,请参阅 控制别名的访问

 

本主题中的示例提供了有关设计的更多信息和指导 IAM CMKS的政策。对于一般 AWS KMS 最佳实践指南,请参阅 AWS Key Management Service 最佳实践白皮书.

指定 CMKs 在 IAM 政策声明

您可以使用 IAM 允许负责人使用或管理的政策 CMKs. CMKS在 Resource 政策声明的元素。

撰写您的政策声明时,它是 最佳实践 将CMKS限制为需要使用的负责人,而不是让他们访问所有CMK。

  • 指定特定 CMKs 在 IAM 政策声明,使用 关键ARN 每个 CMK. 您不能使用 密钥ID别名名称,或 别名ARN 识别 CMK 在 IAM 政策声明。

    例如:。英寸Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab英寸

  • 要指定多个 CMKs 在帐户和地区,在关键字号ARN的区域或资源ID位置使用通配符(*)。

    例如,要指定 CMKs 在 美国西部(俄勒冈) 帐户地区,使用“Resource": "arn:aws:kms:us-west-2:111122223333:key/*“”。要指定全部 CMKs 在账户的所有地区,使用“Resource": "arn:aws:kms:*:111122223333:key/*“”。

  • 代表全部 CMKs,单独使用通配符("*")。使用此格式对不使用任何特定操作的操作 CMK,即 Createkey一般情况列表别名,和 列表键.

例如, IAM 政策声明允许负责人致电 描述GenerateDataKey解密 仅在 CMKs 在 Resource 政策声明的元素。指定 CMKs 关键的ARN是最佳做法,确保权限仅限于指定的权限 CMKs.

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "kms:DescribeKey", "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": [ "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" ] } }

应用所有权限 CMKs 特别值得信赖 AWS 帐户,您可以在区域和密钥ID位置使用通配符(*)。例如,以下策略声明允许负责人在所有 CMKs 在两个可信任示例帐户中。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "kms:DescribeKey", "kms:GenerateDataKey", "kms:GenerateDataKeyPair" ], "Resource": [ "arn:aws:kms:*:111122223333:key/*", "arn:aws:kms:*:444455556666:key/*" ] } }

您也可以使用通配符("*")在 Resource 元素。因为它允许访问账户拥有使用权限的所有CMKS,因此主要针对不涉及特定操作的操作 CMK 和 Deny 声明。也可以在策略声明中使用,只允许不太敏感的只读操作。以确定 AWS KMS 操作涉及特定 CMK,寻找 CMK资源 表中的列 AWS KMS API权限: 操作和资源参考.

例如,以下策略声明使用 Deny 效果以禁止负责人使用任何CMK上指定的操作。它在 Resource 代表所有CMKS的元素。

{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": [ "kms:CreateKey", "kms:PutKeyPolicy", "kms:CreateGrant", "kms:ScheduleKeyDeletion" ], "Resource": "*" } }

以下策略声明单独使用通配符代表所有CMK。但它只允许不太敏感的只读操作和操作不适用于任何特定CMK。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "kms:CreateKey", "kms:ListKeys", "kms:ListAliases", "kms:ListResourceTags" ], "Resource": "*" } }

使用 AWS KMS 控制台所需的权限

要使用 AWS KMS 控制台,用户必须拥有一组最低权限来允许他们使用 AWS 账户中的 AWS KMS 资源。除了这些 AWS KMS 权限以外,用户还必须拥有列出 IAM 用户和角色的权限。如果创建比必需的最低权限更为严格的 IAM 策略,对于附加了该 IAM 策略的用户,AWS KMS 控制台将无法按预期正常运行。

有关允许用户对 AWS KMS 控制台进行只读访问所需的最低权限,请参阅允许用户查看 CMKs 在 AWS KMS 控制台

允许用户使用 AWS KMS 创建和管理控制台 CMKs,附加 AWSKeyManagEmentServicePowerUser 用户管理的策略,如下一节所述。

您不需要允许使用与 AWS KMS API通过 AWS SDK命令行工具. 但是,您需要授予这些用户使用API的权限。有关更多信息,请参阅 AWS KMS API 权限参考。)

AWS 供电用户管理的政策

您可以使用 AWS 管理政策 提供 IAM 您帐户中的负责人的权限用户。用户可以创建的功率 CMKs,使用并管理 CMKs 他们创建并查看所有CMKS和 IAM 身份。

注意

此策略为电力用户提供 KMS:描述密钥 对任何 CMK 拥有许可操作的关键政策。这可能包括 CMKs 在不信任的 AWS 账户。有关详细信息,请参阅 最佳实践 IAM 政策

TheThethe AWSKeyManagEmentServicePowerUser 管理的策略包括以下权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:CreateAlias", "kms:CreateKey", "kms:DeleteAlias", "kms:Describe*", "kms:GenerateRandom", "kms:Get*", "kms:List*", "kms:TagResource", "kms:UntagResource", "iam:ListGroups", "iam:ListRoles", "iam:ListUsers" ], "Resource": "*" } ] }
  • 允许用户创建 CMKs. 由于该流程包括设置关键策略,因此能源用户可以给自己和他人授权使用和管理他们创建的CMK。

  • 允许用户创建和删除 别名标签 全部 CMKs.

  • 允许用户获取有关全部的详细信息 CMKs,包括其关键的ARN、密码配置、关键策略、别名、标记、以及 旋转状态.

  • 允许用户列出 IAM 用户、组和角色。

  • 本政策不允许这些用户使用或管理 CMKs 虽然他们可以管理所有CMK上的别名和标记,但它们都没有创建。

拥有 AWSKeyManagementServicePowerUser 管理的策略也可以获得其他来源的权限,包括关键策略、其他 IAM 政策和授予。

客户管理的策略示例

在此部分中,可以找到允许执行各种 AWS KMS 操作的权限的示例 IAM 策略。

重要

只有当以下策略中的某些权限时, CMK的关键政策也允许他们。有关更多信息,请参阅 AWS KMS API 权限参考。)

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

允许用户查看 CMKs 在 AWS KMS 控制台

以下 IAM 策略允许用户对 AWS KMS 控制台进行只读访问。具有这些权限的用户可以查看所有 CMKs 在他们的 AWS 但他们无法创建或更改任何 CMKs.

要查看 CMKs 在 AWS 托管密钥客户管理密钥 页面,负责人需要 KMS:ListkeyKMS:Listaliases 权限。其余权限,尤其是 KMS:描述密钥,需要在CMK详细信息页面查看可选CMK表列和数据。TheThethe iam:listusersiam:listroles 要在默认视图中显示密钥策略而无错误,需要权限。要查看有关 定制主要商店 页面和详情 CMKs 在定制主要商店中,负责人还需要 KMS:描述StomkeyStore 权限。

如果您限制用户的控制台访问特定 CMKs,控制台显示每个 CMK 这不可见。

本政策包含两项政策声明。TheThethe Resource 第一个策略声明中的元素允许所有指定权限 CMKs 在示例的所有区域 AWS 账户。控制台查看器不需要其他访问,因为 AWS KMS 仅显示控制台 CMKs 在委托人账户中。即使他们有权查看 CMKs 其他 AWS 账户。剩余 AWS KMS 和 IAM 权限要求 "Resource": "*" 因为它们不适用于任何特定 CMK.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Allow read-only permission to all CMKs in the account", "Effect": "Allow", "Action": [ "kms:GetPublicKey", "kms:GetKeyRotationStatus", "kms:GetKeyPolicy", "kms:DescribeKey", "kms:ListKeyPolicies", "kms:ListResourceTags" ], "Resource": "arn:aws:kms:*:111122223333:key/*" }, { "Sid": "Allow read-only access to operations with no CMK resource", "Effect": "Allow", "Action": [ "kms:ListKeys", "kms:ListAliases", "iam:ListRoles", "iam:ListUsers" ], "Resource": "*" } ] }

允许用户创建 CMKs

以下内容 IAM 策略允许用户创建 CMKs. 的价值 Resource 元素是 * 因为 CreateKey 操作不使用 AWS KMS 资源(CMKs 或别名)。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "kms:CreateKey", "Resource": "*" } }

创建密钥的负责人可能需要某些相关权限。

  • KMS:PutkeyPolicy — 负责人 kms:CreateKey 权限可以为 CMK. 但是, CreateKey 呼叫者必须 KMS:PutkeyPolicy 允许他们更改CMK的关键策略,或者它们必须指定 BypassPolicyLockoutSafetyCheck 参数 CreateKey,不推荐。TheThethe CreateKey 呼叫者可以获得 kms:PutKeyPolicy 对 CMK 从 IAM 或者他们可以在 CMK 他们正在创建。

  • KMS:标签资源 — 将标签添加到 CMK 在 CreateKey 操作, CreateKey 呼叫者必须 KMS:标签资源 在 IAM 政策。在新的CMK的关键政策中,包括此权限不足。但是,如果 CreateKey 呼叫者包括 kms:TagResource 在初始关键策略中,他们可以在 CMK 已创建。

  • KMS:创建别名 — 创建一个 CMK 在 AWS KMS 控制台必须 KMS:创建别名 在CMK和别名上的权限。(控制台进行两次呼叫;一到 CreateKey 一到 CreateAlias)。您必须在 IAM 政策。您可以提供 CMK 关键政策的权限或 IAM 政策。有关详细信息,请参阅 控制别名的访问

除此之外 kms:CreateKey,以下 IAM 政策提供 kms:TagResource 所有权限 CMKs 在 AWS 账户和 kms:CreateAlias 对账户所有别名的权限。它还包括一些有用的只读权限,只能在 IAM 政策。

这个 IAM 政策不包括 kms:PutKeyPolicy 权限或任何其他可以在关键策略中设置的权限。这是一个 最佳实践 在关键策略中设置这些权限,其中仅适用于一个 CMK.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "IAM permissions for particular CMKs", "Effect": "Allow", "Action": { "kms:TagResource" }, "Resource": "arn:aws:kms:*:111122223333:key/*" }, { "Sid": "IAM permissions for particular aliases", "Effect": "Allow", "Action": { "kms:CreateAlias" }, "Resource": "arn:aws:kms:*:111122223333:alias/*" }, { "Sid": "IAM permission that must be set for all CMKs", "Effect": "Allow", "Action": [ "kms:CreateKey", "kms:ListKeys", "kms:ListAliases" ], "Resource": "*" } ] }

允许用户在特定AWS帐户中加密和解密任何CMK

以下内容 IAM 策略允许用户使用任意方法加密和解密数据 CMK 在 AWS 账户 111122223333.

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt" ], "Resource": "arn:aws:kms:*:111122223333:key/*" } }

允许用户加密和解密任何 CMK 在特定的 AWS 账户和地区

以下内容 IAM 策略允许用户使用任意方法加密和解密数据 CMK 在 AWS 账户 111122223333 在 美国西部(俄勒冈) 地区。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt" ], "Resource": [ "arn:aws:kms:us-west-2:111122223333:key/*" ] } }

允许用户加密和解密特定用户 CMKs

以下内容 IAM 策略允许用户使用两者对数据进行加密和解密 CMKs 在 Resource 元素。在指定A时 CMK 在 IAM 政策声明,您必须使用 关键ARN 的 CMK.

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt" ], "Resource": [ "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" ] } }

防止用户禁用或删除任何 CMKs

以下内容 IAM 策略防止用户禁用或删除任何 CMKs,即使是另一个 IAM 策略或关键策略允许这些权限。以显式方式拒绝权限的策略将覆盖所有其他策略,甚至包括那些以显式方式允许相同权限的策略。有关更多信息,请参阅 密钥访问故障排除。)

{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": [ "kms:DisableKey", "kms:ScheduleKeyDeletion" ], "Resource": "*" } }