ブログ

AWS WAF の CAPTCHA 機能でアプリケーションを修正せずにボット判別する方法

Web サイトを運営していると悪意のあるボットから様々な攻撃を受けることが多いと思います。

その効果的な対策として、よく「私はロボットではありません」と表示される CAPTCHA 機能の実装が挙げられますが、通常は実装するためにアプリケーションを修正しなければなりません。

そんなときに活用いただきたいのが、AWS WAFです。AWS WAF の CAPTCHA 機能を使用することで、アプリケーションを修正することなく簡単にロボット判別ができます。

今回はその実装方法やログの出力結果をご紹介します。

AWS WAF に CAPTCHA 機能を実装する方法

今回は以下のような構成でサンプルサイトに CAPTCHA を実装します。

※ CloudFront 、 EC2 及び WordPress 実装部分は割愛します。

WAF を導入する前はデフォルトのサンプルテーマが表示されています。

まずは WAF (WebACL)を作成します。

JSON 形式の場合、以下の様になります。

{
  "Name": "waf-captcha-test",
  "Id": "xxxxxxxx-xxxxxxxxx-xxxx-xxxxxxxxxxxx",
  "ARN": "arn:aws:wafv2:us-east-1:xxxxxxxxxxxx:global/webacl/waf-captcha-test/xxxxxxxx-xxxxxxxxx-xxxx-xxxxxxxxxxxx",
  "DefaultAction": {
    "Allow": {}
  },
  "Description": "",
  "Rules": [],
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "waf-captcha-test"
  },
  "Capacity": 0,
  "ManagedByFirewallManager": false,
  "LabelNamespace": "awswaf:xxxxxxxxxxxx:webacl:waf-captcha-test:"
}

その後、独自ルールを追加します。

JSON 形式の場合、以下の様になります。

{
  "Name": "captcha-test",
  "Priority": 0,
  "Statement": {
    "ByteMatchStatement": {
      "SearchString": "/",
      "FieldToMatch": {
        "UriPath": {}
      },
      "TextTransformations": [
        {
          "Priority": 0,
          "Type": "NONE"
        }
      ],
      "PositionalConstraint": "STARTS_WITH"
    }
  },
  "Action": {
    "Captcha": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "captcha-test"
  }
}

今回はサイト全体に適用したいので「/」のパスから始まるページすべてという設定にしています。

その後 WAF を CloudFront に適用します。

適用後サイトにアクセスしてみると URL はそのまま別ページに遷移します。

「開始」を選択するとロボット判別に必要な問題が提示されます。
現在は視覚問題2種類と聴覚問題(英語)1種類が存在します。

問題に正解すると一瞬だけ結果が表示され、通常のページに遷移します。

AWS WAF の CAPTCHA 機能を特定のページにのみ適用する方法

先程はサイト全体に適用しましたが、特定のページ(お問い合わせ等)のみ適用したいケースも多いと思います。

その場合は WAF の独自ルールの条件を変更することで実装できます。

「/contact/form.php」のページのみに CAPTCHA を実装する場合は以下のような JSON になります。

{
  "Name": "captcha-test",
  "Priority": 0,
  "Statement": {
    "ByteMatchStatement": {
      "SearchString": "/contact/form.php",
      "FieldToMatch": {
        "UriPath": {}
      },
      "TextTransformations": [
        {
          "Priority": 0,
          "Type": "NONE"
        }
      ],
      "PositionalConstraint": "EXACTLY"
    }
  },
  "Action": {
    "Captcha": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "captcha-test"
  }
}

CAPTCHA 機能が働いたリクエストの AWS WAF ログを確認

ここでは CAPTCHA 機能が働いたリクエストのログ、判別済みでスルーされたリクエストの WAF ログを紹介します。

WAF ログの取得・抽出については別の記事を参照ください。

【判別済みのログ】

`nonterminatingmatchingrules`フィールドにロボット判別に成功しており、スルーされていることが出力されていました。

[{ruleid=captcha-test, action=CAPTCHA, rulematchdetails=[], captcharesponse={responsecode=null, solvetimestamp=1683719736}}]

【CAPTCHA実行時】

`terminatingruleid`フィールドに CAPTCHA 用の独自ルール名(captcha-test)が記載されており、

`action`フィールドにはわかりやすく「 CAPTCHA 」と出力されていました。

また特徴的だったのは`captcharesponse`フィールドには理由等が出力されていました。

{responsecode=405, solvetimestamp=null, failurereason=TOKEN_MISSING}

AWS WAF の CAPTCHA 機能でボット判別する方(まとめ)

本ブログでは、AWS  WAF で CAPTCHA を簡単に実装できる方法をご紹介いたしました。

今回ご紹介した AWS WAF の設定をはじめ、ターン・アンド・フロンティアでは AWS をご利用されているお客様に技術的なご支援が可能ですので、 AWS WAF の活用にご興味のある方は お問い合わせフォーム よりお気軽にご相談ください。

元記事発行日: 2024年01月22日、最終更新日: 2024年01月12日