「アレクサ、私のプリンを食べたIAMユーザーを特定して」

AWS

2023.3.8

Topics

おばんです。Mr.oldtypeと申します。
今回はタイトル通りAWS CloudTrail Lake についてのご紹介です。

というのもこの素晴らしい機能が出てきてもう1年近く経つのですが、恥ずかしながらCloudTrail Lake について最近まで知りませんでした。
いやなんかそういう名前の項目が追加されてるなー程度には認識してたんですが、名前から勝手にDataLake のLakeだと思ってて分析に使うんかー程度にしか思ってませんでした。
なので「この毎日S3にアクセスしてるIAMユーザー誰!?」とか「冷蔵庫のプリン食べたの誰!?」って思っても、AthenaでS3バケットに対してクエリして探すことしか能がなかったんですね。

そして偶然この機能に巡り合って、SQLの知識がない僕でも簡単にクエることが出来るようになっていたので感動して記事にしました。
今回はよくあるユースケースと公式ドキュメントのクエリの例を参考に、備忘も兼ねて書置きしておきます。

CloudTrail Lake について

AWSサービスの操作(ここではAWS API と書きます)履歴を探したい時は、管理イベントであればCloudTrail イベント履歴から簡単に検索出来ました。ただ、データイベント(S3オブジェクトレベルのAPIコールとか)はイベント履歴には保存されていないので、CloudTrail 証跡を作成して、S3に保存したログをAthena などでクエリする必要がありました。これが意外と大変だったんですよね。
そのデータイベントと管理イベントのクエリ(つまり検索)を数クリックで簡単に出来るようにしてくれる機能が、CloudTrail Lake となってます。

事前準備

CloudTrail Lake でのクエリを開始するには、まずイベントデータストアというLakeさん専用のデータストアを作成する必要があります。
CloudTrail のページから簡単に作成可能です。

次に任意の名前と保存期間を指定します。

最後に保存するイベントタイプを選択します。
S3オブジェクトへのアクセスはデータイベントなので「データイベント」にチェックをして下の「データイベントタイプ」でS3を指定します。

これでイベントデータストアの作成が完了します。
注意点として、イベントデータストアを作成してからのAPIイベントしか対象となりません。それより前の履歴を検索出来ないので注意してください。

実際のユースケース

個人的によくありそうなユースケースとそのクエリ例を置いておきます。

1. 昔からある謎のIAMユーザーが毎日S3にアクセスしてる

IAMコンソールでIAMユーザーを棚卸していると、AdministratorAccess権限の付いてる謎のユーザーが。
昔のいた人の消し忘れかと思って削除しようとすると「最後のアクティビティ:30分前」の文字が。アクセスアドバイザーで見てみると、S3 へアクセスしてる履歴が残っていました。
こんな時は下記のようにクエリできます。

SELECT 
    eventID, 
    eventName, 
    eventSource, 
    eventTime ,
    sourceIPAddress
FROM 
    [イベントデータストア ID](クエリ画面から確認できます)
WHERE 
    userIdentity.username = '[IAMユーザー名]'
 /* userIdentity,accessKeyId =  '[IAMアクセスキー]' (アクセスキーで検索する場合) */
 
AND 
    eventTime > '2023-02-28 00:00:00' 
AND 
    eventTime < '2023-03-01 00:00:00'

これで2/28 ~ 3/1 間に検索対象のユーザーが行ったイベントを検索できます。

2. 特定のS3を誰が使ってるか知りたい

数年前からある「hogehoge-s3」という名前のS3。名前とランダム文字列のオブジェクトでは何に使ってるS3なのか見当が付きません。
とりあえず、誰がいつどのように使ってるか調べたい。
こんな時は下記のようにクエリできます。

SELECT 
    eventID, 
    eventName, 
    eventSource, 
    eventTime ,
    sourceIPAddress ,
    requestParameters, 
    userIdentity
FROM 
    [イベントデータストア ID](クエリ画面から確認できます)
WHERE 
    element_at(requestParameters, 'bucketName') = '[バケット名]'
AND 
    eventTime > '2023-02-28 00:00:00' 
AND 
    eventTime < '2023-03-01 00:00:00'

これで誰(userIdentity内にユーザー名があります)がどのような操作(eventName)をしているかが把握できます。
eventNameをしたいしたい場合はAND条件で指定すると絞り込めます。

他にこんな条件で検索出来たら便利だなってのがあれば追記していきます。アイデアがある方は至急メールください。

Mr.oldtype

クラウドを楽しくする、をテーマに活動しています。 2021/2022 APN Top Engineer。 でしょうね、ミスター・オールドタイプ。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら