使用 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/
从 https://console.aws.amazon.com/athena/
打开 Athena 控制台。 -
在查询编辑器中,运行类似如下的命令。
create database s3_access_logs_db
注意
最佳实践是在与 S3 桶所在相同的 AWS 区域中创建数据库。
-
在查询编辑器中,运行类似如下的命令以便在步骤 2 中创建的数据库中创建一个表架构。
STRING
和BIGINT
数据类型值是访问日志属性。您可以在 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/
' -
在导航窗格中,在 Database (数据库) 下,请选择您的数据库。
-
在 Tables (表) 下,请选择表名称旁边的 Preview table (预览表)。
在 Results (结果) 窗格中,您应看到来自服务器访问日志中的数据,如
bucketowner
、bucket
、requestdatetime
等。这表示您成功创建了 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 访问请求。
注意
-
我们建议您使用 AWS CloudTrail 数据事件而不是 Amazon S3 访问日志。CloudTrail 数据事件更易于设置并包含更多信息。有关更多信息,请参阅使用 CloudTrail 识别 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_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 地址/请求者的
PutObject
或GetObject
调用结果,以及确定向桶发出的任何匿名请求。 -
此查询仅从启用了日志记录的时间检索信息。
-
如果您使用的是 Amazon S3 AWS CloudTrail 日志,请参阅使用 CloudTrail 识别对 S3 对象的访问权限。