[アップデート]CloudTrail Lake で高度なイベントセレクターがサポートされました
あしざわです。
CloudTrail Lake のイベントフィルタリング機能が強化され、イベントデータストアに取り込まれるCloudTrail イベントを細かく制御できるようになりました。
フィルタリング機能の利用によってイベントデータストアに取り込むイベントの量を大幅に削減し、関連するユーザーおよびシステムアクティビティの可視性を維持しながらコスト削減できるようになりました。
アップデートによって変わったこと
これまでは、取得するイベントをチェックボックスで選択する形式となっており、取得するイベントを細かく選択することはできませんでした。

今回のアップデートで、以下のイベントが高度なイベントセレクターに対応しました。
- 管理イベント
 - データイベント
 
高度なイベントセレクターを利用することで、eventSource、eventType、userIdentity.arnなどの属性で取得するログをフィルタリングできます。
確認してみた
CloudTrail Lake イベントデータストアを新規に作成して、アップデート内容を試してみます。
データストアを作成していき、イベントの選択で「管理イベント / データイベント」を選択します。

管理イベントでは、従来のセレクターである Simple event collection もしくは 新しいイベントセレクターのAdvanced event collection のどちらかを選択できるようになっています。

Advanced event collection では、以下の事前に定義されたログセレクターテンプレートの中から1つを選択します。
- すべてのイベントをログ記録
 - readOnly イベントをログ記録
 - writeOnly イベントをログ記録
 - Log only AWS Management Console events
 - Exclude AWS Service-initiated events
 - カスタム
 

カスタムを選択すると、高度なイベントセレクターが利用できます。

フィールドとして指定できる値はこちらです。
- eventName:リクエストされたAPI アクション
 - eventSource:リクエストが行われたサービス
 - eventType:イベントレコードを生成したイベントのタイプ (例: AwsApiCall、AwsServiceEvent など)
 - userIdentity.arn:特定の IAM ID によって実行されたアクションのイベント
 - sessionCredentialFromConsole:AWS マネジメントコンソールセッションから発生したイベント
 - readOnly:読み取りイベントのみ
 
高度なイベントセレクターの設定内容は、JSON ビューからも確認できます。

今回の検証では、cm-から始まるIAMロール名のみAPIアクションを記録するように設定しました。
- 条件
- フィールド: userIdentity.arn
 - オペレーター: 次で始まる
 - Value: 
arn:aws:iam::123456789012:role/cm- 
 

JSONビューはこちら
[
  {
    "Name": "sample-selector",
    "FieldSelectors": [
      {
        "Field": "eventCategory",
        "Equals": [
          "Management"
        ]
      },
      {
        "Field": "userIdentity.arn",
        "StartsWith": [
          "arn:aws:iam::123456789012:role/cm-"
        ]
      }
    ]
  }
]
続いて、データイベントのイベントセレクターはこちら。

管理イベントと異なり、取得するデータイベントのタイプをAWSサービスの中から選びます。今回はS3を選びました。
ログセレクターテンプレートは管理イベントと同じ選択肢の中から指定します。
管理イベント同様、カスタムを選択するとが出てきます。
高度なイベントセレクターで指定できるフィールドは、管理イベントのものに加え resouces.ARN が指定できました。個別のリソースに関連したデータイベントのみ取得したり、通信料の多いリソースを除外する用途で活用できそうです。
今回の検証では、特定のS3 バケット(sample-cloudtrail-bucket-) へのGetObject のみのログを記録するように設定しました。
- 条件1
- フィールド: eventName
 - オペレーター: 次と等しい
 - Value: 
GetObject 
 - 条件2
- フィールド: resource.ARN
 - オペレーター: 次で始まる
 - Value: 
arn:aws:s3:::sample-cloudtrail-bucket- 
 

JSONビューはこちら
[
  {
    "Name": "sample-selector",
    "FieldSelectors": [
      {
        "Field": "eventCategory",
        "Equals": [
          "Data"
        ]
      },
      {
        "Field": "resources.type",
        "Equals": [
          "AWS::S3::Object"
        ]
      },
      {
        "Field": "eventName",
        "Equals": [
          "GetObject"
        ]
      },
      {
        "Field": "resources.ARN",
        "StartsWith": [
          "arn:aws:s3:::sample-cloudtrail-bucket-"
        ]
      }
    ]
  }
]
そのまま画面を進めていき、イベントデータストアを作成して完了です。
最後に、想定通りログがフィルターされているかCloudTrail Lake のクエリエディターから確認してみます。

まずは管理イベントからです。
事前にマネジメントコンソール上でこのような作業を実施し、CloudTrail イベントログを発生させておきます。
- フィルター設定したIAM ロール(
cm-から始まるロール名) の認証情報を使ってコンソールを操作する - フィルター設定の対象外のロール(
test-cloudtrail-role) の認証情報を使ってコンソールを操作する 
CloudTrail Lake のクエリエディターで指定した期間内の管理イベントをクエリし、1.のイベントログは記録され、2.のイベントログは記録されていないことを確認します。
管理イベント 1.の確認結果
SELECT *
FROM <イベントデータストア ID>
WHERE userIdentity.arn = 'arn:aws:sts::123456789012:assumed-role/cm-ashizawa.hiroaki/cm-ashizawa.hiroaki' 
  AND eventtime >= 'yyyy-mm-dd 00:00:00'
  AND eventtime <= 'yyyy-mm-dd7 23:59:59'
・結果
0 records matched | 338 records (101.6 kB) scanned in 1.6s @ 216.8 records/s (65.1 kB/s)
管理イベント 2.の確認結果
SELECT *
FROM <イベントデータストア ID>
WHERE userIdentity.arn = 'arn:aws:sts::123456789012:assumed-role/test-cloudtrail-role/cm-ashizawa.hiroaki' 
  AND eventtime >= 'yyyy-mm-dd 00:00:00'
  AND eventtime <= 'yyyy-mm-dd7 23:59:59'
・レスポンス
288 records matched | 338 records (101.6 kB) scanned in 0.4s @ 777 records/s (233.4 kB/s)
1.の結果からフィルター設定したcm-から始まるロール名のイベントログはに記録されているが、2.の結果でフィルター対象ではないロールのイベントログは記録されていないことが確認できました。想定通りですね。
続いて、データイベントです。
事前にマネジメントコンソール上でこのような作業を実施し、CloudTrail イベントログを発生させておきます。
- S3 バケット 
sample-cloudtrail-bucket-[AWS アカウントID]にアップロードした画像をダウンロードする - S3 バケット 
kankeinai-bucket-[AWS アカウントID]にアップロードした画像をダウンロードする 
クエリエディタから、指定した期間内にGetObjectが実行されたS3バケット名を確認します。
SELECT eventTime,
	eventSource,
    eventName,
	requestparameters['bucketName'] AS bucketName
FROM <イベントデータストア ID>
WHERE eventSource = 's3.amazonaws.com'
	AND eventName = 'GetObject'
  AND eventtime >= 'yyyy-mm-dd 00:00:00'
  AND eventtime <= 'yyyy-mm-dd7 23:59:59'
・レスポンス
1 record matched | 338 records (101.6 kB) scanned in 1.7s @ 199.3 records/s (59.9 kB/s)
・コマンド出力
eventTime,eventSource,eventName,bucketName
2024-11-16 15:32:48.000,s3.amazonaws.com,GetObject,sample-cloudtrail-bucket-[AWS アカウントID]
想定通り、sample-cloudtrail-bucket-[AWS アカウントID]のみがログとして記録されており、kankeinai-bucket-[AWS アカウントID] のログは記録されていないことがわかりました。
まとめ
CloudTrail Lake に追加された管理イベント・データイベントの高度なイベントセレクターについて確認・検証してみました。
初登場時は、コスト最適化系の機能があまり揃っておらず、ランニングコストが高いイメージがあったCloudTrail Lake ですが直近の1年間でコスト最適化オプションが次々と追加されています。
監査目的のCloudTrail ログをS3に保存するだけであれば、各AWSアカウントにCloudTrail 証跡を設定したり組織の証跡を利用すればほぼコスト0で運用できます。
ただ、マルチアカウント環境のCloudTrail ログをまとめて管理・分析する用途では、CloudTrail Lake を利用すると運用がかなり楽になるため、選択肢の一つになれるオススメのサービスです。
今回のアップデートはCloudTrail Lake を使っていきたいけど、コストが気になって使い続けられなかった方におすすめのアップデートでした。
この記事が誰かのためになれば幸いです。
以上です。






