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

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

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

本节介绍如何在多个 AWS 账户之间共享 CloudTrail 日志文件。您用于在两者之间共享日志的方法 AWS 账户 取决于您的 S3 存储桶的配置。下面是是共享日志文件的选项:

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

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

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

注意

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

本节介绍如何 AWS 账户 通过扮演角色在多个 CloudTrail 日志文件之间共享日志文件,并描述共享日志文件的场景。

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

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

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

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

    • 选择其他 AWS 账户 选项。

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

    • 如果您希望用户在担任角色之前提供多因素身份验证,请选中要求MFA复选框。

    • 选择 AmazonS3 ReadOnlyAccess 政策。

      注意

      默认情况下,AmazonS3 ReadOnlyAccess 政策授予您账户中所有 Amazon S3 存储桶的检索和列出权限。

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

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

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

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

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

    • 选择其他 AWS 账户 选项。

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

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

    • 选择 AmazonS3 ReadOnlyAccess 政策。

      注意

      默认情况下,AmazonS3 ReadOnlyAccess 政策授予您账户中所有 Amazon S3 存储桶的检索和列出权限。

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

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

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

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

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

例如,要与账户 B 而不是账户 C 共享账户 B 的日志文件,您必须在账户中创建一个新IAM角色,指定账户 B 为可信账户。此角色信任策略指定可信任账户 B 来代入由您的账户创建的角色,与以下示例类似。如果使用控制台创建角色,则将自动创建信任策略。如果您使用创建角色,则必须将信任策略作为参数提供给CreateRoleAPI。SDK如果您使用创建角色,则必须在create-roleCLI命令中指定信任策略。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 的十二位数账户 ID,以及您在聚合过程中为账户 B 开启时指定的前缀(如果有)。 CloudTrail 有关指定前缀的更多信息,请参阅在其他账户中创建跟踪

重要

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

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

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

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

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

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

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

例如,由创建的信任关系 AWS 指定第三方账户(本例中为账户 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用户指南》中的如何在向第三方授予对 AWS 资源的访问权限时使用外部 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:::amzn-s3-demo-bucket/*" }, { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket" } ] }

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

代入角色

您必须指定一个单独的IAM用户来担任您在每个账户中创建的每个角色。然后,您必须确保每个IAM用户都有相应的权限。

IAM用户和角色

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

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

您为每个场景中的每个IAM角色创建的访问策略的主要区别。

为 IAM 用户创建权限策略

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

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

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

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

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

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

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

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

      注意

      您可以随时在 “可视化” 和 “JSON编辑器” 选项之间切换。但是,如果您进行更改或在可视化编辑器中选择 “下一步”,则IAM可能会重构您的策略以针对可视化编辑器对其进行优化。有关更多信息,请参阅《IAM用户指南》中的策略重组

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

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

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

正在呼叫 AssumeRole

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

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

  2. 选择要检查的角色。

  3. 在 “摘要” 部分ARN中查找 “角色”。

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

以下 Python 示例(使用 AWS SDK for Python (Boto))将说明如何调用 AssumeRole 以及如何使用返回的临时安全证书来列出由账户 A 控制的所有 Simple Storage Service(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

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

要停止与他人共享日志文件 AWS 账户,请删除您为该账户创建的角色。有关如何删除角色的信息,请参阅删除角色或实例配置文件