CloudTrail Lakeで特定のS3バケットのデータイベントのみを収集するイベントデータストアを作成してみた

2022.05.16

アノテーション テクニカルサポートの小川です。

S3オブジェクトへのアクセス拒否エラーの原因を調査する際、主に以下の要素からアクセス拒否の原因を考えます。

  • IAMユーザーなど、アクセスを試みる主体のIAMポリシーやアクセス許可の境界
  • バケットポリシーやオブジェクト所有者などS3の設定
  • S3の暗号化設定に使用したKMSのキーポリシー
  • SCP

しかし、ポリシーが複雑な場合など原因が断定できないときもあるため、そのようなときはS3オブジェクトへのリクエストログを確認します。

S3オブジェクトのリクエストログは

  • S3のサーバーアクセスログ
  • CloudTrail証跡(該当のS3のデータイベントを記録する設定をしていることが前提)
  • CloudTrail Lake(同上)

から確認できます(サーバーアクセスログよりCloudTrailの方が詳細な情報を確認可能)。
上記のうち、CloudTrail Lakeで確認したことがなかったため、該当のS3データイベントのみを収集するCloudTrail Lakeイベントデータストアを作成してみました。

なお、サーバーアクセスログ、CloudTrail証跡、CloudTrail Lakeいずれにしても、作成・有効にする以前に行ったリクエストのログは確認できませんので、お気をつけください。

CloudTrail Lake とは

簡単にいうと、CloudTrailイベントに対して、Athenaなしでクエリを実行できる機能です。

イベントデータストアを作成する

CloudTrail Lakeを利用するには、まずイベントデータストアの作成が必要です。

特定のS3バケットのみデータイベントを収集するには、ログセレクターテンプレートを「カスタム」に設定し、高度なイベントセレクターで、以下のように設定します。

フィールド resources.ARN
オペレーター 次で始まる
Value S3バケットのARN/

上記ではValue末尾の「/」が重要です。
例えば、Value末尾を「bucket-name」とスラッシュなしにした場合、「bucket-name-log」というバケットのデータイベントも収集されてしまいます。

S3 バケット ARN を使用することによって高度なイベントセレクターでデータイベントを除外または含めるには、常に [Starts with] (次で始まる) オペレーターを使用してください。
引用元:イベントデータストアを作成する

ただし、将来的にはこの設定方法ではなく、記録したいS3バケットを簡単に選択できるようになるかもしれません。
証跡で特定のS3バケットのデータイベントを記録する際は、以下のようにシンプルに設定できます。

最後に内容を確認の上、データイベントを作成して終了です。

クエリしてみる

Athenaと同様、以下のようにクエリできます。
以下では、eventNameがGetObjectであるログが、イベント時刻とバケット名だけ出力されています。

SELECT eventTime,element_at(requestParameters, 'bucketName') FROM xxx
WHERE eventName='GetObject';

出力された5個のバケットは、1つを除いて指定したS3バケットのものです。
4番目の結果だけは別のS3バケットですが、これは一時的に収集するイベントを、以下のようにValue末尾の「/」なしで設定した時に収集されたログになります。

フィールド resources.ARN
オペレーター 次で始まる
Value S3バケットのARN

末尾のスラッシュなしの場合、このように特定のS3バケット以外のデータイベントが収集されることもあるので、特定のS3バケットのみデータイベントを収集したい場合は、Valueの末尾にスラッシュを付けることを忘れないようにしましょう。

参考資料

イベントデータストアを作成する

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、さまざまな背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。