AWS CloudTrail ログのクエリ - Amazon Athena

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

AWS CloudTrail ログのクエリ

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

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

注記

アカウント、リージョン、日付をまたいで CloudTrail イベント情報に対して SQL クエリを実行する場合は、 CloudTrail Lake. CloudTrail Lake を使用することを検討してください。Lake は、企業からの情報を単一の検索可能なイベントデータストアに集約する証跡を作成するAWS代わりに使用できます。Amazon S3 バケットストレージを使用する代わりに、イベントはデータレイクに保存されるため、より豊富で高速なクエリが可能になります。これを使用して、組織、リージョン間、およびカスタム時間範囲内でイベントを検索する SQL クエリを作成できます。 CloudTrail コンソール自体内で Lake クエリを実行する CloudTrailため、 CloudTrail Lake を使用するときに Athena は必要ありません。詳細については、「CloudTrail Lake のドキュメント」を参照してください。

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

一般的なアプリケーションは、セキュリティとコンプライアンスに関する運用上のアクティビティを分析するために CloudTrail ログを使用することです。詳細な例については、「AWS ビッグデータブログ」の記事「AWS CloudTrail と Amazon Athena を使用してセキュリティ、コンプライアンス、運用上のアクティビティを分析する方法」を参照してください。

Athena は、ログファイルの LOCATION を指定して、Amazon S3 からこれらのログファイルを直接クエリするために使用できます。以下の 2 つの方法のいずれかを実行できます。

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

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

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

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

CloudTrail は、ログを圧縮された gzip 形式 (*.json.gzip) で JSON テキストファイルとして保存します。ログファイルの保存先は、証跡のセットアップ方法、AWS リージョン あるいはログを記録する対象のリージョン、その他の要因によって異なります。

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

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

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

以下に例を示します。

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

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

オブジェクト階層の最上位レベルを使用することで、Athena を使用したクエリの実行時に最大の柔軟性が提供されます。

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

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

注記

CloudTrail コンソールを使用して、組織の証跡ログ用の Athena テーブルを作成することはできません。代わりに、Athena コンソールを使用してテーブルを手動で作成し、正しいストレージ場所を指定できるようにします。組織の証跡については、AWS CloudTrail ユーザーガイドの「組織の証跡の作成」を参照してください。

CloudTrail コンソールを使用して証 CloudTrail 跡の Athena テーブルを作成するには
  1. https://console.aws.amazon.com/cloudtrail/ で CloudTrail コンソールを開きます。

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

  3. [Athena テーブルを作成] をクリックします。

    
                        [Create Athena table] (Athena テーブルを作成) をクリックします。
  4. [Storage location] (ストレージの場所) の下矢印を使用して、クエリする証跡のためにログファイルが保存される Amazon S3 バケットを選択します。

    注記

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

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

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

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

Athena コンソールを使用して証跡の CloudTrail Athena テーブルを作成するには
  1. 以下の DDL ステートメントを Athena コンソールクエリエディタにコピーして貼り付けます。

    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>, ec2RoleDelivery:string, webIdFederationData:map<string,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, eventCategory STRING, tlsDetails struct< tlsVersion:string, cipherSuite:string, clientProvidedHostHeader:string> ) PARTITIONED BY (region string, year string, month string, day string) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' 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/';
    注記

    この例org.apache.hive.hcatalog.data.JsonSerDeに示す を使用することをお勧めします。com.amazon.emr.hive.serde.CloudTrailSerde は存在しますが、現在、新しい CloudTrail フィールドの一部は処理されません。

  2. (オプション) テーブルに必要のないフィールドをすべて削除します。特定の列のセットのみを読み込む必要がある場合は、テーブル定義で他の列を除外できます。

  3. ログデータが含まれる保存先の Amazon S3 バケットをポイントするように s3://CloudTrail_bucket_name/AWSLogs/Account_ID/CloudTrail/ を変更します。

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

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

  5. Athena コンソールで CREATE TABLE ステートメントを実行します。

  6. 以下の例のように、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 ログファイルのテーブルを作成するには、「」のステップに従いますが手動パーティショニングを使用した Athena での CloudTrail ログ用のテーブルの作成、次の手順で説明する変更を行います。

組織全体の CloudTrail ログ用の Athena テーブルを作成するには
  1. 次の例のように、CREATE TABLE ステートメントで、組織 ID が含まれるように LOCATION 句を変更します。

    LOCATION 's3://cloudtrail_bucket_name/AWSLogs/organization_id/Account_ID/CloudTrail/'
  2. 次の例のように、PARTITIONED BY 句で、アカウント ID のエントリを文字列として追加します。

    PARTITIONED BY (account string, region string, year string, month string, day string)

    次の例は、結合された結果を示しています。

    ... PARTITIONED BY (account string, region string, year string, month string, day string) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://cloudtrail_bucket_name/AWSLogs/organization_id/Account_ID/CloudTrail/'
  3. 次の例のように、ALTER TABLE ステートメントの ADD PARTITION 句には、アカウント ID を含めます。

    ALTER TABLE table_name ADD PARTITION (account='111122223333', region='us-east-1', year='2022', month='08', day='08')
  4. 次の例のように、ALTER TABLE ステートメントの LOCATION 句には、追加する組織 ID、アカウント ID、パーティションを含めます。

    LOCATION 's3://cloudtrail_bucket_name/AWSLogs/organization_id/Account_ID/CloudTrail/us-east-1/2022/08/08/'

    次の例では、ALTER TABLE ステートメントは結合された結果を示します。

    ALTER TABLE table_name ADD PARTITION (account='111122223333', region='us-east-1', year='2022', month='08', day='08') LOCATION 's3://cloudtrail_bucket_name/AWSLogs/organization_id/111122223333/CloudTrail/us-east-1/2022/08/08/'

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

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

次のCREATE TABLEステートメント例では、単一の について、指定された日付から現在までの CloudTrail ログに対してパーティション射影を自動的に使用していますAWS リージョン。LOCATION 句と storage.location.template 句では、bucketaccount-id、および aws-region の各プレースホルダーを、対応する同等の値に置き換えます。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>, ec2RoleDelivery:string, webIdFederationData:map<string,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, eventCategory STRING, tlsDetails struct< tlsVersion:string, cipherSuite:string, clientProvidedHostHeader:string> ) PARTITIONED BY ( `timestamp` string) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' 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 から初期の arn:aws:s3::: サブストリングを削除します。

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 = '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 を使用して既存のテーブルを削除します。

  • 既存のテーブルを削除した後、再作成します。詳細については、「手動パーティショニングを使用した Athena での CloudTrail ログ用のテーブルの作成」を参照してください。

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

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

    CloudTrail テーブルに対してクエリを発行するためのいくつかの提案:

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

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

    SELECT useridentity.arn, eventname, sourceipaddress, eventtime FROM cloudtrail_logs LIMIT 100;
  • クエリを修正して、データをさらに詳しく調べます。

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