Amazon Simple Storage Service
开发人员指南 (API 版本 2006-03-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 Amazon S3 访问日志确定请求

您可以使用 Amazon S3 访问日志确定 Amazon S3 请求。

注意

  • 我们建议您使用 AWS CloudTrail 数据事件而不是 Amazon S3 访问日志。CloudTrail 数据事件更易于设置和包含更多信息。有关更多信息,请参阅 使用 AWS CloudTrail 确定 Amazon S3 请求

  • 根据您获得的访问请求数量,可能需要更多资源和/或更多时间来分析您的日志。

为请求启用 Amazon S3 访问日志

我们建议您在其中放置 S3 存储桶的每个 AWS 区域中都创建一个专用日志记录存储桶。然后,将 Amazon S3 访问日志传输到该 S3 存储桶。

例 — 为跨两个区域的五个存储桶启用访问日志

在本示例中,您有以下 5 个存储桶:

  • 1-awsexamplebucket-us-east-1

  • 2-awsexamplebucket-us-east-1

  • 3-awsexamplebucket-us-east-1

  • 1-awsexamplebucket-us-west-2

  • 2-awsexamplebucket-us-west-2

  1. 在以下区域中创建两个日志记录存储桶:

    • awsexamplebucket-logs-us-east-1

    • awsexamplebucket-logs-us-west-2

  2. 然后启用 Amazon S3 访问日志,如下所示:

    • 1-awsexamplebucket-us-east-1 日志到 s3://awsexamplebucket-logs-us-east-1/1-awsexamplebucket-us-east-1

    • 2-awsexamplebucket-us-east-1 日志到 s3://awsexamplebucket-logs-us-east-1/2-awsexamplebucket-us-east-1

    • 1-awsexamplebucket-us-east-1 日志到 s3://awsexamplebucket-logs-us-east-1/3-awsexamplebucket-us-east-1

    • 1-awsexamplebucket-us-west-2 日志到 s3://awsexamplebucket-logs-us-west-2/1-awsexamplebucket-us-west-2

    • 2-awsexamplebucket-us-west-2 日志到 s3://awsexamplebucket-logs-us-west-2/2-awsexamplebucket-us-west-2

  3. 然后,您可以使用以下方法启用 Amazon S3 访问日志:

    • 使用 AWS 管理控制台,或者

    • 以编程方式启用日志记录 或者

    • 使用 AWS CLI put-bucket-logging 命令来在存储桶上使用以下命令以编程方式启用访问日志:

      1. 首先,使用 put-bucket-acl 授予 Amazon S3 权限:

        aws s3api put-bucket-acl --bucket awsexamplebucket-logs --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery
      2. 然后,应用日志记录策略:

        aws s3api put-bucket-logging --bucket awsexamplebucket --bucket-logging-status file://logging.json

        Logging.json 是当前文件夹中包含日志记录策略的 JSON 文档:

        { "LoggingEnabled": { "TargetBucket": "awsexamplebucket-logs", "TargetPrefix": "awsexamplebucket/", "TargetGrants": [ { "Grantee": { "Type": "AmazonCustomerByEmail", "EmailAddress": "user@example.com" }, "Permission": "FULL_CONTROL" } ] } }

        注意

        必须使用 put-bucket-acl 命令才能向 Amazon S3 日志传输系统授予必要的权限(write-acp 和 read-acp 权限)。

      3. 使用 bash 脚本为您账户中的所有存储桶添加访问日志记录:

        loggingBucket='awsexamplebucket-logs' region='us-west-2' # Create Logging bucket aws s3 mb s3://$loggingBucket --region $region aws s3api put-bucket-acl --bucket $loggingBucket --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery # List buckets in this account buckets="$(aws s3 ls | awk '{print $3}')" # Put bucket logging on each bucket for bucket in $bucenable-logging-programmingkets do printf '{ "LoggingEnabled": { "TargetBucket": "%s", "TargetPrefix": "%s/" } }' "$loggingBucket" "$bucket" > logging.json aws s3api put-bucket-logging --bucket $bucket --bucket-logging-status file://logging.json echo "$bucket done" done rm logging.json echo "Complete"

        注意

        这仅在您的所有存储桶均位于同一区域中时有用。如果您在多个区域中有存储桶,则必须调整该脚本。

针对请求查询 Amazon S3 访问日志

Amazon S3 将服务器访问日志作为对象存储在 S3 存储桶中。使用可以分析 Amazon S3 中的日志的工具通常会更轻松。Athena 支持分析 S3 对象,可用来查询 Amazon S3 访问日志。

以下示例说明了如何在 Amazon Athena 中查询 Amazon S3 服务器访问日志。

注意

要在 Athena 查询中指定 Amazon S3 位置,您需要目标存储桶名称和目标前缀,如下所示:s3://awsexamplebucket-logs/prefix/

  1. 通过以下网址打开 Athena 控制台:https://console.amazonaws.cn/athena/

  2. 在查询编辑器中,运行类似如下的命令:

    create database s3_access_logs_db

    注意

    最佳做法是在与 S3 存储桶相同的 AWS 区域中创建数据库。

  3. 在查询编辑器中,运行类似如下的命令以便在步骤 2 中创建的数据库中创建一个表架构。STRINGBIGINT 数据类型值是访问日志属性。您可以在 Athena 中查询这些属性。对于 LOCATION,输入之前记下的 S3 存储桶和前缀。

    CREATE EXTERNAL TABLE IF NOT EXISTS s3_access_logs_db.mybucket_logs( BucketOwner STRING, Bucket STRING, RequestDateTime STRING, RemoteIP STRING, Requester STRING, RequestID STRING, Operation STRING, Key STRING, RequestURI_operation STRING, RequestURI_key STRING, RequestURI_httpProtoversion STRING, HTTPstatus STRING, ErrorCode STRING, BytesSent BIGINT, ObjectSize BIGINT, TotalTime STRING, TurnAroundTime STRING, Referrer STRING, UserAgent STRING, VersionId STRING, HostId STRING, SigV STRING, CipherSuite STRING, AuthType STRING, HostHeader STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1', 'input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)\\\" (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*).*$' ) LOCATION 's3://awsexamplebucket-logs/prefix'
  4. 在导航窗格中,在 Database (数据库) 下,选择您的数据库。

  5. Tables (表) 下,选择表名称旁边的 Preview table (预览表)

    Results (结果) 窗格中,您应看到来自服务器访问日志中的数据,如 bucketownerbucketrequestdatetime 等。这表示您成功创建了 Athena 表。您现在可以查询 Amazon S3 服务器访问日志。

例 — 显示已删除对象的人员和时间(时间戳、IP 地址和 IAM 用户)

SELECT RequestDateTime, RemoteIP, Requester, Key FROM s3_access_logs_db.mybucket_logs WHERE key = 'images/picture.jpg' AND operation like '%DELETE%';

例 — 显示 IAM 用户执行的所有操作

SELECT * FROM s3_access_logs_db.mybucket_logs WHERE requester='arn:aws:iam::123456789123:user/user_name';

例 — 显示在特定时间段内对对象执行的所有操作

SELECT * FROM s3_access_logs_db.mybucket_logs WHERE Key='prefix/images/picture.jpg' AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2017-02-18:07:00:00','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2017-02-18:08:00:00','yyyy-MM-dd:HH:mm:ss');

例 — 显示在特定时间段内特定 IP 地址传输的数据量

SELECT SUM(bytessent) AS uploadTotal, SUM(objectsize) AS downloadTotal, SUM(bytessent + objectsize) AS Total FROM s3_access_logs_db.mybucket_logs WHERE RemoteIP='1.2.3.4' AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2017-06-01','yyyy-MM-dd') AND parse_datetime('2017-07-01','yyyy-MM-dd');

注意

要减少保留日志的时间,您可以为您的服务器访问日志存储桶创建一个 Amazon S3 生命周期策略。配置生命周期策略以定期删除日志文件。这样做可以减少 Athena 为每个查询分析的数据量。

使用 Amazon S3 访问日志确定签名版本 2 请求

对签名版本 2 的 Amazon S3 支持将会关闭(弃用)。在之后,Amazon S3 将不再接受使用签名版本 2 的请求,并且所有请求必须使用签名版本 4 进行签署。您可以使用 Amazon S3 访问日志确定签名版本 2 访问请求。

注意

例 — 显示发送签名版本 2 流量的所有请求者

SELECT requester, Sigv, Count(Sigv) as SigCount FROM s3_access_logs_db.mybucket_logs GROUP BY requester, Sigv;

使用 Amazon S3 访问日志确定对象访问请求

对于诸如 GET、PUT 和 DELETE 等操作,您可以对 Amazon S3 服务访问日志使用查询以确定 Amazon S3 对象访问请求,并发现有关这些请求的进一步信息。

以下 Amazon Athena 查询示例说明了如何从服务器访问日志获取对于 Amazon S3 的所有 PUT 对象请求。

例 — 显示在特定期间正在发送 PUT 对象请求的所有请求者

SELECT Bucket, Requester, RemoteIP, Key, HTTPStatus, ErrorCode, RequestDateTime FROM s3_access_logs_db WHERE Operation='REST.PUT.OBJECT' AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2019-07-01:00:42:42','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')

以下 Amazon Athena 查询示例说明了如何从服务器访问日志中获取 Amazon S3 的所有 GET 对象请求。

例 — 显示在特定时间段内发送 GET 对象请求的所有请求者

SELECT Bucket, Requester, RemoteIP, Key, HTTPStatus, ErrorCode, RequestDateTime FROM s3_access_logs_db WHERE Operation='REST.GET.OBJECT' AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2019-07-01:00:42:42','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')

以下 Amazon Athena 查询示例说明了如何从服务器访问日志中获取向 S3 存储桶发出的所有匿名请求。

例 — 显示在特定时间段内向存储桶发出请求的所有匿名请求者

SELECT Bucket, Requester, RemoteIP, Key, HTTPStatus, ErrorCode, RequestDateTime FROM s3_access_logs_db.mybucket_logs WHERE Requester IS NULL AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2019-07-01:00:42:42','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')

注意

  • 您可以修改日期范围以满足您的需要。

  • 也可以使用这些查询示例进行安全监控。您可以查看意外或未经授权的 IP 地址/请求者的 PutObjectGetObject 调用结果,以及确定向存储桶发出的任何匿名请求。

  • 此查询仅从启用了日志记录的时间检索信息。

  • 如果您使用 Amazon S3 AWS CloudTrail 日志,请参阅 使用 AWS CloudTrail 确定对于 Amazon S3 对象的访问权限

相关资源