AWS CloudTrail ログのクエリ - Amazon Athena

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS CloudTrail ログのクエリ

AWS CloudTrail は、Amazon Web Services アカウントの 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 ログファイルのテーブルを作成する。

  • CloudTrail ログファイルのテーブルを手動でAthena。

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

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

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

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

ログを収集して Amazon S3 に保存するには、AWS マネジメントコンソールから 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 コンソールを使用して、組織の証跡ログ用の Athena テーブルを作成することはできません。代わりに、Athena コンソールを使用してテーブルを手動で作成して、正しい格納場所を指定できるようにします。組織の証跡の詳細については、「」を参照してください。組織の証跡を作成します()AWS CloudTrail ユーザーガイド

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

  1. で CloudTrail コンソール () を開きます。https://console.aws.amazon.com/cloudtrail/

  2. ナビゲーションペインで [Event history (イベント履歴)] を選択します。

  3. 次のいずれかを行ってください。

    • 新しい CloudTrail コンソールを使用している場合は、[Athena テーブルの作成

      
                                選択Athena テーブルの作成
    • 古い CloudTrail コンソールを使用している場合は、[Amazon Athena で高度なクエリを実行する

      
                                選択Amazon Athena で高度なクエリを実行する。
  4. を使用する場合ストレージの場所下矢印を使用して、ログファイルが保存され証跡がクエリされる Amazon S3 バケットを選択します。

    注記

    トレイルに関連付けられているバケットの名前を検索するには、証跡を選択し、トレイルのS3 バケット列でロードバランサーの ID をクリックします。バケットの Amazon S3 ロケーションを確認するには、バケットのリンクをS3 バケット列でロードバランサーの ID をクリックします。これにより、Amazon S3 コンソールが開き、CloudTrail バケットの場所が表示されます。

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

手動パーティションを使用した、Athena での CloudTrail ログのテーブルの作成

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

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

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

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

  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/'

パーティション射影を使用した、Athena の CloudTrail ログのテーブルの作成

CloudTrail ログには、パーティションスキームを事前に指定できるために、Athena パーティション射影機能を使用して、クエリの実行時間を減らし、パーティション管理を自動化できます。パーティション投影は、新しいデータが追加されると、自動的に新しいパーティションを追加します。これにより、手動でパーティションを追加する必要がなくなります。ALTER TABLE ADD PARTITION

以下の例CREATE TABLEステートメントは、指定された日付から、単一の AWS リージョンの現在まで CloudTrail ログでパーティション投影を自動的に使用します。左LOCATIONおよびstorage.location.template句で置き換えるには、bucket,account-id, およびAWS リージョンプレースホルダは、それに応じて同じ値を持ちます。を使用する場合projection.timestamp.rangeを置き換える2020/01/01を、使用する開始日に変更します。クエリを正常に実行した後、テーブルをクエリすることができます。実行する必要はありませんALTER TABLE ADD PARTITIONをクリックしてパーティションをロードします。

CREATE EXTERNAL TABLE cloudtrail_logs_pp( 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, readOnly STRING, resources ARRAY<STRUCT< arn: STRING, accountId: STRING, type: STRING>>, eventType STRING, apiVersion STRING, recipientAccountId STRING, serviceEventDetails STRING, sharedEventID STRING, vpcEndpointId STRING ) PARTITIONED BY ( `timestamp` 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://bucket/AWSLogs/account-id/CloudTrail/aws-region' TBLPROPERTIES ( 'projection.enabled'='true', 'projection.timestamp.format'='yyyy/MM/dd', 'projection.timestamp.interval'='1', 'projection.timestamp.interval.unit'='DAYS', 'projection.timestamp.range'='2020/01/01,NOW', 'projection.timestamp.type'='date', 'storage.location.template'='s3://bucket/AWSLogs/account-id/CloudTrail/aws-region/${timestamp}')

パーティション射影の詳細については、「」を参照してください。Amazon Athena を使用したパーティション射影

ネストされたフィールドのクエリ

なぜなら、userIdentityおよびresourcesフィールドはネストされたデータ型であるため、クエリには特別な処理が必要です。

-userIdentityオブジェクトは、ネストされたSTRUCTタイプ。これらは、次の例の通り、ドットを使用してフィールドを区切ってクエリできます。

SELECT eventsource, eventname, useridentity.sessioncontext.attributes.creationdate, useridentity.sessioncontext.sessionissuer.arn FROM cloudtrail_logs WHERE useridentity.sessioncontext.sessionissuer.arn IS NOT NULL ORDER BY eventsource, eventname LIMIT 10

-resourcesフィールドの配列はSTRUCTオブジェクト。これらの配列では、CROSS JOIN UNNESTを使用して配列のネストを解除し、そのオブジェクトを照会できるようにします。

次の例では、リソース ARN が終了するすべてのローを返します。example/datafile.txt。読みやすさのために、replace関数は、初期のarn:aws:s3:::サブストリングを ARN から削除します。

SELECT awsregion, replace(unnested.resources_entry.ARN,'arn:aws:s3:::') as s3_resource, eventname, eventtime, useragent FROM cloudtrail_logs t CROSS JOIN UNNEST(t.resources) unnested (resources_entry) WHERE unnested.resources_entry.ARN LIKE '%example/datafile.txt' ORDER BY eventtime

次の例では、クエリを実行します。DeleteBucketイベント. クエリは、バケットの名前とバケットが属するアカウント ID をresourcesオブジェクト。

SELECT awsregion, replace(unnested.resources_entry.ARN,'arn:aws:s3:::') as deleted_bucket, eventtime AS time_deleted, useridentity.username, unnested.resources_entry.accountid as bucket_acct_id FROM cloudtrail_logs t CROSS JOIN UNNEST(t.resources) unnested (resources_entry) WHERE eventname = 'DeleteBucket' ORDER BY eventtime

ネスト解除の詳細については、「」を参照してください。配列のフィルタ処理

クエリの例

次の例は、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 句を追加して、指定したサブセットの行のみが返るようにします。