Amazon-CloudWatch

【小ネタ】AWS WAFでレートベースルールで遮断したIPアドレスをCloudWatch Logs Insightsで調べる方法

はじめに

こんにちは、omkです。
WAFでレートベースの遮断ルールを設定している環境があり、相当数遮断しておりましたのでなかなかログで調べるのも大変だったのでLogs Insightsでクエリして集計できるようにしました。

条件としてはAWS WAFのルールで一定回数同一IPから接続された場合の遮断ルールで、IPだけを条件として持っている状態です。

Logs Insightsとは

CloudWatch Logsにクエリを行って効率的な分析が可能となります。
独自のクエリ構文を持っているため、SQLがそのまま使えるわけではないです。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html

出力する

AWS WAFのログフォーマットは以下を参照ください。
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/logging-fields.html

レートベースでの遮断なので対象IPから何回リクエストがあったかを確認したいです。
なので遮断されたIPと遮断回数を、遮断回数の多い順に出力するクエリを作成しました。

以下のクエリを実行することで取得が可能です。

stats count(*) as blockcount by rateBasedRuleList.0.limitValue
| fields rateBasedRuleList.0.limitValue
| filter (rateBasedRuleList.0.rateBasedRuleName = "{ルール名}" and action = "BLOCK")
| sort blockcount desc
| limit 10

「rateBasedRuleList.0.limitValue」にIPが入るので基本的にこれを活用していきます。
「stats count(*) ~~」でIPごとにcountして集計結果をまとめてくれます。
そのとき、遮断回数でsortしたいので名前をつけておきます。

上位だけ見たい場合はlimitを入れて必要数だけ表示するようにします。

単純に遮断されたIP一覧がほしい場合は以下でも可能です。

fields rateBasedRuleList.0.limitValue
| filter (rateBasedRuleList.0.rateBasedRuleName = "{ルール名}" and action = "BLOCK")
| sort rateBasedRuleList.0.limitValue asc
| dedup rateBasedRuleList.0.limitValue

dedupを使うことで重複排除が可能です。

あとはCSVなどで出力していい感じにゴニョゴニョしてWAFの運用に活用していきいたいですね。
以上、最後までお付き合いありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA