📝

CloudTrail Lake で色々なクエリを試してみた

2022/10/12に公開約3,700字

https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-lake.html

気になってはいたものの使い方がよく分からずに試していなかった CloudTrail Lake ですが、試してみたところ簡単に使えたので、よく使いそうなクエリを試してみました。

CloudTrail Lake について

すでに様々なサイトで紹介されているので、AWS 公式ドキュメントと併せてご覧ください。

https://dev.classmethod.jp/articles/aws-cloudtrail-lake-audit-security/

https://dev.classmethod.jp/articles/aws-cloudtrail-lake-in-organizations/

https://dev.classmethod.jp/articles/cloudtrail-lake-event-data-store-specifiled-s3-bucket/

よく使いそうなクエリ

https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/query-lake-examples.html

上記 AWS 公式ドキュメントにもクエリの例が記載されていますが、私もユースケースごとに考えてみました。
{event-data-store-id}は実際のイベントデータストア ID に置換してください。

また、使用できる SQL の制約については以下の AWS 公式ドキュメントをご覧ください。
https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/query-limitations.html

最新の記録を 10 件だけ取得

SELECT * FROM {event-data-store-id}
LIMIT 10;

LIMIT の数を変えることで取得できる件数を変えることができます。

特定のサービスでエラーが発生した記録だけを取得

SELECT * FROM {event-data-store-id}
WHERE errorMessage !='' 
AND eventSource ='dynamodb.amazonaws.com';

上記は DynamoDB に関する記録のうち、エラーメッセージが空ではない記録、つまりエラーメッセージがある記録のみを抽出しています。

特定のエラーメッセージだけを取得

SELECT * FROM {event-data-store-id}
WHERE errorCode ='AccessDenied'

上記は、AccessDenied というエラーメッセージ (エラーコード) のみを抽出しています。

TLS バージョン 1.0 および 1.1 が使用されているリソースを特定する

SELECT resources FROM {event-data-store-id}
WHERE tlsDetails.tlsVersion IN ('TLSv1', 'TLSv1.1');

私の環境では TLS 1.0 および 1.1 を使用しているリソースはなかったので、代わりに以下のように TLS 1.2 を含めるようにクエリを実行してみました。

SELECT resources FROM {event-data-store-id}
WHERE tlsDetails.tlsVersion IN ('TLSv1', 'TLSv1.1', 'TLSv1.2');

AWS では TLS 1.2 がすべての AWS API エンドポイントへの接続に必要な最小バージョンになるため、TLS 1.0 および 1.1 を使用している場合にはアップデートが必要です。
https://aws.amazon.com/jp/blogs/news/tls-1-2-required-for-aws-endpoints/

以下の AWS 公式ブログでもサンプルクエリが紹介されています。
https://aws.amazon.com/jp/blogs/mt/using-aws-cloudtrail-lake-to-identify-older-tls-connections-to-aws-service-endpoints/

SELECT
    userIdentity.accountId, recipientAccountId, userIdentity.arn, eventSource, eventName, awsRegion, tlsDetails.tlsVersion, tlsDetails.cipherSuite, userAgent, COUNT(* 
    ) AS numOutdatedTlsCalls 
FROM
    {event-data-store-id}
WHERE
    tlsDetails.tlsVersion IN ('TLSv1', 'TLSv1.1' 
    ) 
    AND eventTime > '2022-04-19 00:00:00' 
    AND eventTime < '2022-04-30 00:00:00' 
GROUP
    BY userIdentity.accountId, recipientAccountId, userIdentity.arn, eventSource, eventName, awsRegion, tlsDetails.tlsVersion, tlsDetails.cipherSuite, userAgent 
ORDER 
    BY eventSource, eventName, tlsVersion;

特定の時間帯に特定のサービスでエラーがあったかどうかを取得

SELECT * FROM {event-data-store-id}
WHERE errorMessage !='' 
AND eventSource ='dynamodb.amazonaws.com' 
AND eventTime > '2022-10-11 11:30:42.000' 
AND eventTime < '2022-10-11 11:35:42.000';

上記は、2022-10-11 11:30:42.000 ~ 2022-10-11 11:35:42.000 までの DynamoDB に関する記録のうち、エラーメッセージがある記録のみを抽出しています。
個人的にはこのクエリがトラブルシューティングでよく使いそうな気がしています。

エラーになった IP アドレスとイベント名を取得

SELECT eventName, sourceIPAddress, errorMessage FROM {event-data-store-id} 
WHERE errorMessage !='';

上記は、エラーになった IP アドレスとイベント名に加えて、エラーメッセージも取得しています。
IP 制限によるエラー調査時に役に立つと思います。

まとめ

今回は CloudTrail Lake でよく使いそうなクエリを試してまとめてみました。
SQL は普段使用しないので簡単なクエリばかりですが、参考になれば幸いです。

Discussion

ログインするとコメントできます