使用 AWS CloudTrail 记录 Amazon S3 API 调用 - Amazon Simple Storage Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 AWS CloudTrail 记录 Amazon S3 API 调用

Amazon S3 与 AWS CloudTrail 集成,后者是一项服务,提供 Amazon S3 中由用户、角色或 AWS 服务所采取操作的记录。CloudTrail 将对 Amazon S3 的 API 调用子集作为事件捕获,包括来自 Amazon S3 控制台的调用和对 Amazon S3 API 的代码调用。如果您创建跟踪,则可以使 CloudTrail 事件持续传送到 Amazon S3 存储桶(包括 Amazon S3 的事件)。如果您不配置跟踪,则仍可在 CloudTrail 控制台中的 Event history (事件历史记录) 中查看最新事件。使用 CloudTrail 收集的信息,您可以确定向 Amazon S3 发出了什么请求、发出请求的 IP 地址、何人发出的请求、请求的发出时间以及其他详细信息。

要了解有关 CloudTrail 的更多信息,包括如何对其进行配置和启用,请参阅 AWS CloudTrail 用户指南

CloudTrail 中的 Amazon S3 信息

在您创建 AWS 账户时,将在该账户上启用 CloudTrail。当 Amazon S3 中发生受支持的事件活动时,该活动将记录在 CloudTrail 事件中,并与其他 AWS 服务事件一同保存在 Event history (事件历史记录) 中。您可以在 AWS 账户中查看、搜索和下载最新事件。有关更多信息,请参阅使用 CloudTrail 事件历史记录查看事件

要持续记录 AWS 账户中的事件(包括 Amazon S3 的事件),请创建跟踪。通过跟踪,CloudTrail 可将日志文件传送至 Amazon S3 存储桶。默认情况下,在控制台中创建跟踪时,此跟踪应用于所有区域。此跟踪记录来自 AWS 分区中的所有区域的事件,并将日志文件传送至您指定的 Amazon S3 存储桶。此外,您可以配置其他 AWS 服务,进一步分析在 CloudTrail 日志中收集的事件数据并采取操作。有关更多信息,请参阅下列内容:

每个事件或日志条目都包含有关生成请求的人员的信息。身份信息帮助您确定以下内容:

  • 请求是使用根用户凭证还是 IAM 用户凭证发出的。

  • 请求是使用角色还是联合身份用户的临时安全凭证发出的。

  • 是否由其他 AWS 服务发出请求。

有关更多信息,请参阅 CloudTrail userIdentity 元素

日志文件可以在存储桶中存储任意长时间,不过您也可以定义 Amazon S3 生命周期规则以自动存档或删除日志文件。默认情况下,将使用 Amazon S3 服务器端加密 (SSE) 对日志文件进行加密。

CloudTrail 日志记录跟踪的 Amazon S3 账户级操作

CloudTrail 会记录帐户级操作。Amazon S3 记录与其他 AWS 服务记录一起写入日志文件。CloudTrail 基于时间段和文件大小来确定何时创建并写入新文件。

本节中的表格列出了可用于 CloudTrail 日志记录的 Amazon S3 账户级操作。

CloudTrail 日志记录跟踪的 Amazon S3 账户级 API 操作将显示为以下事件名称:

CloudTrail 日志记录跟踪的 Amazon S3 存储桶级操作

默认情况下,CloudTrail 将记录存储桶级操作。Amazon S3 记录与其他 AWS 服务记录一起写入日志文件。CloudTrail 基于时间段和文件大小来确定何时创建并写入新文件。

本节中的表格列出了可用于 CloudTrail 日志记录的 Amazon S3 存储桶级操作。

除了这些 API 操作之外,也可以使用 OPTIONS 对象对象级操作。由于此操作将检查存储桶的 CORS 配置,因此它被视为 CloudTrail 日志记录中的存储桶级操作。

CloudTrail 日志记录跟踪的 Amazon S3 对象级操作

您还可以获取对象级 Amazon S3 操作的 CloudTrail 日志。要执行此操作,请指定跟踪的 Amazon S3 对象。当对象级操作在您的账户中发生时,CloudTrail 将评估您的跟踪设置。如果事件与您在跟踪中指定的对象相匹配,则记录该事件。有关更多信息,请参阅《Amazon Simple Storage Service 控制台用户指南》中的如何使用 AWS CloudTrail 数据事件为 S3 存储桶启用对象级日志记录?和《AWS CloudTrail 用户指南》中的记录跟踪的数据事件

下表列出了记录为 CloudTrail 事件的对象级 API 操作:

除了这些操作之外,在特定情况下,您还可以使用以下存储桶级操作获取 CloudTrail 日志作为对象级 Amazon S3 操作:

跨账户情形中的对象级操作

下面是涉及跨账户情形中的对象级 API 调用的特殊使用案例以及报告 CloudTrail 日志的方法。CloudTrail 始终会将日志提供给请求者(进行 API 调用的人)。在设置跨账户访问时,请考虑本部分中的示例。

注意

这些示例假定 CloudTrail 日志已适当配置。

示例 1:CloudTrail 将访问日志提供给存储桶拥有者

仅当存储桶拥有者具有对同一对象 API 的权限时,CloudTrail 才会将访问日志提供给存储桶拥有者。请考虑以下跨账户情形:

  • 账户 A 拥有该存储桶。

  • 账户 B(请求者)尝试访问该存储桶中的对象。

CloudTrail 始终将对象级 API 访问日志提供给请求者。此外,仅当存储桶拥有者具有对该对象执行同一 API 操作的权限时,CloudTrail 才会将相同的日志提供给存储桶拥有者。

注意

如果存储桶拥有者也是对象拥有者,存储桶拥有者将获得对象访问日志。否则,存储桶拥有者必须通过对象 ACL 获取权限,以便让相同的对象 API 获取相同的对象访问 API 日志。

示例 2:CloudTrail 没有使设置对象 ACL 时使用的电子邮件地址激增

请考虑以下跨账户情形:

  • 账户 A 拥有该存储桶。

  • 账户 B (请求者) 使用电子邮件地址发送了一个设置对象 ACL 授权的请求。有关 ACL 的信息,请参阅访问控制列表 (ACL) 概述

该请求获取日志以及电子邮件信息。但是,存储桶拥有者 (如果他们像在示例 1 中一样有资格接收日志) 将获取报告该事件的 CloudTrail 日志。但是,存储桶拥有者不会获取 ACL 配置信息,尤其是被授权者电子邮件和授权。日志为存储桶拥有者提供的唯一信息是账户 B 进行了 ACL API 调用。

使用 Amazon S3 SOAP API 调用进行 CloudTrail 跟踪

CloudTrail 跟踪 Amazon S3 SOAP API 调用。Amazon S3 HTTP 上的 SOAP 支持已弃用,但是仍可在 HTTPS 上使用。有关 Amazon S3 SOAP 支持的更多信息,请参阅 附录 A:使用 SOAP API

重要

SOAP 不支持较新的 Amazon S3 功能。我们建议您使用 REST API 或 AWS 开发工具包。

CloudTrail 日志记录跟踪的 Amazon S3 SOAP 操作
SOAP API 名称 CloudTrail 日志中使用的 API 事件名称

ListAllMyBuckets

ListBuckets

CreateBucket

CreateBucket

DeleteBucket

DeleteBucket

GetBucketAccessControlPolicy

GetBucketAcl

SetBucketAccessControlPolicy

PutBucketAcl

GetBucketLoggingStatus

GetBucketLogging

SetBucketLoggingStatus

PutBucketLogging

将 CloudTrail 日志与 Amazon S3 服务器访问日志和 CloudWatch Logs 结合使用

AWS CloudTrail 日志记录用户、角色或 AWS 服务在 Amazon S3 中执行的操作,而 Amazon S3 服务器访问日志提供向 S3 存储桶发出的请求的详细记录。有关不同日志的工作方式及其属性、性能和成本的更多信息,请参阅使用 Amazon S3 进行记录

您可以将 AWS CloudTrail 日志与 Amazon S3 的服务器访问日志搭配使用。CloudTrail 日志为您提供了 Amazon S3 存储桶级别和对象级操作的详细 API 跟踪。Amazon S3 的服务器访问日志可让您了解对于 Amazon S3 中您的数据的对象级别操作。有关服务器访问日志的更多信息,请参阅 Amazon S3 服务器访问日志记录

您还可以将 CloudTrail 日志与 Amazon S3 的 CloudWatch 一起使用。CloudTrail 与 CloudWatch Logs 集成可将 CloudTrail 捕获到的 S3 存储桶级 API 活动传送给您指定的 CloudWatch 日志组中的 CloudWatch 日志流。您可以创建用于监控特定 API 活动的 CloudWatch 警报,并在此特定 API 活动发生时收到电子邮件通知。有关用于监控特定 API 活动的 CloudWatch 警报的更多信息,请参阅《AWS CloudTrail 用户指南》https://docs.amazonaws.cn/awscloudtrail/latest/userguide/。有关将 CloudWatch 与 Amazon S3 结合使用的更多信息,请参阅使用 Amazon CloudWatch 监控指标

示例:Amazon S3 日志文件条目

跟踪是一种配置,可用于将事件作为日志文件传送到您指定的 Amazon S3 存储桶。CloudTrail 日志文件包含一个或多个日志条目。事件表示来自任何源的单个请求。它包括有关所请求操作的信息、操作的日期和时间、请求参数等。CloudTrail 日志文件不是公用 API 调用的有序堆栈跟踪,因此它们不会按任何特定顺序显示。

下面的示例显示了一条 CloudTrail 日志条目,它演示了 GET 服务PUT 存储桶 aclGET 存储桶版本控制操作。

{ "Records": [ { "eventVersion": "1.03", "userIdentity": { "type": "IAMUser", "principalId": "111122223333", "arn": "arn:aws:iam::111122223333:user/myUserName", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "myUserName" }, "eventTime": "2019-02-01T03:18:19Z", "eventSource": "s3.amazonaws.com", "eventName": "ListBuckets", "awsRegion": "us-west-2", "sourceIPAddress": "127.0.0.1", "userAgent": "[]", "requestParameters": { "host": [ "s3.us-west-2.amazonaws.com" ] }, "responseElements": null, "additionalEventData": { "SignatureVersion": "SigV2", "AuthenticationMethod": "QueryString" }, "requestID": "47B8E8D397DCE7A6", "eventID": "cdc4b7ed-e171-4cef-975a-ad829d4123e8", "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }, { "eventVersion": "1.03", "userIdentity": { "type": "IAMUser", "principalId": "111122223333", "arn": "arn:aws:iam::111122223333:user/myUserName", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "myUserName" }, "eventTime": "2019-02-01T03:22:33Z", "eventSource": "s3.amazonaws.com", "eventName": "PutBucketAcl", "awsRegion": "us-west-2", "sourceIPAddress": "", "userAgent": "[]", "requestParameters": { "bucketName": "", "AccessControlPolicy": { "AccessControlList": { "Grant": { "Grantee": { "xsi:type": "CanonicalUser", "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", "ID": "d25639fbe9c19cd30a4c0f43fbf00e2d3f96400a9aa8dabfbbebe1906Example" }, "Permission": "FULL_CONTROL" } }, "xmlns": "http://s3.amazonaws.com/doc/2006-03-01/", "Owner": { "ID": "d25639fbe9c19cd30a4c0f43fbf00e2d3f96400a9aa8dabfbbebe1906Example" } } "host": [ "s3.us-west-2.amazonaws.com" ], "acl": [ "" ] }, "responseElements": null, "additionalEventData": { "SignatureVersion": "SigV4", "CipherSuite": "ECDHE-RSA-AES128-SHA", "AuthenticationMethod": "AuthHeader" }, "requestID": "BD8798EACDD16751", "eventID": "607b9532-1423-41c7-b048-ec2641693c47", "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }, { "eventVersion": "1.03", "userIdentity": { "type": "IAMUser", "principalId": "111122223333", "arn": "arn:aws:iam::111122223333:user/myUserName", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "myUserName" }, "eventTime": "2019-02-01T03:26:37Z", "eventSource": "s3.amazonaws.com", "eventName": "GetBucketVersioning", "awsRegion": "us-west-2", "sourceIPAddress": "", "userAgent": "[]", "requestParameters": { "host": [ "s3.us-west-2.amazonaws.com" ], "bucketName": "DOC-EXAMPLE-BUCKET1", "versioning": [ "" ] }, "responseElements": null, "additionalEventData": { "SignatureVersion": "SigV4", "CipherSuite": "ECDHE-RSA-AES128-SHA", "AuthenticationMethod": "AuthHeader", }, "requestID": "07D681279BD94AED", "eventID": "f2b287f3-0df1-4961-a2f4-c4bdfed47657", "eventType": "AwsApiCall", "recipientAccountId": "111122223333" } ] }