使用CloudTrail和Athena分析S3访问日志

一、背景

S3存储桶的文件读写日志包括Server Access Log和CloudTrail两种方式。二者之间的差别可参考如下网址:

https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/logging-with-S3.html

在官方上描述非常详细,可看到CloudTrail采集的信息更加丰富,因此本文将介绍使用CloudTrail做分析。如下截图。

二、启用CloudTrail日志

CloudTrail日志可以从CloudTrail服务界面启动,也可以从S3存储桶界面跳转过去。本文截图描写从S3界面进入。

首先进入S3存储桶属性界面(第二个标签页)。如下截图。

https://blogimg.bitipcman.com/wp-content/uploads/2021/07/s3log-02

将页面向下滚动后,来到CloudTrail界面,点击配置CloudTrail即可跳转。如下截图。

https://blogimg.bitipcman.com/wp-content/uploads/2021/07/s3log-03

在CloudTrail界面,点击新建。如下截图。

https://blogimg.bitipcman.com/wp-content/uploads/2021/07/s3log-04

在新建CloudTrail的界面上,输入名称,选择Create new S3 bucket,并使用自动生成的名称。新生成的日志将保存在这个存储桶内。此存储桶名字将包含AWS账户ID(12位数字),用以区分。如下截图。

https://blogimg.bitipcman.com/wp-content/uploads/2021/07/s3log-05

继续向下滚动屏幕。在加密位置,不要选中SSE-KMS加密。在CloudWatch Log位置不要启用,这样日志将仅保存到S3,不保存到CloudWatch。其他选项保持默认。如下截图。

https://blogimg.bitipcman.com/wp-content/uploads/2021/07/s3log-06

在向导第二步,选择Event Type事件类型是Management EventData events两个。其中第二个Data Event默认是不选中的,这里需要开启。其他选项保持默认不变。如下截图。

https://blogimg.bitipcman.com/wp-content/uploads/2021/07/s3log-07

继续向下滚动页面。选项保持不变。点击右下角创建按钮。如下截图。

https://blogimg.bitipcman.com/wp-content/uploads/2021/07/s3log-08

在向导的最后一步,无须修改任何设置,点击创建。如下截图。

https://blogimg.bitipcman.com/wp-content/uploads/2021/07/s3log-09

创建完毕,可以看到CloudTrail下多了一条记录。如下截图。

https://blogimg.bitipcman.com/wp-content/uploads/2021/07/s3log-10

二、生成Athena表格并通过SQL查询日志

点击CloudTrail左侧的菜单折叠栏,展开菜单,点击第二项Event History,从中已经可以看到对S3的操作日志了。点击创建。

https://blogimg.bitipcman.com/wp-content/uploads/2021/07/s3log-11

选中上一步配置CloudTrail时候日志所在的S3存储桶,然后点击创建即可创建好Athena表格。如下截图。

https://blogimg.bitipcman.com/wp-content/uploads/2021/07/s3log-12

如果此时Athena提示无法创建表缺少权限,那么一般是由于本账户的Lake Formation对数据管理权限不足造成的,Lake Formation需要指定数据管理员的身份(IAM Role或IAM User)。制定完成后,Athena即可创建完毕。

创建完毕后页面上方提示绿色的Athena创建完毕。如下截图。

https://blogimg.bitipcman.com/wp-content/uploads/2021/07/s3log-13

三、使用Athena查询日志

进入Athena服务,运行查询程序。

如果之前没有进入过Athena服务,那么第一次运行Athena时候,会提示需要设置一个Athena Outout bucket for querying result。此时,需要点击右上角的Setting进入设置,然后选择一个存储桶,保存Athena查询结果。如下截图。

https://blogimg.bitipcman.com/wp-content/uploads/2021/07/s3log-14

注意:Athena查询结果和Source不能放在同一个桶里,被查询的CloudTrail日志和Athena查询结果需要在不同的目录。

执行如下一段查询。请酌情替换from字段中的default数据库名和表名cloudtrail_logs_aws_cloudtrail_logs_133129065110_36515686,不同账号下生成的存储桶名称不一样。如果需要查询上传时间,请修改GetObjectPutObject

SELECT
eventTime, 
eventName, 
eventSource, 
sourceIpAddress, 
userAgent, 
json_extract_scalar(requestParameters, '$.bucketName') as bucketName, 
json_extract_scalar(requestParameters, '$.key') as object,
userIdentity.arn as userArn
FROM
default.cloudtrail_logs_aws_cloudtrail_logs_133129065110_36515686 
WHERE
eventName = 'GetObject'
AND eventTime BETWEEN '2021-07-09T00:00:00Z' and '2021-07-11T00:00:00Z'

由此可以看到查询结果。如下截图。

https://blogimg.bitipcman.com/wp-content/uploads/2021/07/s3log-15

至此配置完成。

## 四、参考文档

参考文档:

https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/cloudtrail-request-identification.html#identify-S3-requests-using-in-CTlog