【目次】
1. はじめに
今回は AWS が公開しているセキュリティブログを解説します。
レートベースルールと CAPTCHA アクションを組み合わせてボットトラフィックの検査をするという内容となります。
問い合わせフォームなどに大量のアクセスをしてくる IP アドレスに対して CAPTCHA のテストを要求し、ボットであれば止めてしまい、人間であればテストをクリアしたあとトークンを発行し、有効期限内であれば再テストの要求をせずにアクセスを可能にするといった方法です。
Use AWS WAF CAPTCHA to protect your application against common bot traffic
2. CAPTCHA とは
過去のブログでご紹介しましたが、2021年11月08日 PTD に 設定できるようになったアクションとなります。
コンピュータと人間を判別するためのテストを AWS WAF のルールのみで設定できます。
3. レートベースルールとは
レートベースのルールは、送信元の各 IP アドレスのリクエストのレートを追跡し、指定された 5 分間のリクエスト数の上限をレートが超えるとルールアクションをトリガーします。
これを使用すると、過剰なリクエストを送信しているIP アドレスからのリクエストを一時的にブロックできるルールとなります。
レートベースルールについては、以下のブログ記事もご参考ください。
レートベースルールの使い方
4. 作成するルール
本ブログでは、5分間に100回「/test」へのリクエストがあった場合にCAPTCHAを表示するルールを作成します。
まずは、Web ACL画面にて「Add rules」をクリックし、「Add my own rules and rule groups」を選択します。
ルール名(以下ではCaptchaOnRBR)を入力し、Typeの箇所で「Rate-based rule」を選択します。
Request rate detailsのセクションで、Rate limitには100、IP address to use for rate limitingにはSource IP addressを選択します。
今回は「/test」というURIへのアクセスがあった場合にレートベースを適用するため、Criteria to count request towards rate limitにてOnly consider requests that match the criteria in a rule statementを選択します。
このオプションを選択すると、URI等の詳細を指定するセクションが表示されますので、以下の項目を指定します。
- If a request matches the statement
- Inspect: URI path
- Match type: Contains string
- String to match: /test
- Text transformation: None
最後にActionとImmunity timeを設定します。
ActionはCAPTCHAを指定します。
Immunity timeはデフォルトだと300が指定されていますが、今回はSet a custom immunity time for this ruleにチェックを入れてから60に変更します。
Add ruleをクリックし、優先順位を設定して保存したらルールの作成は完了です。
ルールを追加した後、複数の端末から実際にテストを行ったところ、閾値を超えるとCAPTCHAが表示されました。
CAPTCHAの認証をクリアすると、以下のような形でCookieが付与されます(WAFログより一部抜粋)。
{ "name": "Cookie", "value": "aws-waf-token=ここにトークンが入ります" },
このトークンが付与された端末からのリクエストはImmunity timeに設定した時間の間は何度リクエストを送信しても許可されました。
別の端末からのリクエストの場合、トークンがないため以下の通り405が返されました。
WAFログより一部抜粋
"captchaResponse": { "responseCode": 405, "failureReason": "TOKEN_MISSING" }
5. おわりに
特定のIPを単純にブロックするわけではないため、誤検知の可能性も考えると意味のある設定かと思います。サイトの特性にはよると思いますが、誤検知によるブロックの発生は防ぎつつボットなどからの大量のリクエストは正確に止めたいといった場合には、CAPTCHAアクションはセキュリティとUXのバランスをとる選択肢となるかと思います。
レートベースの適切な閾値についてはサイトごとに異なりますので、どこまで許容できるインフラ及びアプリケーションであるかを考慮して設定しましょう。
最初はアクションをCOUNT状態で閾値を探ることもおすすめです。