代入一个角色 - Amazon CloudTrail
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

代入一个角色

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

IAM 用户和角色

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

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

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

为 IAM 用户创建权限策略

要执行角色允许的操作,IAM 用户必须有权调用 Amazon STS AssumeRole API。您必须编辑基于用户的策略,以便向他们授予相应的权限。也就是说,您将资源元素。以下示例演示了账户 B 中的 IAM 用户的策略,此策略允许该用户代入账户 A 之前创建的一个名为 “Test” 的角色。

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

  1. 登录到Amazon Web Services Management Console并打开 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 用户可以代入角色。如果您尝试使用 Amazon 根账户证书来代入角色,则访问将被拒绝。

调用 AssumeRole

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

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

  1. 选择 Roles

  2. 选择要检查的角色。

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

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

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

def list_buckets_from_assumed_role(user_key, assume_role_arn, session_name): """ Assumes a role that grants permission to list the Amazon S3 buckets in the account. Uses the temporary credentials from the role to list the buckets that are owned by the assumed role's account. :param user_key: The access key of a user that has permission to assume the role. :param assume_role_arn: The Amazon Resource Name (ARN) of the role that grants access to list the other account's buckets. :param session_name: The name of the STS session. """ sts_client = boto3.client( 'sts', aws_access_key_id=user_key.id, aws_secret_access_key=user_key.secret) response = sts_client.assume_role( RoleArn=assume_role_arn, RoleSessionName=session_name) temp_credentials = response['Credentials'] print(f"Assumed role {assume_role_arn} and got temporary credentials.") # Create an S3 resource that can access the account with the temporary credentials. s3_resource = boto3.resource( 's3', aws_access_key_id=temp_credentials['AccessKeyId'], aws_secret_access_key=temp_credentials['SecretAccessKey'], aws_session_token=temp_credentials['SessionToken']) print(f"Listing buckets for the assumed role's account:") for bucket in s3_resource.buckets.all(): print(bucket.name)