【AWSのログ管理】S3サーバアクセスログをAthenaを使って調査してみる

S3サーバアクセスログについて

S3サーバアクセスログとは、S3バケット内のオブジェクトに対する操作やアクセスをログとして記録する機能です。

これらのログは取得するだけではなく、分析することで、トラフィックのパターンやボトルネックの特定、エラーのトラブルシューティング、セキュリティ上の問題の発見などが可能になります。

今回は、S3サーバアクセスログをAthenaを使って分析をしてみたいと思います。わかりやすく図にすると以下のような構成になります。


それでは設定を行っていきます。

前提

ログ送信元S3バケットがすでに作成されている、かつ、アクセスログ設定が無効化である前提ですすめます。

ログ送信先S3バケットの作成

まずは、アクセスログを保管するログ送信先S3バケットを作成します。
バケット作成の手順は割愛しますが、アクセスコントロール(ACL)の設定で「S3 ログ配信グループ」にアクセス許可があることを確認します。
S3バケット > アクセス許可 > アクセスリスト(ACL) >  S3ログ配信グループ欄を確認して、下記画像のように設定が入っていることを確認します。

下記画像は、「-」となっており、ACL許可がされていませんので変更する必要があります。

その他にもいくつかの制約があるので詳しく知りたい方は、AWSドキュメントを確認してください。
AWSドキュメント:https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/enable-server-access-logging.html


ログ送信元S3バケットのアクセスログ設定

※すでにS3バケットは作成済みである前提で進めます。

ログ送信元S3バケットのアクセスログ設定をしていきます。
アクセスログの設定はデフォルトでは無効になっています。

1.S3バケット > プロパティ をクリックします。
サーバーアクセスのログ記録欄の「編集」をクリックします。

2.サーバーアクセスのログ記録欄を入力します。
サーバーアクセスのログ記録:有効にする
ターゲットバケット:先程作成したログ送信先S3バケットを指定
入力後、最下段の「変更の保存」をクリック。

3.有効化の確認
下記画像のように、「有効」に変わっていることを確認します。

以上でアクセスログの設定は終了です。
しばらく待つと、ログ送信先S3バケット内にログが溜まり始めます。

S3サーバアクセスログの形式について

S3サーバアクセスログは、テキスト形式のログファイルとして保存されます。ログファイルには、アクセス時の日時、リクエストの種類(GET、PUTなど)、リクエストされたオブジェクトのキー、アクセスを行ったIPアドレスなどの情報が含まれます。

ログ形式の詳細については、こちらを参考にしてください。

Athenaの設定

S3サーバアクセスログの調査ができるように、Athenaを設定していきます。

1.AWS コンソールにログインし、Athenaを選択します。

2.「クエリエディタを起動」をクリック。

3.注意事項 クエリ結果の保存設定
初めてAthenaを利用する場合、画像にあるような注意事項が表示され、クエリエディタからクエリを実行することができません。
Athenaのクエリ結果を保存するためのS3バケット設定が必要になります。

予めS3バケットの用意がある場合はそのまま「設定を編集」をクリックして設定にすすみます。
S3バケットの用意が無い場合は、S3バケットを新たに作成してから画像にある「設定を編集」にすすみます。

「設定を編集」をクリック後、いくつか入力項目があります。
「クエリ」結果の場所
にS3バケット名を指定します。
他の設定は適宜指定をしてください。後で変更することもできます。
「保存」をクリックするとクエリが実行できるようになります。

4.データベースの設定
Athena内にアクセスログを分析するためのデータベースを作成します。
データベース名はわかりやすいように「s3_access_logs」としてます。
クエリエディタ画面に下記のコードをペーストして「実行」します。

CREATE DATABASE s3_access_logs;

コマンドが正常に実行できれば、データベース欄のプルダウンメニューに作成したデータベース「s3_access_logs」が表示されます。

5.テーブル作成
続いてテーブル作成をします。
テーブル作成用のコマンドはAWSドキュメントに記載のコマンドを参考にして実行します。
参考:https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/using-s3-access-logs-to-identify-requests.html

下部にある、「LOCATION」部分の編集が必要です。S3サーバアクセスログ保管用に作成したログ送信先S3バケットを指定します。

CREATE EXTERNAL TABLE `s3_access_logs.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://<作成したログ送信先S3バケット名を指定>/<prefix>/'

コマンドが成功すると、左側の画面のテーブル欄に「mybucket_logs」テーブルが表示されるようになります。

これでAthenaの準備は終了です。ログにたいしてクエリを実行できるようになりました。

ログ調査

まずは、Athena内にログデータが入っているか確認します。
クエリエディタ画面に下記のコマンドをペーストして「実行」します。
うまくいけば、10件のログが出力されます。

SELECT * FROM "mybucket_logs" limit 10;

参考までにいくつかクエリを紹介します。

特定のIAMユーザのオペレーションログを調べる。
※アカウントID および user_nameは適宜変更してください。

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

特定のIPアドレスからのアクセスログを抽出する。
※IPアドレスは適宜変更してください。

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs.mybucket_logs
WHERE remoteip='xxx.xxx.xxx.xxx'

HTTPステータスが400番以上のログを抽出する。

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs.mybucket_logs
WHERE httpstatus >= '400'

特定の時間内で起きたHTTPステータスが400番以上のログを抽出する。

SELECT requestdatetime, httpstatus, errorcode, bucket_name, remoteip, requester, key
FROM s3_access_logs.mybucket_logs
WHERE httpstatus >= '400'
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN parse_datetime('2023-07-15:12:00:00','yyyy-MM-dd:HH:mm:ss')
AND parse_datetime('2023-07-15:12:10:00','yyyy-MM-dd:HH:mm:ss');


まとめ

S3サーバアクセスログは、S3バケットへのアクセスの監視、トラブルシューティング、セキュリティの向上などに役立ちます。アクセスログを有効化し、ログデータを適切に保管・分析することで、S3リソースの管理とセキュリティの向上に寄与することができます。
ぜひ有効化したいものですね。

参考

関連

【AWSのログ管理】ALBのアクセスログをAthenaを使って調査してみる
【AWSのログ管理】CloudFrontのログをAthenaを使って調査してみる
【AWSのログ管理】WAFのログをAthenaを使って調査してみる
【AWSのログ管理】Route53 ResolverのログをAthenaを使って調査してみる
【AWSのログ管理】VPC Flow LogsをAthenaを使って調査してみる




この記事が気に入ったらサポートをしてみませんか?