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

允许其他账户中的用户使用 CMK

您可以允许一个 IAM 账户中的 AWS 用户或角色使用其他 AWS 账户中的客户主密钥 (CMK)。您可以在创建 CMK 时添加这些权限,也可以更改现有 CMK 的权限。

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

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

  • 您必须将 IAM 策略附加到外部账户中的 IAM 用户和角色。这些 IAM 策略委派在密钥策略中指定的权限。

在这种情况下,密钥策略决定谁可以访问 CMK。IAM 策略决定谁确实能否访问 CMK。无论是密钥策略还是 IAM 策略单独起作用都不够,您必须更改它们。

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

有关编辑 IAM 策略时的帮助信息,请参阅 在 AWS KMS 中使用 IAM 策略

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

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

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

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

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

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

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

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

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

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

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

{ "Sid": "Allow an external account to use this CMK", "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": "*" }

注意

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

您还需要确定您想要向外部账户授予哪些权限。有关针对 CMK 的权限的列表,请参阅 AWS KMS API 权限:操作和资源参考

您可以向外部账户授予权限以便在加密操作中使用 CMK,并将 CMK 和与 AWS KMS 集成的 AWS 服务一起使用。要执行此操作,请使用 AWS 管理控制台的密钥用户部分。有关详细信息,请参阅创建其他账户可以使用的 CMK

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

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

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

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

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

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

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Allow Use Of CMK In Account 111122223333", "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 元素标识委托人可以使用的 CMK。要指定一个 CMK,请将其 Amazon 资源名称 (ARN) 添加到 Resource 元素。您可以在策略语句中指定多个 CMK。但是,如果您没有在 Resource 元素中指定特定的 CMK,您可能会无意中比预期授予针对更多 CMK 的权限。

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

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

创建其他账户可以使用的 CMK

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

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

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


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

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

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

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

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

这些权限是为加密 AWS 服务(如 Amazon WorkMail)中的用户数据的 CMK 设计的。这些服务通常使用授权来获取以用户名义使用 CMK 所需的权限。有关详细信息,请参阅将外部 CMK 与 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" } } }

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

将外部 CMK 与 AWS 服务结合使用

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

密钥策略必须向外部用户或外部用户的账户授予使用 CMK 的权限。此外,您需要将 IAM 策略附加到某个身份,此身份向用户授予使用 AWS 服务的权限。

此外,该服务可能要求用户在密钥策略中具有其他权限。例如,它可能需要在 CMK 上创建、列出和撤消授权的权限。或者,它可能需要特定的 IAM 策略。有关详细信息,请参阅服务的文档。

最后,在集成的服务的 AWS 管理控制台中显示的 CMK 的列表不包括外部账户中的 CMK。即使用户或角色有权使用它们,也是如此。要使用外部账户的CMK,用户必须输入 CMK 的 ID 或 ARN。有关详细信息,请参阅该服务的控制台文档。