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 ログのテーブルの作成
CloudTrail コンソールから直接 CloudTrail ログをクエリするテーブルを自動的に作成できます。これは非常にわかりやすいテーブルの作成方法ですが、この方法でテーブルを作成できるのは、証跡のログファイルを含む Amazon S3 バケットが Amazon Athena でサポートされているリージョンにあり、Athena でテーブルを作成するために十分なアクセス許可を持つ IAM ユーザーまたはロールを使用してログインしている場合に限ります。詳細については、「セットアップ」を参照してください。
CloudTrail コンソールで CloudTrail 証跡のテーブルを作成するには
-
https://console.aws.amazon.com/cloudtrail/ にある CloudTrail コンソールを開きます。
-
ナビゲーションペインで [Event history] を選択します。
-
[イベント履歴] で、[Amazon Athena で高度なクエリを実行します] を選択します。
-
[保存場所] で、ログファイルが保存され証跡がクエリされる Amazon S3 バケットを選択します。
注記
証跡に関連付けられているバケットは、[Trails] (証跡) に移動して証跡を選択することで確認できます。バケット名が [Storage location] (保存場所) に表示されます。
-
[Create table] を選択します。Amazon S3 バケットの名前を含むデフォルト名が付いたテーブルが作成されます。
Athena での CloudTrail ログのテーブルの手動作成
Athena コンソールで、CloudTrail ログファイルのテーブルを手動で作成し、Athena でクエリを実行できます。
CloudTrail コンソールで CloudTrail 証跡のテーブルを作成するには
-
次の DDL ステートメントをコピーして Athena コンソール内に貼り付けます。
-
ログデータの保存先の Amazon S3 バケットを指すように
s3:
を変更します。//CloudTrail_bucket_name/AWSLogs/Account_ID/
-
フィールドが正しく表示されていることを確認します。CloudTrail レコードのフィールドの完全リストに関する詳細については、「CloudTrail レコードの内容」を参照してください。
この例では、フィールド
requestparameters
、responseelements
、および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 ) 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/
'; -
Athena コンソールでクエリを実行します。クエリが完了すると、Athena は
cloudtrail_logs
を登録し、そのデータに対してクエリを発行できるように準備します。
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
句を追加して、指定したサブセットの行のみが返るようにします。