たそらぼ

日頃思ったこととかメモとか。

CloudTrailの証跡機能にだいぶ詳しくなったのでまとめる

CloudTrailの証跡機能にだいぶ詳しくなったので、個人的なまとめです。

CloudTrailの概要

CloudTrailはアカウントの操作ログを記録し、ログを Amazon S3 バケットに送信することができます。

f:id:tasotasoso:20200530234221p:plain:w200
90日分の管理イベントを無料で保存、検索することが可能です。

証跡の作成により、管理イベントを、S3などにエクスポートすることができます。
また、オプションでデータイベントとCloudTrail Insightsも保存することができます。

各々のログの概要と料金は下記のようになります。

種類 概要 料金
管理イベント AWSアカウントの操作履歴 イベント 10 万件あたり 2.00USD(証跡一つ目は無料)
データイベント Amazon S3 オブジェクトレベルの API 呼び出し、Lambda 関数の実行履歴 イベント 10 万件あたり 0.10USD
CloudTrail Insights AWS アカウントの異常な操作履歴 100,000 の書き込み管理イベントごとに 0.35USD

管理イベントは一つ目が無料なため、とりあえず、管理イベントのみ保存して、データイベントとCloudTrail Insightsは要件によって保存する場合が多いかと思います。


ログは、デフォルトで以下のプレフィクスに保存されます。

S3バケット名/AWSLogs/アカウントID/

オプションでAWSLogsの前にプレフィクスを追加することも可能です。

この場所には以下の2種のデータが作成されます。

  • CloudTrailログ

 CloudTrailの階層が掘られ、そのさらに下に、リージョン/YY/mm/dd/にjson.gzで保存されます。
 https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-log-file-examples.html

  • ダイジェストファイル

 CloudTrail-Digest配下に作成される。ログファイルの名前、これらのログファイルのハッシュ値、前のダイジェストファイルのデジタル署名が含まれます。
 https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-log-file-validation-digest-file-structure.html

CloudTrailログの例

レコードの項目は全て公式ドキュメントに記載されています。
CloudTrail レコードの内容 - AWS CloudTrail

具体的には以下のようなログが出力されます。

#From https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-log-file-examples.html

{"Records": [{
    "eventVersion": "1.0",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "EX_PRINCIPAL_ID",
        "arn": "arn:aws:iam::123456789012:user/Alice",
        "accountId": "123456789012",
        "accessKeyId": "EXAMPLE_KEY_ID",
        "userName": "Alice"
    },
    "eventTime": "2014-03-24T21:11:59Z",
    "eventSource": "iam.amazonaws.com",
    "eventName": "CreateUser",
    "awsRegion": "us-east-2",
    "sourceIPAddress": "127.0.0.1",
    "userAgent": "aws-cli/1.3.2 Python/2.7.5 Windows/7",
    "requestParameters": {"userName": "Bob"},
    "responseElements": {"user": {
        "createDate": "Mar 24, 2014 9:11:59 PM",
        "userName": "Bob",
        "arn": "arn:aws:iam::123456789012:user/Bob",
        "path": "/",
        "userId": "EXAMPLEUSERID"
    }}
}]}

CloudTrailログの検索

Athenaを使ってクエリをかけることも可能です。
テーブルは以下のクエリで作成できます。

#From https://docs.aws.amazon.com/ja_jp/athena/latest/ug/cloudtrail-logs.html

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

パーティションはリージョン・年・月・日で設定することを推奨されています。
リージョンは、CloudTrailの証跡設定作成時に、全リージョンで作成することを指定しなければ、証跡を設定したリージョンのみになります。
後から設定するのは面倒臭いので、とりあえずリージョンもパーティションに含めておくと良さそうです。


注意点としては、CloudTrail証跡は現状、以下のプレフィクスで出力されるため、
MSCK REPAIR TABLE でパーティションデータを自動的に追加できません。

S3バケット/AWSLogs/アカウントID/CloudTrail/リージョン/YY/mm/dd/

そのため、バッチ処理などでADD PARTITIONでパーティションを追加する必要があります。
Athenaのクエリだと以下のようになります。

ALTER TABLE [テーブル名] ADD PARTITION (region='[リージョン]',year='[設定値]',month='[設定値]',day='[設定値]') location 's3://[バケット]/[プレフィックス]/';

バッチ処理での実行方法は、Lambda・Fargate・Glueなどいろいろな方法があります。lambdaでの実行方法は、以下のサイトが参考になります。
dev.classmethod.jp

ログの記録をOFFにした時

ログの記録をOFFにすると、当然ですがログの保存は中止されます。
ONにしても、OFFにしていた間のログは勝手には配信されません。
ログの記録のON/OFFは、[CloudTrai]l >[ 証跡情報] > (各証跡の)設定 から行えます。

f:id:tasotasoso:20200531110714p:plain:w300
ログ記録のON/OFF

配信エラーになった時

こちらにまとめがあるので参考にしてください。
tasotasoso.hatenablog.com