📝

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

2022/10/12に公開

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

CloudTrail Lake について

すでに技術ブログで紹介されているので AWS 公式ドキュメントと併せてご覧ください。

よく使いそうなクエリ

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

最新の記録を 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 ブログでも周知されていますが、AWS では TLS 1.2 がすべての AWS API エンドポイントへの接続に必要な最小バージョンになるため、TLS 1.0 および 1.1 を使用している場合にはアップデートが必要です。

AWS ブログでもサンプルクエリが紹介されています。

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