AWS WAF レートベースルールのカウントモードで検知したログの確認方法

2022.11.18

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

AWS WAF のレートベースルールを設定しましたカウントモードで動作確認を行いたいのです。S3 に保存した WAF ログから設定したレートリミットを超過しカウントで検知したか判別するにはログのなにを確認すればいいですか?

確認結果

  • nonTerminatingMatchingRulesフィールドに[{ruleid=MyRateBasedRule, action=COUNT}]と記録されます。
  • カウント検知に切り替わるまでレートリミット超過後 1- 2 分程度時間がかかる

レートベースルールとは

レートベースルールとは送信元 IP アドレスのリクエスト数をカウントして、設定したしきい値を超過すると対象 IP からのリクエストを自動的にブロックするルールです。

確認方法

AWS WAF にレートベースルールを設定し S3 へログを保存する環境で検証します。

レートベースルールの設定は以下のリンクを参考にしてください。

あとは同じ送信元 IP アドレスから大量にリクエストを発生させればレートリミットを超過したリクエストがログに記録されます。

注意事項はレートリミットを超過後、カウントモードならカウント、ブロックモードならブロックに切り替わるまで1 -2 分かかることがあります。つまり即時反映されることは期待できません。

When the rule action triggers, AWS WAF applies the action to additional requests from the IP address until the request rate falls below the limit. It can take a minute or two for the action change to go into effect.

Rate-based rule statement - AWS WAF, AWS Firewall Manager, and AWS Shield Advanced

切り替えに 1 - 2 分かかることもあるため、5分程度リクエストを送ると安定して目的のログを取得できます。レートベースの最小しきい値は 5 分間あたり 100 リクエストです。検知時のログが記録されるのか確認したいときは最小値で設定することになるとは思いますが、短い時間に 101 回のリクエストしてもカウント or ブロックで検知したログが記録される可能性は低いです。

サンプルテストコマンド

レートベースのルールのしきい値 100 としています。Apach Bench コマンドで 200 回のリクエストを3回程度実行してみます。

ab -n 200 -c 1 [Target_URL]

200 回なら大丈夫ではないかと 1 回だけ試したところカウントモードで検知したログは記録されませんでした。

確認結果

S3 にログが保存されるまでラグがありますのでしばらく放置してから Athena で確認します。

nonTerminatingMatchingRulesフィールドに[{ruleid=MyRateBasedRule, action=COUNT}]と記録され、レートリミットを超過したリクエストを確認できます。

レートベースルールの Tips

レートベースをカウントモードで動作確認したくて検索で引っかかってきた方はレートベースの導入を評価中ではないかと思いますので Tips をまとめておきます。

レートベースルールを活用する場面は、過剰なリクエストをブロックしたいというのはわかりやすいですね。他の使い方は他のルールでラベルを付け、うたがわしい、怪しいリクエストが多い場合にレートベースを発動してブロックもできます。

画像参照元: AWS WAFを活用したクラウドセキュリティ入門 #devio2022 - YouTube

AWS WAF は CloudFront 前か、ALB の前か

AWS WAF の課金対象にリクエスト数に応じた従量課金があります。AWS WAF リクエスト課金削減を考慮し、CloudFront 経由で到達した過剰なリクエストを ALB 前の AWS WAF でブロックする手段もあります。

WebACl を共有するときの注意事項

レートベースルールを設定した WebACL を複数のリソースに関連付けた場合、WebACL を共有しているすべてのリソース分のリクエスト数がカウント対象として合算されます。回避方法としてスコープダウンステートメントで絞り込みをする方法があります。

まとめ

しきい値を超過するリクエストを短期的に送ってもレートベースルールのカウント検知 or ブロックへの切り替わりが追いつかなく目的のログが記録されないので注意してください。

  • nonTerminatingMatchingRulesフィールドに[{ruleid=MyRateBasedRule, action=COUNT}]と記録されます。
  • カウント検知に切り替わるまでレートリミット超過後 1- 2 分程度時間がかかる

おわりに

レートベースルールをカウントで検知したログを確認したいというお問い合わせがあり、案内できるほどよい資料がみあたらなかったので書き残しました。