SPECIALIST

多様な専門性を持つNRIデジタル社員のコラム、インタビューやインサイトをご紹介します。

BACK

AWS WAF レートベースルールを利用したボット対策を試してみる

こんにちは、NRIデジタルの島です。

AWS WAF(以下WAF)のレートベースのルールが強化され、条件をより詳細に設定可能になりました。
AWS WAF がレートベースのルールを強化し、リクエストヘッダーと複合キーに対応

従来のWAFの「レートベースルール」は、一定期間における個々のソースIPアドレスから のリクエストレートをトレースし、レート制限を超えたIPアドレスを一時的にブロックするものでした。ただ、制御の対象はあくまでIPアドレス単位のため、攻撃元のIPアドレスを分散させるなどの方法でこのルールは回避可能でした。この「レートベースルール」にIPアドレス以外の条件も柔軟に設定できるようにアップデートされたことで、任意の条件でレートベースルールを適用可能 になりました。

このアップデートを利用したユースケースはいくつか考えられますが、簡単に思いつくものとして、「ボット対策」 があげられます。もともとWAFにはレートリミットの「アクション」に「キャプチャ認証」が指定できますが、前述した通り、これまでの制御対象はIPアドレス単位だったため、キャプチャ認証による保護はレートリミットを超過した特定のIPアドレスにしか適用できず、ボット対策としては不十分でした。

今回のアップデートにより、アクセス元の全IPアドレスを対象にキャプチャ認証によるボット対策を実現できます。具体的には、アクセスしてくる全てのリクエストを対象に、特定のURL(もしくはURLのパスごと)に対するリクエストレートをトレースし、超過した場合はキャプチャ認証を返却することで、ボットからのアクセスは制限しながらも通常のユーザは利用可能にする、というイメージです。では、次項にて実際にボットからのトラフィック保護が可能か、実機にて簡単に試してみたいと思います。

ボットからのトラフィック保護

1. WAF

まず、WAFのWeb ACLsを作成します。作成するルールは以下のように作成しました。

  1. Ruleに「Rate-based rule」を選択します


  2. Rate limitに任意の数字を入力(今回は最小の「100」を入力)し、Request aggregationに「Custom keys」もしくは「Count all」を選択(今回は「Count all」を選択)します。
  3.   ※「Custom keys」と「Count all」の違いは後述

  4. スコープダウンステートメント にてレートリミットの対象とする条件を設定(今回は「target」というURLを対象)し、Actionに「CAPTCHA」を選択します。
  5. ※ 「Custom keys」と「Count all」の違い
    「Custom keys」、「Count all」ともに今回のアップデートで新たに追加されたものです。
    Aggregation options and keys – AWS WAF, AWS Firewall Manager, and AWS Shield Advanced



    Custom keys
    「単一もしくは複合のキーで集約したリクエストを対象とする」もので、選択した集約キー単位でリクエストレートをトレースします。

    e.g. 「QueryString」を集約キーにした場合は「?key=a」「?key=b」ごとに集約してカウント


    Count all
    「全リクエストを対象にする」もので、Custom keysのような集約はできません。スコープダウンステートメントの指定が必須です。

    2. API Gateway

    作成したWAFを紐付け、HTTPリクエストを受信するAPI Gatewayを作成します。リクエストを受信し、適当なレスポンスを返却できれば良いので、モックモードで設定します。
    API Gateway でモック 統合を設定する – Amazon API Gateway

    WAFのルールで定義した通り、「/target」というURLを定義し、レスポンスは以下のように固定で返すだけの設定にします。

    デプロイしたAPI Gatewayに作成したWAF ACLsを紐付けます。

    以上で準備は完了です。

    3. 検証

    ブラウザから設定したURLへアクセスしてみると、設定した通りのレスポンスが表示されます。

    次に、設定したレートリミットである「100」回以上連続してアクセスしてみます。数分後以下のようにキャプチャ認証が返却されるようになりました。

    「開始」ボタンを押下すると、デフォルトで用意されているキャプチャ認証画面に遷移します。何パターンかあるようですが、今回は図形パズル画面に遷移しました。

    パズルに正解すると、正常にレスポンスが表示されます。

    以上、簡単な検証でしたが、ボット対策として十分機能しそうです。

    なお、今回の検証では、デフォルトのキャプチャ認証を使用しましたが、カスタマイズすることもできるようです。興味のある方はご確認ください。

    CAPTCHA JavaScript API を使用する – AWS WAF、AWS Firewall Manager、および AWS Shield Advanced

    さいごに

    WAFの機能アップデートについて簡単に検証してきました。これまでIPアドレス単位での制御のみだったものに多くの条件が追加されたことで選択肢の幅が大幅に広がったと思います。また、その実現が設定レベルで実施できることは利用者にとって大きなメリットだと思います。今回の共有した検証内容を見てもわかる通り、機能確認もすぐ実施できるので興味がある方は是非お試しいただければと思います。

    また、今回の機能アップデートの対象が現時点では「レートリミット」ルールのみなので、これが通常の「レギュラー」ルールの方にも実装されれば、セキュリティ全体で考えた際に更に多くのメリットが生まれると筆者は考えています。

    e.g. Cookieに特定の設定値がある場合にはソースIPを絞るなど

    是非今後のアップデートにも期待したいと思います。

    以上