みなさんこんにちは。ネコが好きなマネージドサービス部の塩野です。 家で動物が飼えないので、ネコの動画やSNSの画像を見て癒される毎日を送っています(=^ ^=)
概要
今回は、AWS CloudTrail のログ検索のお話です。AWS CloudTrail を有効にしてS3にログを保存しているものの、保存しっぱなしでうまく活用できていないケースって多いのではないでしょうか。 実はインスタンスへのログイン時のログ検索をしたいという話があり、Cloudtrailの画面から検索できるよね~という話はあるのですが、Cloudtrailで検索できるのは過去90日間のログだけでそれ以降はS3の中にあるログを検索する必要があります。
CloudTrail では、お客様のアカウントの過去 90 日分の管理イベントを無料で閲覧、検索、ダウンロードすることができます。トレイルを作成することで、進行中の管理イベントのコピーを 1 つ無料で S3 に配信できます。CloudTrail の証跡が設定されると、お客様の使用量に基づいて S3 の料金が適用されます。 https://aws.amazon.com/jp/cloudtrail/faqs/
S3を検索する際に、えっ・・どうすんだっけ・・?とならないように、下記に手順をまとめたいと思います。
S3のバケット内部を検索する方法
S3を検索する方法はいくつかありますが、今回は最も簡単でAthenaを使った方法を紹介します。Amazon Athenaを使用する場合、クエリごとに料金が発生しますのでご注意ください。
S3ログの検索手順
1.Cloudtrailのイベント履歴のページを開き、検索対象のイベントを特定します
※今回は下記ドキュメントの内容を参考にイベントを特定しました。
※特定方法は、検索したいイベントを発生させて、該当時間にどのようなイベントが発生したかを確認し、該当イベントを特定します。
※利用しているサービス(ここではAWS Systems Manager を例とします)のドキュメントに記載されているものから推測して検索する方法もあります。
2.イベント一覧の右横にある Athenaテーブルを作成をクリックします

3.ストレージの場所 を選択します
※CloudTrail ログファイルを含む S3 バケットを選択しますので、Cloudtrailで複数証跡を取っているケース以外はリストに上がっている選択肢をそのまま選択してください。

4.Athenaのクエリエディタを開き、クエリを実行します

今回使用したクエリ
SELECT *
FROM <athenaのテーブル名>
WHERE
eventsource = 'ssm-guiconnect.amazonaws.com'
and eventname = 'StartConnection'
クエリボタンが有効にならない場合の対処方法
Athenaの検索結果を保存するために、事前にS3バケットを用意しておく必要があります。Amazon Athena>クエリエディタ>設定を開き、クエリの結果と暗号化の設定の管理ボタンよりクエリ結果の保存場所を指定してください。


実行後の動作
クエリが実行されるとバケット内のオブジェクトがスキャンされ、結果が出力されます。Athenaの料金はこのスキャンされたデータ量に対して課金されますが、それ以外にS3のリクエストやデータ転送、Athenaの出力結果が保存されますので、その出力結果に対しての S3 の標準料金が発生しますので、出力結果のデータ量が大きくなる場合は適宜バケットのライフサイクルルール設定などで保存期間の設定をしてください。

※ライフサイクルルールは対象バケットを開き、管理メニューの中のライフサイクルルールの項目より設定してください。
クエリ結果
余談な話になりますが、「ssm-guiconnect.amazonaws.com」に対するイベント検索を行うと、イベント検索を実施したAPI記録がCloudtrailに保存されるため、実際にログインしていなくても ssm-guiconnect.amazonaws.com を含むイベントが発生することはご留意ください。

Athena検索で出力されるAPIイベント(参考情報)
{
"eventVersion": "1.08",
"userIdentity": {
"type": "IAMUser",
"principalId": "PRINCIPALID",
"arn": "arn:aws:iam::123456789012:user/hogeuser",
"accountId": "123456789012",
"accessKeyId": "ACCESSKEYID",
"userName": "hogeuser",
"sessionContext": {
"sessionIssuer": {},
"webIdFederationData": {},
"attributes": {
"creationDate": "2023-05-16T01:12:50Z"
}
}
},
"eventTime": "2023-05-16T06:32:02Z",
"eventSource": "athena.amazonaws.com",
"eventName": "StartQueryExecution",
"awsRegion": "ap-northeast-1",
"sourceIPAddress": "1.2.3.4",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0",
"requestParameters": {
"queryString": "SELECT *\nFROM cloudtrail_logs_aws_cloudtrail_logs_xxx1\nWHERE eventsource = 'ssm-guiconnect.amazonaws.com' and eventname = 'StartConnection'",
"clientRequestToken": "clientRequestToken",
"queryExecutionContext": {
"database": "default",
"catalog": "AwsDataCatalog"
},
"resultConfiguration": {
"outputLocation": "s3://aws-athena-query-results-123456789012-ap-northeast-1/Unsaved/2023/05/16/",
"expectedBucketOwner": "123456789012",
"aclConfiguration": {
"s3AclOption": "BUCKET_OWNER_FULL_CONTROL"
}
},
"workGroup": "primary"
},
"responseElements": {
"queryExecutionId": "queryExecutionId"
},
"requestID": "requestID",
"eventID": "eventID",
"readOnly": false,
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "123456789012",
"eventCategory": "Management",
"tlsDetails": {
"tlsVersion": "TLSv1.2",
"cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
"clientProvidedHostHeader": "athena.ap-northeast-1.amazonaws.com"
},
"sessionCredentialFromConsole": "true"
}
総括
とりあえずデータは取得しておいたもののその後どうやって活用したらいいのかわからず、今忙しいし、必要な時が来るまで放置でいいかーということもあるかと思います。今回のは単なるひとつの例でしかありませんが、他のCloudTrailイベントでも同様に、イベント名を変更して同じような手順で検索すればS3に保管されている過去のイベントログを検索することができるようになります。注意点としては、特にデータ量が多いものを何回も検索すると後で料金を見てびっくりすることになりますので、ご利用は計画的にお願いします。