使用 Amazon S3 访问日志确定请求 - Amazon Simple Storage Service

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

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

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

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

使用 Amazon Athena 查询访问日志中的请求

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

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

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

注意

要在 Athena 查询中指定 Amazon S3 位置,您需要格式化目标桶名称和目标前缀,其中日志以 S3 URI 形式传递,如下所示:s3://DOC-EXAMPLE-BUCKET1-logs/prefix/

  1. https://console.aws.amazon.com/athena/ 打开 Athena 控制台。

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

    create database s3_access_logs_db
    注意

    最佳实践是在与 S3 桶所在相同的 AWS 区域中创建数据库。

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

    CREATE EXTERNAL TABLE `s3_access_logs_db.mybucket_logs`( `bucketowner` STRING, `bucket_name` STRING, `requestdatetime` STRING, `remoteip` STRING, `requester` STRING, `requestid` STRING, `operation` STRING, `key` STRING, `request_uri` 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, `endpoint` STRING, `tlsversion` STRING, `accesspointarn` STRING, `aclrequired` STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'input.regex'='([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET1-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 coalesce(SUM(bytessent), 0) AS bytessenttotal, 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('2022-06-01','yyyy-MM-dd') AND parse_datetime('2022-07-01','yyyy-MM-dd');
注意

要减少保留日志的时间,您可以为您的服务器访问日志桶创建 Amazon S3 生命周期配置。配置生命周期配置以定期删除日志文件。这样做可以减少 Athena 为每个查询分析的数据量。有关更多信息,请参阅在存储桶上设置生命周期配置

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

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

注意
例 — 显示发送签名版本 2 流量的所有请求者
SELECT requester, sigv, Count(sigv) as sigcount FROM s3_access_logs_db.mybucket_logs GROUP BY requester, sigv;

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

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

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

例 — 显示在特定时段内正在发送 PUT 对象请求的所有请求者
SELECT bucket_name, 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_name, 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_name, 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')

以下 Amazon Athena 查询说明如何识别向 S3 桶发出的所有请求,这些请求需要访问控制列表(ACL)进行授权。您可以使用此信息将这些 ACL 权限迁移到相应的桶策略并禁用 ACL。创建这些桶策略后,您可以对这些桶禁用 ACL。有关禁用 ACL 的更多信息,请参阅禁用 ACL 的先决条件

例 — 识别所有需要 ACL 进行授权的请求
SELECT bucket_name, requester, key, operation, aclrequired, requestdatetime FROM s3_access_logs_db WHERE aclrequired = 'Yes' AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2022-05-10:00:00:00','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2022-08-10:00:00:00','yyyy-MM-dd:HH:mm:ss')
注意
  • 您可以修改日期范围以满足您的需要。

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

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

  • 如果您使用的是 Amazon S3 AWS CloudTrail 日志,请参阅使用 CloudTrail 识别对 S3 对象的访问权限