CloudTrailでS3オブジェクトレベルのログを取得してAthenaで閲覧してみた

2019.10.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「 CloudTrail のイベント履歴を見ても、 S3 オブジェクトレベルのログが見つからない!!」

って思った方いませんか? 本ブログではそんなお悩みを抱えてるあなたに向けて、 S3 オブジェクトレベルのログを閲覧する為に必要な設定や手順を紹介します!

S3 オブジェクトレベルのログってどんなの?

上記は CloudTrail で記録される S3 レベル別のアクションです。S3 オブジェクトレベルのログは文字通り、後者のアクションのログになります。例えば、IAMユーザが S3 バケットに対してオブジェクトを PUT/GET したログを閲覧したい時は、S3 オブジェクトレベルのログが必要です。

S3 オブジェクトレベルのログを閲覧するには?

S3 オブジェクトレベルのログを閲覧するには以下の2STEP が必要です。

  1. CloudTrail による S3 バケットのオブジェクトレベルのログ記録を有効化
  2. 記録した S3 オブジェクトレベルのログを Athenaで閲覧

デフォルトでは、 CloudTrail は S3 バケットレベルのログを記録しますが、 S3 オブジェクトレベルのログは記録しない為、別途設定を有効化する必要があります。

またCloudTrail の画面上で手軽に S3 バケットレベルのログ閲覧する時は、イベント履歴を利用するかと思いますが、S3 オブジェクトレベルのログは閲覧できませんでした。そこで本ブログではAthenaを用いて当該ログを閲覧します。

それでは早速やっていくっ!!

STEP1: CloudTrail による S3 バケットのオブジェクトレベルのログ記録を有効化

  1. S3 バケットを作成する方法」を参照して、オブジェクトレベルのログを保存する為のストレージの作成をしましょう。
  2. 証跡の作成」を参照して CloudTrail で証跡の作成をしましょう!下記の入力内容は参考までに。
  3. [証跡名] :任意の名前を入力。
  4. [データイベント] - [ S3 バケットの追加] :取得したい S3 オブジェクトレベルのログがあるバケット名を入力。
  5. [ストレージの場所] - [新しいS3バケットを作成しますか] : [いいえ] を選択して、上記で作成したオブジェクトレベルのログを保存するストレージの S3 バケット名を入力。

STEP2: 記録した S3 オブジェクトレベルのログを Athenaで閲覧

今回取得するログの要件は以下の通り。CloudTrailによるログの記録に時間がかかるので、予めIAMユーザから AWS CLI 経由で対象バケットに GetObject と PutObject を実施しておいてください。

  • 対象S3バケット内に GetObject か PutObject を実行したIAMユーザのログ
  • 取得開始日は、2019年10月23日以降

STEP1 で記録を有効化した S3 オブジェクトレベルのログは、保存先に指定した S3 バケットに出力されます。しかし、S3バケット上の画面では下図のような画面で表示される為、目的のログを探すことは困難です。

また先述の通り、 CloudTrail のイベント履歴の画面には当該ログが表示できなかったので、今回はAthenaを使って閲覧します。

Athena用のテーブルを作成

  1. CloudTrail の [イベント履歴] の画面で、 [Amazon Athena で高度なクエリを実行します] をクリック。
  2. [保存場所] でバケット名を選択。今回はオブジェクトレベルのログを保存するストレージの S3 バケット名を入力。
  3. [テーブルを作成] をクリック。
  4. [Athena の画面に移動] をクリック。

Athenaでクエリ実行

  1. 画面右上の [設定] でAthenaの分析結果の出力場所が入力されているか確認する。入力されてない場合は Athena のクエリ実行結果用の S3 バケットを別途作成して指定する。適切な保存場所でない場合、クエリ実行時に以下のエラーが出ます。

[Unable to verify/create output bucket query-results-bucket]

  1. 以下の新しいクエリを作成して、 [クエリの実行] をクリック。
SELECT
eventtime,
eventname,
useridentity.type,
useridentity.username,
requestparameters
FROM {{作成したテーブル名}}
WHERE
eventtime >= '2019-10-23T00:00:00Z'
and eventName in ('GetObject','PutObject')
and useridentity.type = 'IAMUser';
  1. 実行結果の確認。PutObject/GetObjectのログが無事閲覧できた!

終わりに

いかがでしたでしょうか。S3 オブジェクトレベルのログを確認するには、S3 / CloudTrail / Athena などの知識が必要な為、敷居が少し高かったかもしれません。本ブログで悩みが解決できていれば幸いです。

以上! 筧(@TakaakiKakei)でした!