AWS CloudTrail ログのクエリ - Amazon Athena

AWS CloudTrail ログのクエリ

AWS CloudTrail は、AWS アカウントの AWS API コールとイベントを記録するサービスです。

CloudTrail ログには、AWS のサービス (コンソールなど) に対する API コールの詳細が含まれています。CloudTrail は暗号化されたログファイルを生成し、Amazon S3 に保存します。詳細については、AWS CloudTrail ユーザーガイドを参照してください。

CloudTrail ログで Athena を使用すると、AWS サービスのアクティビティ分析が大幅に強化されます。たとえば、クエリを使用して傾向を識別したり、アクティビティを属性 (ソース IP アドレスやユーザーなど) でさらに分離したりできます。

CloudTrail ログの一般的な用途として、運用上のアクティビティを分析してセキュリティやコンプライアンスに役立てることができます。詳細な例について詳しくは、AWS Big Data Blog の記事「AWS CloudTrail と Amazon Athena を使用してセキュリティ、コンプライアンス、運用上のアクティビティを分析する方法」を参照してください。

Athena では、保存先の Amazon S3 を LOCATION で指定し、そこでログファイルを直接クエリできます。これには以下の 2 つの方法があります。

  • CloudTrail コンソールから直接 CloudTrail ログファイルのテーブルを作成する。

  • Athena コンソールで CloudTrail ログファイルのテーブルを手動で作成する。

CloudTrail ログと Athena テーブルについて

テーブルの作成を開始する前に、CloudTrail の詳細およびデータの保存方法についてもう少し理解しておく必要があります。これは、テーブルを CloudTrail コンソールから作成するにしても Athena から作成するにしても、必要なテーブルを作成する役に立ちます。

CloudTrail は、ログを JSON テキストファイルとして gzip 圧縮形式 (*.json.gzip) で保存します。ログファイルの保存先は、証跡、ログを記録する AWS リージョン、その他の要因の設定方法に応じて異なります。

ログの保存先、JSON 構造、およびレコードファイルの内容の詳細については、AWS CloudTrail ユーザーガイドの以下のトピックを参照してください。

ログを収集して Amazon S3 に保存するには、コンソールで CloudTrail を有効にします。詳細については、AWS CloudTrail ユーザーガイドの「証跡の作成」を参照してください。

ログを保存する送信先 Amazon S3 バケットをメモしておきます。LOCATION 句を CloudTrail の保存先および作業対象のオブジェクトセットへのパスに置き換えてください。例では、特定のアカウントに関するログの LOCATION 値を使用していますが、目的に応じた保存先を指定できます。

例:

  • 複数のアカウントのデータを分析するには、LOCATION を元の設定に戻し、LOCATION 's3://MyLogFiles/AWSLogs/ を使用してすべての AWSLogs を分析対称にします。

  • 特定の日付、アカウント、リージョンのデータを分析するには、LOCATION `s3://MyLogFiles/123456789012/CloudTrail/us-east-1/2016/03/14/'. を使用します。

オブジェクト階層の最上位レベルを使用すると、Athena でのクエリを最も柔軟に実行できます。

CloudTrail コンソールを使用した CloudTrail ログの Athena テーブルの作成

古い CloudTrail コンソールから直接 CloudTrail ログをクエリするために、パーティション化されていない Athena テーブルを作成できます。CloudTrail コンソールから Athena テーブルを作成するには、Athena でテーブルを作成するのに十分なアクセス許可を持つ IAM ユーザーまたはロールでログインする必要があります。

注記

これらのステップは、新しい CloudTrail コンソールでは機能しません。古い CloudTrail コンソールを使用するか、Athena コンソールでテーブルを手動で作成します。

CloudTrail コンソールを使用して CloudTrail 証跡の Athena テーブルを作成するには

  1. https://console.aws.amazon.com/cloudtrail/ にある CloudTrail コンソールを開きます。

  2. 新しい CloudTrail コンソールを使用している場合は、ナビゲーションペインで [古いコンソールを使用] を選択します。

  3. ナビゲーションペインで [Event history] を選択します。

  4. [イベント履歴] で、[Amazon Athena で高度なクエリを実行します] を選択します。

  5. [保存場所] で、下矢印を使用し、ログファイルが保存され証跡がクエリされる Amazon S3 バケットを選択します。

    注記

    証跡に関連付けられているバケットの名前を確認するには、CloudTrail ナビゲーションペインで [証跡] を選択し、証跡の [S3 バケット] 列を表示することもできます。Amazon S3 のバケットの場所を確認するには、[S3 バケット] 列でバケットのリンクを選択します。これにより、Amazon S3 コンソールに CloudTrail バケットの場所が開きます。

  6. [Create table] を選択します。Amazon S3 バケットの名前を含むデフォルト名が付いたテーブルが作成されます。

Athena での CloudTrail ログのテーブルの手動作成

Athena コンソールで、CloudTrail ログファイルのテーブルを手動で作成し、Athena でクエリを実行できます。

Athena コンソールを使用して CloudTrail 証跡の Athena テーブルを作成するには

  1. 次の DDL ステートメントをコピーして Athena コンソール内に貼り付けます。このステートメントは、CloudTrail コンソールの [Amazon Athena にテーブルを作成] ダイアログボックスにあるステートメントと同じですが、テーブルをパーティション化する PARTITIONED BY 句を追加します。

  2. ログデータの保存先の Amazon S3 バケットを参照するように s3://CloudTrail_bucket_name/AWSLogs/Account_ID/CloudTrail/ を変更します。

  3. フィールドが正しく表示されていることを確認します。CloudTrail レコードのフィールドの完全リストに関する詳細については、「CloudTrail レコードの内容」を参照してください。

    この例では、フィールド requestparametersresponseelements、および additionaleventdata は、クエリでタイプ STRING としてリストされていますが、JSON で使用される STRUCT データ型です。そのため、これらのフィールドからデータを取得するには、JSON_EXTRACT 関数を使用します。詳細については、「JSON からのデータの抽出」を参照してください。パフォーマンスを向上させるために、この例ではリージョン、年、月、日に基づいてデータをパーティション分割しています。

    CREATE EXTERNAL TABLE cloudtrail_logs ( eventversion STRING, useridentity STRUCT< type:STRING, principalid:STRING, arn:STRING, accountid:STRING, invokedby:STRING, accesskeyid:STRING, userName:STRING, sessioncontext:STRUCT< attributes:STRUCT< mfaauthenticated:STRING, creationdate:STRING>, sessionissuer:STRUCT< type:STRING, principalId:STRING, arn:STRING, accountId:STRING, userName:STRING>>>, eventtime STRING, eventsource STRING, eventname STRING, awsregion STRING, sourceipaddress STRING, useragent STRING, errorcode STRING, errormessage STRING, requestparameters STRING, responseelements STRING, additionaleventdata STRING, requestid STRING, eventid STRING, resources ARRAY<STRUCT< ARN:STRING, accountId:STRING, type:STRING>>, eventtype STRING, apiversion STRING, readonly STRING, recipientaccountid STRING, serviceeventdetails STRING, sharedeventid STRING, vpcendpointid STRING ) PARTITIONED BY (region string, year string, month string, day string) ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailSerde' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://CloudTrail_bucket_name/AWSLogs/Account_ID/CloudTrail/';
  4. Athena コンソールでクエリを実行します。

  5. 以下の例のように、ALTER TABLE ADD PARTITION コマンドを使用してパーティションをロードすることで、データをクエリできるようにします。

    ALTER TABLE table_name ADD PARTITION (region='us-east-1', year='2019', month='02', day='01') LOCATION 's3://CloudTrail_bucket_name/AWSLogs/Account_ID/CloudTrail/us-east-1/2019/02/01/'

CloudTrail ログのクエリ例

次の例は、CloudTrail イベントログの先頭に作成されたテーブルからすべての匿名 (署名されていない) リクエストを返すクエリの一部を示しています。このクエリは、useridentity.accountid が匿名、および useridentity.arn が指定されていないリクエストを選択します。

SELECT * FROM cloudtrail_logs WHERE eventsource = 's3.amazonaws.com' AND eventname in ('GetObject') AND useridentity.accountid LIKE '%ANONYMOUS%' AND useridentity.arn IS NULL AND requestparameters LIKE '%[your bucket name ]%';

詳細については、AWS Big Data Blog の記事「AWS CloudTrail と Amazon Athena を使用してセキュリティ、コンプライアンス、運用上のアクティビティを分析する方法」を参照してください。

CloudTrail ログのクエリに関するヒント

CloudTrail ログデータを探索するには、以下のヒントを参考にしてください。

  • ログをクエリする前に、ログテーブルが「Athena での CloudTrail ログのテーブルの手動作成」に示している内容と同じになっていることを確認します。これが最初のテーブルではない場合は、コマンド DROP TABLE cloudtrail_logs; を使用して既存のテーブルを削除します。

  • 既存のテーブルを削除した後、再作成します。詳細については、「CloudTrail ログのテーブルの作成」を参照してください。

    Athena クエリのフィールドが正しく表示されていることを確認します。CloudTrail レコードのフィールドの完全リストについては、「CloudTrail レコードの内容」を参照してください。

    クエリ内のフィールドが JSON 形式 (STRUCT など) である場合は、JSON からデータを抽出します。詳細については、「JSON からのデータの抽出」を参照してください。

    これで CloudTrail テーブルに対してクエリを発行する準備完了です。

  • 最初に、どの IAM ユーザーが、どの送信元 IP アドレスから API オペレーションを呼び出したかを確認します。

  • 次の基本的な SQL クエリをテンプレートとして使用します。このクエリを Athena コンソールに貼り付けて実行します。

    SELECT useridentity.arn, eventname, sourceipaddress, eventtime FROM cloudtrail_logs LIMIT 100;
  • さらに、前述のクエリを変更してデータを探索します。

  • パフォーマンスを強化するには、LIMIT 句を追加して、指定したサブセットの行のみが返るようにします。