允许其他账户中的用户使用 KMS 密钥 - Amazon Key Management Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

您可以允许另一个 Amazon Web Services 账户 中的 IAM 用户或角色使用您账户中的 Amazon KMS key(KMS 密钥)。跨账户访问需要在 KMS 密钥的密钥策略和外部用户账户的 IAM 策略中拥有权限。

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

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

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

警告

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

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

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

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

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

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

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

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

有关编辑 IAM 策略时的帮助信息,请参阅 结合 IAM 策略和 Amazon KMS

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

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

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

KMS 密钥的密钥策略是谁可以访问 KMS 密钥以及他们可以执行哪些操作的主要决定因素。密钥策略始终在拥有 KMS 密钥的账户中。与 IAM 策略不同,密钥策略不指定资源。资源是指与密钥策略关联的 KMS 密钥。

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

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

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

例如,假定您希望允许账户 444455556666 使用账户 111122223333 中的对称 KMS 密钥。为此,请将与以下示例中的策略语句类似的策略语句添加到账户 111122223333 中 KMS 密钥的密钥策略。此策略语句授权外部账户 444455556666 在加密操作中使用对称 KMS 密钥的 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 策略附加到其身份。IAM 策略可以向在密钥策略中指定的所有或部分外部用户和角色授予权限。并且,它们可以允许执行在密钥策略中指定的所有或部分操作。

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

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

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

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

除非您使用条件限制密钥策略,否则不要在允许权限的任何密钥策略语句将委托人设置为星号 (*)。星号表示允许每个 Amazon Web Services 账户 权限中的每个身份使用 KMS 密钥,除非另一个策略语句明确拒绝它。其他 Amazon Web Services 账户 中的用户需要他们自己的账户中相应的 IAM 权限才能使用 KMS 密钥。

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

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

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

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

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

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

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

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

{ "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 策略语句不包含 Principal 元素。在 IAM 策略中,委托人是附加了策略的身份。

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

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

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

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

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

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

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

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


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

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

第一个密钥策略语句向外部账户授予在加密操作中使用 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 上创建、查看和撤消授权,但仅限请求来自与 Amazon KMS 集成的 Amazon 服务的情况。这些权限允许加密用户数据的其他 Amazon 服务使用 KMS 密钥。

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

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

如果这些权限未满足您的需求,您可以在控制台策略视图中或使用 &link-kms-api; 操作来编辑它们。您可以指定特定的外部用户和角色,而不是向外部账户授予权限。您可以更改策略指定的操作。您可以使用全局和 Amazon KMS 策略条件来细化权限。

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

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

密钥策略必须向外部用户或外部用户的账户授予使用 KMS 密钥的权限。此外,您需要将 IAM 策略附加到某个身份,此身份向用户授予使用 Amazon 服务的权限。该服务还可能要求用户在密钥策略或 IAM 策略中具有其他权限。有关详细信息,请参阅服务的文档。

在其他账户中使用 KMS 密钥

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

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

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

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

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