AWS WAFカウントモードの調査方法を整理してみた

カウントモードからブロックモードに移行する前の調査にお役立てください

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。AWS事業本部トクヤマシュンです。

AWS WAFを本番運用する際は、はじめはカウントモードで導入して効果測定を行い、ブロックモードに移行することが一般的です。
効果測定ではカウントされたリクエストが本来の意図通りに行われたものなのかなどを調査し、WAFルールやセーフリストを更新するなどしてブロックモードに備えます。
本ブログではブロックモードに移行する前の効果測定にあたり、どのような手法で調査を行うことができるのか紹介します。

はじめにまとめ

AWS WAFには大きく3つの調査方法があります。
それぞれの概要を述べます。

  • ログ調査
    • 詳細な調査が可能で、効果測定にはほぼ必須
    • Amazon CloudWatch LogsやAmazon S3に出力したログを対象に調査を行う
  • メトリクス調査
    • 長期間の傾向を把握したいときにオススメ
    • Amazon CloudWatchメトリクスを使い、カウントされたリクエスト数の調査が可能
  • サンプルリクエスト調査
    • 過去3時間分のみの表示なので効果測定には不向き
    • AWS WAFでサンプリングしたリクエストの調査が可能

以降は各調査方法について実際の画面とともに紹介します。

前提

今回は下記のような構成を前提とします。

AWS WAFはAmazon CloudFrontに関連付けます。
AWS WAFにはmyIPというIPセットを用いたmyIpCountというルールを作成して設定しており、特定IPアドレスからのリクエストをカウントします。

では実際にどのような調査が可能か、みていきます。

ログ調査

AWS WAFではログを下記3つのAWSサービスのいずれかに出力することが可能です。

  • Amazon CloudWatch Logs
  • Amazon S3
  • Amazon Kinesis Firehose

今回はAmazon CloudWatch LogsとAmazon S3に対して出力されたログの調査について説明します。

なおKinesis Firehoseの場合は、Amazon OpenSearch Serviceにログを流して調べることが多いかと思います。
以下のブログに内容まとまってますので、興味ある方は併せてご参照ください。

Amazon CloudWatch Logsを用いたログ調査

Amazon CloudWatch Logsを使えば、簡単にログ調査を行うことが可能です。
ただしログ出力の多い環境では料金が高くなる場合もあるので、S3によるログ調査とどちらを使うか事前に検討しましょう。

ではCloudWatch Logsを用いたログ調査設定を行っていきます。
まずはログ出力のためのCloudWatch Logsでロググループを作成します。
ロググループ名はaws-waf-logs-から始まっている必要がありますので注意しましょう。

ロググループが作成できたら、AWS WAFでログ設定を行ないます。
Logging destinationにCloudWatch Logs log groupを選択し、先ほど作成したロググループを設定します。

Aamazon CloudWatch Logsでのログ料金を抑えるため、今回はログフィルターも設定しておきます。
下記のような設定を行います。

Filter 1

  • Condition Type
    • Count
    • EXCLUDED_AS_COUNT
  • Filter behavior
    • Keep in logs

Default logging behavior

  • Drop from logs

これにより、カウント扱いとなったリクエストのみログに出力します。
ここまで設定できれば、HTTPリクエストを何度か送信して、しばらくしてからログ調査を実施してみます。

AWS WAFのコンソール画面のタブからCloudWatch Logs Insightを選択し、検索をしてみましょう。
次のようなクエリを実行します。

fields @timestamp, @message
| sort @timestamp desc
| limit 20

これにより、最新の20件のカウント扱いとなったリクエストを取得することが可能です。

クエリを変更すればさまざまな調査が可能ですので、要望を満たすようなクエリを作成して任意の調査も可能です。
参考:Amazon CloudWatch Logs による AWS WAF ログの分析

以上、Amazon CloudWatch Logを用いたログ調査でした。

Amazon S3を用いたログ調査

Amazon S3を用いたログ検索を行うためには、S3バケットにログを出力したあと、Amazon Athenaを利用したクエリを実行することが必要です。
それぞれについて説明します。

まずはログ出力のためのAmazon S3バケットを作成します。
バケット名はaws-waf-logs-から始まっている必要がありますので注意しましょう。

バケットが作成できたら、AWS WAFでログ設定を行います。
Logging destionationにS3 bucketを選択し、先ほど作成したS3バケットを設定します。
CloudWatch Logsの場合と違って、S3はログの取り込みに料金がかからないうえに、ストレージ単価も安いので、フィルター設定は行わずすべてのログを保存することとします。

このときWebACLとバケット所有者が同じアカウントの場合は、Webコンソールの操作だけで必要なバケットポリシーやACL設定が自動的に行われますが、異なるアカウントの場合はS3バケットに権限設定が必要ですのでご注意ください。

ここまで設定したらHTTPリクエストを何度か送信して、S3バケットにログが蓄積されていくか、確認します。

ログ保存ができていれば調査を行なっていきます。
Amazon Athenaのコンソール画面からログ調査のための設定をします。
設定に関しては詳細を説明した弊社ブログがありますので、こちらを参考に実施してください。

上記ブログにしたがってwaflogsというテーブルの作成までできたら、下記のようなログ分析クエリを実行してください。

SELECT from_unixtime(timestamp/1000, 'Asia/Tokyo') AS JST,
       httpsourcename,
       httpsourceid,
       countedrule,
       httprequest.clientip,
       httprequest.country,
       httprequest.uri,
       httprequest.args,
       httprequest.httpmethod
FROM
       "waflogs",
       UNNEST(nonterminatingmatchingrules) t(countedrule)
WHERE
       countedrule.action = 'COUNT';

これにより、カウント扱いとなったリクエストを取得することが可能です。

Athenaの場合もクエリを変更すればさまざまな調査が可能ですので、要望を満たすようなクエリを作成して任意の調査も可能です。
以上、Amazon S3を用いたログ調査でした。

メトリクス調査

Amazon CloudWatchメトリクスを調査することで、カウントされたリクエスト数の調査が可能です。
ただしリクエストの詳細は分からないので、あくまでも効果測定時の補助として利用しましょう。

Amazon CloudWatchメトリクスから対象とするAWS WAF WebACLのCountedRequestsメトリクスを選択してグラフ化します。
下の画像では、2022-09-29 11:20に16件のカウント扱いとなったリクエストがあったことを示しています。

画像はログ蓄積期間が短いのでパッとしませんが、記録を続けていくと数ヶ月にわたるカウント数の傾向を折れ線グラフで表示することが可能なので、傾向分析には大いに役立つかと思います。

以上、Amazon CloudWatchを用いたメトリクス調査でした。

サンプルリクエスト調査

AWS WAFのOverview画面下部で、過去3時間分のサンプルリクエストを表示することが可能です。
COUNTを検索することで、カウント扱いになったリクエストのみに表示を絞ることもできます。

こちらはどのURIに対するリクエストがカウントされているかなども表示されるのですが、すべてのリクエストではなくサンプリングされたものであり、過去3時間分までしか表示されないので効果測定には向きません。
あくまでも簡易なAWS WAFの動作確認にご利用ください。

まとめ

AWS WAFをカウントモードで運用した場合の調査方法について紹介しました。
効果測定にはログ調査がオススメです。
Amazon CloudWatch Logsを使うのか、Amazon S3を使うのか、ご自身に適した方法をご選択ください。
本ブログがどなたかの助けになりましたら幸いです。