AWS CloudTrail
用户指南 (版本 1.0)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

代入一个角色

您必须指定一个单独的 IAM 用户来代入您在每个账户中创建的每个角色,并确保每个 IAM 用户拥有适当的权限。

IAM 用户和角色

在账户 A 中为方案 1 和方案 2 创建必要的角色和策略后,您必须在每个账户 B、账户 C 和账户 Z 中指定一个 IAM 用户。每个 IAM 用户将以编程方式代入适当的角色以访问日志文件。即,账户 B 中的用户将代入为账户 B 创建的角色,账户 C 中的用户将代入为账户 C 创建的角色,账户 Z 中的用户将代入为账户 Z 创建的角色。在用户代入角色时,AWS 将返回临时安全证书,此安全证书可用于发出列出、检索、复制或删除日志文件的请求,具体取决于与角色关联的访问策略所授予的权限。

有关使用 IAM 用户的更多信息,请参阅使用 IAM 用户和组

方案 1 和方案 2 的主要区别在于,您在每个方案中为每个 IAM 角色创建的访问策略。

为 IAM 用户创建权限策略

要执行角色允许的操作,IAM 用户必须有权调用 AWS STS AssumeRole API。您必须为每个 IAM 用户编辑基于用户的策略 以向这些用户授予适当的权限。也就是说,在附加到 IAM 用户的策略中设置 Resource 元素。以下示例演示了账户 B 中的 IAM 用户的策略,此策略允许该用户代入账户 A 之前创建的一个名为“Test”的角色。

将所需的策略附加到 IAM 角色

  1. 登录 AWS 管理控制台并打开 IAM 控制台。

  2. 选择要修改其权限的用户。

  3. 选择 Permissions 选项卡。

  4. 选择 Custom Policy

  5. 选择 Use the policy editor to customize your own set of permissions

  6. 为策略键入名称。

  7. 将以下策略复制到为策略文档提供的空白处。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["sts:AssumeRole"], "Resource": "arn:aws:iam::account-A-id:role/Test" } ] }

重要

只有 IAM 用户可以代入角色。如果您尝试使用 AWS 根账户证书来代入角色,则访问将被拒绝。

调用 AssumeRole

账户 B、账户 C 或账户 Z 中的用户通过创建一个应用程序来代入角色,该应用程序将调用 AWS STS AssumeRole API 并传递角色会话名称、要代入的角色的 Amazon 资源编号 (ARN) 和可选外部 ID。账户 A 在创建要代入的角色时将定义角色会话名称。外部 ID(如果有)由账户 Z 定义,并且将传递给账户 A 以便在创建角色时将此 ID 包含在内。有关更多信息,请参阅 IAM 用户指南 中的如何在向第三方授予对 AWS 资源的访问权时使用外部 ID。可以通过打开 IAM 控制台从账户 A 检索 ARN。

使用 IAM 控制台在账户 A 中查找 ARN 值

  1. 选择 Roles

  2. 选择要检查的角色。

  3. 摘要部分中查找角色 ARN

AssumeRole API 将返回临时证书,账户 B、账户 C 或账户 Z 中的用户可使用该证书访问账户 A 中的资源。在此示例中,需要访问的资源是 Amazon S3 存储桶以及该存储桶所包含的日志文件。该临时证书拥有您在角色访问策略中定义的权限。

以下 Python 示例(使用 AWS SDK for Python (Boto))将说明如何调用 AssumeRole 以及如何使用返回的临时安全证书来列出由账户 A 控制的所有 Amazon S3 存储桶。

import boto3 # Create an STS client sts_client = boto3.client('sts') # Assume a role defined on an external account. The role specifies the # permissions that are allowed on the account. # Replace EXTERNAL_ACCOUNT_NUMBER with the account number of the external # account. # Replace ROLE_NAME with the name of the role defined on the external account. # Optional, but recommended: Specify a unique ExternalId= string assigned by # the external account. response = sts_client.assume_role(RoleArn='arn:aws:iam::EXTERNAL_ACCOUNT_NUMBER:role/ROLE_NAME', RoleSessionName='AssumeRoleSession1') # Reference the temporary credentials section of the response tempCredentials = response['Credentials'] # Use the temporary credentials to create an S3 resource that can access the # external account. The assumed role's permissions must allow the desired S3 # access. s3_resource = boto3.resource('s3', aws_access_key_id=tempCredentials['AccessKeyId'], aws_secret_access_key=tempCredentials['SecretAccessKey'], aws_session_token=tempCredentials['SessionToken']) # Use the S3 resource to list the external account's buckets. for bucket in s3_resource.buckets.all(): print(bucket.name)