允许其他账户中的用户使用 KMS 密钥 - AWS Key Management Service

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

允许其他账户中的用户使用 KMS 密钥

您可以允许其他 AWS 账户中的用户或角色使用您账户中的 KMS 密钥。跨账户访问需要在 KMS 密钥的密钥策略和外部用户账户的 IAM policy 中拥有权限。

跨账户权限仅对以下操作有效:

如果您向另一个账户中的用户授予对其他操作的权限,则这些权限将不起作用。例如,如果您向其他账户中的委托人授予 IAM 策略中的 k ms: ListKeys 权限,或者在密钥策略中ScheduleKeyDeletion授予 KMS: 密钥权限,则该用户尝试对您的资源调用这些操作仍会失败。

有关在不同账户中使用 KMS 密钥进行 AWS KMS 操作的详细信息,请参阅 AWS KMS 权限在其他账户中使用 KMS 密钥 中的跨账户使用列。AWS Key Management Service API 参考中每个 API 描述中还有一个跨账户使用部分。

警告

请谨慎授予委托人使用 KMS 密钥的权限。只要有可能,请按照最小特权原则。仅针对用户所需的操作为他们授予对所需的 KMS 密钥的访问权。

此外,请谨慎使用任何不熟悉的 KMS 密钥,尤其是其他账户中的 KMS 密钥。恶意用户可能会授予您使用其 KMS 密钥获取有关您或您账户的信息的权限。

有关使用策略保护您账户中的资源的更多信息,请参阅 IAM policy 的最佳实践

要将使用 KMS 密钥的权限授予其他账户中的用户和角色,您必须使用两种不同类型的策略:

  • KMS 密钥的密钥策略必须向外部账户(或外部账户中的用户和角色)授予使用 KMS 密钥的权限。密钥策略在拥有 KMS 密钥的账户中。

  • 外部账户中的 IAM policy 必须将密钥策略权限委托给其用户和角色。这些策略在外部账户中设置,并向该账户中的用户和角色授予权限。

密钥策略决定谁可以访问 KMS 密钥。IAM policy 决定谁确实能够访问 KMS 密钥。单独的密钥策略和 IAM policy 都不足够,您必须更改此两者。

要编辑密钥策略,您可以使用中的策略视图AWS Management Console或使用CreateKeyPutKeyPolicy操作。有关在创建 KMS 密钥时设置密钥策略的帮助信息,请参阅 创建其他账户可以使用的 KMS 密钥

有关编辑 IAM policy 时的帮助信息,请参阅。结合 IAM policy 和 AWS KMS

有关说明密钥策略和 IAM policy 如何协同工作以允许在其他账户中使用 KMS 密钥的示例,请参阅。示例 2:用户代入的角色具有使用不同 AWS 账户 中的 KMS 密钥的权限

您可以在您的 AWS CloudTrail 日志中查看对 KMS 密钥产生的跨账户 AWS KMS 操作。在其他账户中使用 KMS 密钥的操作将记录在调用方的账户和 KMS 密钥所有者账户中。

注意

本主题中的示例展示了如何结合使用密钥策略和 IAM policy 来提供和限制对 KMS 密钥的访问。这些通用示例不是为了表示任何特定的 AWS 服务 对于 KMS 密钥需要的权限。有关 AWS 服务 需要的权限的信息,请参阅服务文档中的加密主题。

步骤 1:在本地账户中添加密钥策略语句

KMS 密钥的密钥策略是谁可以访问 KMS 密钥以及他们可以执行哪些操作的主要决定因素。密钥策略始终在拥有 KMS 密钥的账户中。与 IAM policy 不同,密钥策略不指定资源。资源是指与密钥策略关联的 KMS 密钥。在提供跨账户权限时,KMS 密钥的密钥策略必须向外部账户(或外部账户中的用户和角色)授予使用 KMS 密钥的权限。

要向外部账户授予使用 KMS 密钥的权限,请向密钥策略添加一条语句用于指定此外部账户。在密钥策略的 Principal 元素中,输入外部账户的 Amazon Resource Name (ARN)。

当您在密钥策略中指定外部账户时,外部账户中的 IAM 管理员可以使用 IAM policy 来将这些权限委派给外部账户中的任何用户和角色。他们还可以决定用户和角色可以执行在密钥策略中指定的哪些操作。

只有在托管 KMS 密钥及其密钥策略的区域中启用了外部账户时,授予给外部账户及其委托人的权限才有效。有关默认情况下未启用的区域(“选择加入区域”)的信息,请参阅《AWS 一般参考》 中的 Managing AWS 区域

例如,假定您希望允许账户 444455556666 使用账户 111122223333 中的对称加密 KMS 密钥。为此,请将与以下示例中的策略语句类似的策略语句添加到账户 111122223333 中 KMS 密钥的密钥策略。此策略语句授权外部账户 444455556666 在加密操作中使用对称加密 KMS 密钥的 KMS 密钥。

注意

以下示例演示了与其他账户共享 KMS 密钥的示例密钥策略。请将示例 SidPrincipalAction 的值替换为 KMS 密钥预期用途的有效值。

{ "Sid": "Allow an external account to use this KMS key", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::444455556666:root" ] }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }

您可以在密钥策略中指定特定的外部用户和角色,而不是向外部账户授予权限。但是,这些用户和角色无法使用该 KMS 密钥,直到外部账户中的 IAM 管理员将适当的 IAM policy 附加到其身份。IAM policy 可以向在密钥策略中指定的所有或部分外部用户和角色授予权限。并且,它们可以允许执行在密钥策略中指定的所有或部分操作。

在密钥策略中指定身份会限制外部账户中的 IAM 管理员可以提供的权限。但是,它使两个账户的策略管理变得更加复杂。例如,假定您需要添加用户或角色。您必须将该身份添加到拥有 KMS 密钥的账户中的密钥策略,并在此身份的账户中创建 IAM policy。

要在密钥策略中指定特定外部用户或角色,请在 Principal 元素中输入外部账户中的用户或角色的 Amazon Resource Name (ARN)。

例如,以下示例密钥策略语句允许账户 444455556666 中的 ExampleRole 使用账户 111122223333 中的 KMS 密钥。此密钥策略语句授权外部账户 444455556666 在加密操作中使用对称加密 KMS 密钥的 KMS 密钥。

注意

以下示例演示了与其他账户共享 KMS 密钥的示例密钥策略。请将示例 SidPrincipalAction 的值替换为 KMS 密钥预期用途的有效值。

{ "Sid": "Allow an external account to use this KMS key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444455556666:role/ExampleRole" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }
注意

除非您使用条件限制密钥政策,否则不要在允许权限的任何密钥政策语句将主体设置为星号(*)。星号表示允许每个 AWS 账户 权限中的每个身份使用 KMS 密钥,除非另一个策略语句明确拒绝它。其他 AWS 账户 中的用户只要在自己的账户中拥有相应的权限,就可以使用您的 KMS 密钥。

您还需要确定您想要向外部账户授予哪些权限。有关针对 KMS 密钥的权限的列表,请参阅 AWS KMS 权限

您可以向外部账户授予权限以便在加密操作中使用 KMS 密钥,并将 KMS 密钥和与 AWS KMS 集成的 AWS 服务一起使用。为此,请使用 AWS Management Console 的密钥用户部分。有关更多信息,请参阅 创建其他账户可以使用的 KMS 密钥

要在密钥策略中指定其他权限,请编辑密钥策略文档。例如,您可能希望授予用户解密但不加密的权限,或者查看 KMS 密钥但不使用 KMS 密钥的权限。要编辑密钥策略文档,您可以使用AWS Management Console或CreateKeyPutKeyPolicy操作中的策略视图

步骤 2:在外部账户中添加 IAM policy

拥有 KMS 密钥的账户中的密钥策略设置权限的有效范围。但是,在附加委派这些权限的 IAM policy 或使用授权来管理对 KMS 密钥的访问之前,外部账户中的用户和角色无法使用此 KMS 密钥。IAM policy 在外部账户中设置。

如果密钥策略向外部账户授予权限,则可以将 IAM policy 附加到账户中的任何用户或角色。但是,如果密钥策略向指定的用户或角色授予权限,则 IAM policy 只能将这些权限授予全部或部分指定用户和角色。如果 IAM policy 向其他外部用户或角色授予使用 KMS 密钥的权限,则它不起作用。

密钥策略还限制 IAM policy 中的操作。IAM policy 可以委派在密钥策略中指定的所有或部分操作。如果 IAM policy 列出未在密钥策略中指定的操作,则这些权限无效。

以下示例 IAM policy 允许委托人使用账户 111122223333 中的 KMS 密钥执行加密操作。要向账户 444455556666 中的用户和角色授予此权限,请将策略附加到账户 444455556666 中的用户或角色。

注意

以下示例演示了与其他账户共享 KMS 密钥的示例 IAM policy。请将示例 SidResourceAction 的值替换为 KMS 密钥预期用途的有效值。

{ "Sid": "AllowUseOfKeyInAccount111122223333", "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" }

请注意有关该策略的以下详细信息:

  • 与密钥策略不同,IAM policy 语句不包含 Principal 元素。在 IAM policy 中,委托人是附加了策略的身份。

  • IAM policy 中的 Resource 元素标识委托人可以使用的 KMS 密钥。要指定 KMS 密钥,请将其密钥 ARN 添加到 Resource 元素中。

  • 您可以在 Resource 元素中指定多个 KMS 密钥。但是,如果您没有在 Resource 元素中指定特定的 KMS 密钥,您可能会无意中比预期授予针对更多 KMS 密钥的权限。

  • 要允许外部用户将 KMS 密钥和与 AWS KMS 集成的 AWS 服务一起使用,您可能需要向密钥策略或 IAM policy 添加权限。有关更多信息,请参阅 允许将外部 KMS 密钥与 AWS 服务结合使用

有关使用 IAM policy 的更多信息,请参阅 IAM 策略

创建其他账户可以使用的 KMS 密钥

使用该CreateKey操作创建 KMS 密钥时,您可以使用其Policy参数来指定密钥策略,该策略向外部账户或外部用户和角色授予使用 KMS 密钥的权限。您还必须在外部账户中添加 IAM policy,以将这些权限委派给此账户的用户和角色,即使在密钥策略中指定了用户和角色也是如此。您可以使用PutKeyPolicy操作随时更改密钥策略。

当您在 AWS Management Console 中创建 KMS 密钥时,还会创建其密钥策略。当您在密钥管理员密钥用户部分中选择身份时,AWS KMS 会将这些身份的策略语句添加到 KMS 密钥的密钥策略中。

密钥用户部分还允许您将外部账户添加为密钥用户。

将外部账户添加到 KMS 密钥的密钥策略的控制台元素。

当您输入外部账户的账户 ID 时,AWS KMS 向密钥策略添加两个语句。此操作仅影响密钥策略。外部账户中的用户和角色无法使用该 KMS 密钥,直到您附加 IAM policy 以向他们授予部分或所有这些权限。

第一个密钥策略语句向外部账户授予在加密操作中使用 KMS 密钥的权限。

注意

以下示例演示了与其他账户共享 KMS 密钥的示例密钥策略。请将示例 SidPrincipalAction 的值替换为 KMS 密钥预期用途的有效值。

{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444455556666:root" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }

第二个密钥策略语句允许外部账户在 KMS 上创建、查看和撤消授权,但仅限请求来自与 AWS KMS 集成的 AWS 服务的情况。这些权限允许加密用户数据的其他 AWS 服务使用 KMS 密钥。

这些权限专为加密AWS服务(例如 Amazon)中的用户数据的 KMS 密钥而设计 WorkMail。这些服务通常使用授权来获取以用户名义使用 KMS 密钥所需的权限。有关更多信息,请参阅 允许将外部 KMS 密钥与 AWS 服务结合使用

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

如果这些权限不能满足您的需求,则可以在控制台策略视图中或使用PutKeyPolicy操作对其进行编辑。您可以指定特定的外部用户和角色,而不是向外部账户授予权限。您可以更改策略指定的操作。您可以使用全局和 AWS KMS 策略条件来细化权限。

允许将外部 KMS 密钥与 AWS 服务结合使用

您可以向不同账户中的用户授予将您的 KMS 密钥和与 AWS KMS 集成的服务一起使用的权限。例如,外部账户中的用户可以使用您的 KMS 密钥加密 Amazon S3 存储桶中的对象加密存储在 AWS Secrets Manager 中的密钥

密钥策略必须向外部用户或外部用户的账户授予使用 KMS 密钥的权限。此外,您需要将 IAM policy 附加到某个身份,以向用户授予使用 AWS 服务的权限。该服务还可能要求用户在密钥策略或 IAM policy 中具有其他权限。有关 AWS 服务需要对客户管理型密钥拥有的权限列表,请参阅相关服务的用户指南或开发人员指南中“安全”章节的“数据保护”主题。

在其他账户中使用 KMS 密钥

如果您有权在另一个 AWS 账户 中使用 KMS 密钥,您可以在 AWS Management Console、AWS 开发工具包、AWS CLI 和 AWS Tools for PowerShell 中使用 KMS 密钥。

要在 shell 命令或 API 请求中标识其他账户中的 KMS 密钥,请使用以下密钥标识符

如果您只输入密钥 ID 或别名名称,AWS 会假定 KMS 密钥位于您的账户中。

AWS KMS 控制台不会在其他账户中显示 KMS 密钥,即使您有权使用它们。此外,在其他 AWS 服务的控制台中显示的 KMS 密钥的列表不包括其他账户中的 KMS 密钥。

要在 AWS 服务的控制台中指定不同账户中的 KMS 密钥,您必须输入 KMS 密钥的密钥 ARN。所需的密钥标识符因服务而异,并且在服务控制台及其 API 操作之间可能会有所不同。有关详细信息,请参阅服务文档。