在 Amazon 账户之间共享 CloudTrail 日志文件 - Amazon CloudTrail
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

在 Amazon 账户之间共享 CloudTrail 日志文件

此部分说明如何在多个 Amazon 账户之间共享 CloudTrail 日志文件。您用于在 Amazon Web Services 账户 之间共享日志的方法取决于您的 S3 存储桶的配置。下面是是共享日志文件的选项:

  • 强制存储桶拥有者S3 对象所有权是 Amazon S3 存储桶级别的设置,您可以使用该设置来控制上传到存储桶的对象的所有权并禁用或启用访问控制列表(ACL)。默认情况下,对象所有权设为强制存储桶拥有者设置,并且所有 ACL 均处于禁用状态。禁用 ACL 后,存储桶拥有者拥有存储桶中的所有对象,并使用访问管理策略来专门管理对数据的访问权限。设置强制存储桶拥有者选项后,访问权限将通过存储桶策略进行管理,用户无需代入角色。

  • 代入角色以共享日志文件 – 如果您尚未选择强制存储桶拥有者设置,则用户需要代入角色才能访问您的 S3 存储桶中的日志文件。

通过代入角色在账户之间共享日志文件

注意

本部分仅适用于未使用强制存储桶拥有者设置的 Amazon S3 存储桶。

此部分说明如何通过代入角色在多个 Amazon Web Services 账户 之间共享 CloudTrail 日志文件,并介绍共享日志文件的方案。

  • 方案 1:向生成了已放置到 Amazon S3 存储桶中的日志文件的账户授予只读访问权。

  • 方案 2:向可以为您分析日志文件的第三方账户授予访问您的 Amazon S3 存储桶中的所有日志文件的权限。

要授予对 Amazon S3 存储桶中的日志文件的只读访问权
  1. 为您要与之共享日志文件的每个账户创建一个 IAM 角色。您必须是管理员才能授予权限。

    创建角色时,请执行以下操作:

    • 选择其他 Amazon Web Services 账户 选项。

    • 输入要授予访问权的账户的 12 位数账户 ID。

    • 如果您希望用户在代入角色之前提供多重验证,请选中 Require MFA 框。

    • 选择 AmazonS3ReadOnlyAccess 策略。

      注意

      默认情况下,AmazonS3ReadOnlyAccess 策略向您的账户中的所有 Simple Storage Service(Amazon S3)存储桶授予检索和列出权限。

    有关 IAM 角色的权限管理的详细信息,请参阅 IAM 用户指南中的 IAM 角色

  2. 创建一个访问策略,该策略向要与之共享日志文件的账户授予只读访问权。

  3. 指示每个账户代入一个角色来检索日志文件。

要使用第三方账户授予对日志文件的只读访问权
  1. 为您要与之共享日志文件的第三方账户创建一个 IAM 角色。您必须是管理员才能授予权限。

    创建角色时,请执行以下操作:

    • 选择其他 Amazon Web Services 账户 选项。

    • 输入要授予访问权的账户的 12 位数账户 ID。

    • 输入外部 ID 以便额外控制可代入角色的用户。有关更多信息,请参阅 IAM 用户指南中的如何在向第三方授予对 Amazon 资源的访问权时使用外部 ID

    • 选择 AmazonS3ReadOnlyAccess 策略。

      注意

      默认情况下,AmazonS3ReadOnlyAccess 策略向您的账户中的所有 Simple Storage Service(Amazon S3)存储桶授予检索和列出权限。

  2. 创建一个访问策略,该策略向要与之共享日志文件的第三方账户授予只读访问权。

  3. 指示第三方账户代入一个角色来检索日志文件。

以下部分介绍了有关这些步骤的更多详细信息。

创建用于向自己的账户授予访问权限的访问策略

作为 Amazon S3 存储桶的拥有者,您对 CloudTrail 将其他账户的日志文件写入到其中的 Amazon S3 存储桶具有完全控制权。您想将每个业务部门的日志文件共享回创建它们的业务部门。但您不希望部门能够读取任何其他部门的日志文件。

例如,要与账户 B 而非账户 C 共享账户 B 的日志文件,您必须在您的账户中创建一个新的 IAM 角色,指定账户 B 是受信任的账户。此角色信任策略指定可信任账户 B 来代入由您的账户创建的角色,与以下示例类似。如果使用控制台创建角色,则将自动创建信任策略。如果您使用 SDK 创建角色,则必须将信任策略作为参数提供给 CreateRole API。如果您使用 CLI 创建角色,则必须在 create-role CLI 命令中指定信任策略。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-B-id:root" }, "Action": "sts:AssumeRole" } ] }

您还必须创建访问策略来指定账户 B 只能从账户 B 将其日志文件写入到的位置进行读取。访问策略将类似于以下内容。请注意,资源 ARN 包含账户 B 的 12 位数账户 ID,以及在聚合过程中为账户 B 启动 CloudTrail 时指定的前缀(如果有)。有关指定前缀的更多信息,请参阅在其他账户中创建跟踪

重要

您必须确保访问策略中的前缀与您为账户 B 启动 CloudTrail 时指定的前缀完全相同。如果二者不同,则必须在您的账户中编辑 IAM 角色访问策略来并入账户 B 的实际前缀。如果角色访问策略中的前缀与您为账户 B 启动 CloudTrail 时指定的前缀并不完全相同,则账户 B 将无法访问其日志文件。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::bucket-name/prefix/AWSLogs/account-B-id/*" }, { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::bucket-name" } ] }

对任何其他账户使用上述过程。

在创建每个用户的角色并指定相应的信任和访问策略后,以及在每个账户的管理员向该账户中的 IAM 用户授予访问权后,账户 B 或账户 C 中的 IAM 用户可以编程方式代入角色。

有关更多信息,请参阅代入角色

创建用于向第三方授予访问权限的访问策略

您必须为第三方账户创建单独的 IAM 角色。在创建角色时,Amazon 会自动创建信任关系,以指定将信任第三方账户来代入角色。此角色的访问策略指定了该账户可执行的操作。有关创建角色的更多信息,请参阅创建 IAM 角色

例如,由 Amazon 创建的信任关系可以指定,信任第三方账户(在此示例中为 账户 Z)来代入您创建的角色。以下是信任策略的示例:

{ "Version": "2012-10-17", "Statement": [{ "Sid": "", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::account-Z-id:root"}, "Action": "sts:AssumeRole" }] }

如果您在为第三方账户创建角色时指定了外部 ID,则您的访问策略将包含一个添加的 Condition 元素,该元素将测试由该账户分配的唯一 ID。此测试在代入角色时执行。以下示例访问策略包含 Condition 元素。

有关更多信息,请参阅《IAM 用户指南》中的如何在向第三方授予对 Amazon 资源的访问权限时使用外部 ID

{ "Version": "2012-10-17", "Statement": [{ "Sid": "", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::account-Z-id:root"}, "Action": "sts:AssumeRole", "Condition": {"StringEquals": {"sts:ExternalId": "external-ID-issued-by-account-Z"}} }] }

您还必须为您的账户创建访问策略来指定第三方账户可读取 Amazon S3 存储桶中的所有日志。访问策略应类似于以下示例。Resource 值结尾处的通配符(*)表示第三方账户可访问已获得相应访问权的 S3 存储桶中的任何日志文件。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::bucket-name/*" }, { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::bucket-name" } ] }

在为第三方账户创建角色并指定相应的信任关系和访问策略后,第三方账户中的 IAM 用户必须以编程方式代入角色才能读取存储桶中的日志文件。有关更多信息,请参阅代入角色

代入角色

您必须指定一个单独的 IAM 用户来代入自己在每个账户中创建的各个角色,还必须确保每个 IAM 用户都拥有相应权限。

IAM 用户和角色

在创建必要的角色和策略后,您必须在要与之共享文件的每个账户中指定一个 IAM 用户。每个 IAM 用户均以编程方式代入相应的角色以访问日志文件。当用户代入角色时,Amazon 会向该用户返回临时安全凭证。此类凭证可用于发出列出、检索、复制或删除日志文件的请求,具体取决于与角色关联的访问策略所授予的权限。

有关使用 IAM 身份的更多信息,请参阅 IAM 身份(用户、组和角色)

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

为 IAM 用户创建权限策略

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

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["sts:AssumeRole"], "Resource": "arn:aws:iam::account-A-id:role/Test" } ] }
编辑客户托管策略(控制台)
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在导航窗格中,选择策略

  3. 在策略列表中,选择要编辑的策略的名称。您可以使用搜索框筛选策略列表。

  4. 选择权限选项卡,然后选择编辑

  5. 请执行以下操作之一:

    • 选择可视化选项以更改您的策略,而无需了解 JSON 语法。您可以更改策略中的每个权限块的服务、操作、资源或可选条件。也可以导入一个策略以在您的策略底部添加其他权限。完成更改后,选择下一步以继续。

    • 选择 JSON 选项,然后在 JSON 文本框中键入或粘贴文本以修改您的策略。也可以导入一个策略以在您的策略底部添加其他权限。解决策略验证过程中生成的任何安全警告、错误或常规警告,然后选择下一步

      注意

      您可以随时在可视化JSON 编辑器选项卡之间切换。不过,如果您进行更改或在可视化编辑器中选择下一步,IAM 可能会调整策略结构以针对可视化编辑器进行优化。有关更多信息,请参阅《IAM 用户指南》https://docs.amazonaws.cn/IAM/latest/UserGuide/troubleshoot_policies.html#troubleshoot_viseditor-restructure中的调整策略结构

  6. 查看并保存页面上,查看此策略中定义的权限,然后选择保存更改以保存您的工作。

  7. 如果管理型策略已达到最大版本数(5 个),选择保存更改将显示对话框。要保存您的新版本,策略最旧的非默认版本将被移除并替换为该新版本。(可选)您也可以将新版本设置为策略的默认版本。

    选择保存更改以保存您的新策略版本。

调用 AssumeRole

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

使用 IAM 控制台在账户 A 中查找 ARN 值
  1. 选择 Roles

  2. 选择要检查的角色。

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

AssumeRole API 会返回临时凭证,用于访问拥有账户中的资源。在此示例中,您要访问的资源是 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 ) try: 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.") except ClientError as error: print( f"Couldn't assume role {assume_role_arn}. Here's why: " f"{error.response['Error']['Message']}" ) raise # 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:") try: for bucket in s3_resource.buckets.all(): print(bucket.name) except ClientError as error: print( f"Couldn't list buckets for the account. Here's why: " f"{error.response['Error']['Message']}" ) raise

停止在 Amazon 账户之间共享 CloudTrail 日志文件

要停止将日志文件共享到另一个 Amazon Web Services 账户,只需删除您为该账户创建的角色。有关如何删除角色的信息,请参阅删除角色或实例配置文件