logo
bars

Amazon AWS WAF
と CapMonster Cloud

キャプチャの解決、サイトへの導入、およびテスト。
キャプチャや防御機構が導入済みのサイトを引き継いだのに、ソースコードへアクセスできない? その場合、どの仕組みが入っているのか、設定は正しいのか、どう検証するのかが気になります。

この記事では、よくある疑問にできるだけお答えしました。まず最初のステップは、どのような保護システムが使われているかを特定することです。そのために、代表的なキャプチャやボット対策システムの一覧を参照できます。ここには、どの仕組みが使われているかを素早く見分けるための画面イメージや主な特徴がまとめられています。

もしサイトで Amazon AWS WAF が使われていることが分かったら、次のステップはその特徴と動作をより詳しく確認することです。同じこの記事の中で、Amazon AWS WAF をサイトに導入するための手順書も確認できるので、あなたのサイト上でどのように機能しているのかをしっかり理解できます。これにより、現在の保護を正しく把握できるだけでなく、今後の運用や保守も計画的に行えるようになります。

Amazon AWS WAFとは
Amazon AWS WAFとは

AWS WAF (Amazon Web Services Web Application Firewall) は、攻撃や悪意のあるトラフィックからサイト、API、Webアプリケーションを保護するAmazonのクラウドWebファイアウォールです。簡単に言えば、サイトやAPIの前に設置されるフィルターであり、どの訪問者のトラフィックを通し、どれをブロックするかを決定します。

サイトでChallenge/CAPTCHAが有効になっている場合、訪問者には別の確認ページが表示されることがあります。「ボットではないこと」を確認するために、例えばカテゴリ内のすべての画像を選択するなどのタスクを完了するよう求められます。

CapMonster CloudでAWS WAFを解決する方法

AWS WAFで保護されたリソースをテストする際、保護が正しく機能し、適切に統合されていることを確認することが重要です。

保護の動作は手動で確認できます:

  • フォームやリソースがあるページを開き、AWS WAFがリクエストに正しく反応することを確認します。
  • WAFによって制限される可能性のあるアクション(例:大量のリクエスト、疑わしいヘッダー)を実行してみてください。サーバーはそのようなリクエストをブロックするか、エラーを返すはずです。

確認に成功すると、AWS WAFはユーザーまたはクライアントがチェックに合格し、信頼できるトラフィックが許可されたことを証明するCookieを設定します。

自動的なキャプチャ認識のためには、専用のサービス、例えばCapMonster Cloudを使用できます。これはキャプチャのパラメータを受け取り、サーバーで処理して、すぐに使えるCookieやトークンを返すツールです。これらをブラウザに適用することで、ユーザーの操作なしにチェックを通過できます。

CapMonster Cloud API を使った一般的な手順:

タスクの作成タスクの作成
arrow
API リクエストの送信API リクエストの送信
arrow
結果の受信結果の受信
arrow
ページへのaws-waf-token Cookieの適用ページへのaws-waf-token Cookieの適用
arrow
既製のライブラリを使用したAmazon AWS WAFの認識
CapMonster Cloudサービスは、PythonJavaScript (Node.js)C#で快適に作業するための既製のライブラリを提供しています。

重要: これらのコード例では cookieSolution=False を使用しています。結果としてCookieを取得する必要がある場合は、cookieSolution=True を設定してください。

Python
JavaScript
C#
解決、パラメータの取得、およびCookieの設定
Node.jsでのWebページ上のキャプチャ認識の完全なサイクルの例です。可能なアプローチ:HTTPリクエストを使用してHTMLと保護システムのパラメータを取得し、回答を送信して結果を処理する。または、自動化ツール(Playwrightなど)を使用する — ページを開き、チェックを待ち、CapMonster Cloudクライアントを介してパラメータを送信し、結果を受け取り、ブラウザにCookieを適用し(テストには正しいデータと不正なデータの両方を使用できます)、結果を確認します。
// npm install playwright @zennolab_com/capmonstercloud-client
// npx playwright install chromium

import { chromium } from "playwright";
import { CapMonsterCloudClientFactory, ClientOptions, AmazonRequest } from "@zennolab_com/capmonstercloud-client";

const API_KEY = "YOUR_API_KEY";
const CAPTCHA_URL = "https://example.com";

// プロキシ設定
const PROXY = {
    proxyType: "http",
    proxyAddress: "PROXY_HOST",
    proxyPort: 1234,
    proxyLogin: "PROXY_USER",
    proxyPassword: "PROXY_PASS"
};

(async () => {
    // 1) プロキシ経由でページを開き、AWS WAFパラメータを収集する
    const browser = await chromium.launch({
        headless: false,
        proxy: {
            server: `http://${PROXY.proxyAddress}:${PROXY.proxyPort}`,
            username: PROXY.proxyLogin,
            password: PROXY.proxyPassword
        }
    });

    const page = await browser.newPage();
    await page.goto(CAPTCHA_URL, { waitUntil: "networkidle" });

    // challengeおよびcaptchaスクリプトの読み込みを待機
    await page.waitForFunction(() => {
        const scripts = Array.from(document.querySelectorAll("script")).map(s => s.src || "");
        return scripts.some(src => src.includes("challenge")) && scripts.some(src => src.includes("captcha"));
    });

    // AWS WAFパラメータ(key, context, iv, スクリプトへのリンク)を抽出
    const params = await page.evaluate(() => {
        const gokuProps = window.gokuProps || {};
        const scripts = Array.from(document.querySelectorAll("script")).map(s => s.src || "");
        return {
            websiteKey: gokuProps.key || null,
            context: gokuProps.context || null,
            iv: gokuProps.iv || null,
            challengeScript: scripts.find(src => src.includes("challenge")),
            captchaScript: scripts.find(src => src.includes("captcha"))
        };
    });

    await browser.close();

    // 2) CapMonster Cloud経由でAWS WAFを解決する
    const client = CapMonsterCloudClientFactory.Create(new ClientOptions({ clientKey: API_KEY }));

    const req = new AmazonRequest({
        websiteURL: CAPTCHA_URL,
        websiteKey: params.websiteKey,
        challengeScript: params.challengeScript,
        captchaScript: params.captchaScript,
        context: params.context,
        iv: params.iv,
        cookieSolution: true,
        proxy: PROXY
    });

    const solved = await client.Solve(req);
    const wafToken = solved.solution.cookies["aws-waf-token"];

    // 3) aws-waf-tokenを適用し、古いものをクリアする
    const browser2 = await chromium.launch({
        headless: false,
        proxy: {
            server: `http://${PROXY.proxyAddress}:${PROXY.proxyPort}`,
            username: PROXY.proxyLogin,
            password: PROXY.proxyPassword
        }
    });

    const context2 = await browser2.newContext();

    // ドメインの古いaws-waf-tokenを削除
    const existingCookies = await context2.cookies();
    const filteredCookies = existingCookies.filter(c => !(c.name === "aws-waf-token" && c.domain.endsWith(".your-domain")));
    await context2.clearCookies();
    await context2.addCookies(filteredCookies);

    // 新しいaws-waf-tokenを設定
    await context2.addCookies([{
        name: "aws-waf-token",
        value: wafToken,
        domain: ".your-domain",
        path: "/",
        httpOnly: false,
        secure: true
    }]);

    const page2 = await context2.newPage();
    const response = await page2.goto(CAPTCHA_URL, { waitUntil: "networkidle" });

    console.log("Final page status:", response.status());
    console.log("Final page URL:", page2.url());

    await browser2.close();
})();
AWS WAFをサイトに接続する方法
サイトでのキャプチャの動作を確実に把握し、検証ロジックを理解し、再接続や再設定を行うために、このセクションを学習することをお勧めします。保護機能の接続プロセスについて説明されており、すべてのニュアンスを素早く理解するのに役立ちます。

AWS WAFはWebサイトに直接インストールすることはできません。以下のAWSリソースを介してのみ機能します:

  • Amazon CloudFront(メインかつ最良の選択肢) — 任意のサイトを保護できるCDN。高速でグローバルに動作し、ほぼすべてのケースに適しています。
  • Application Load Balancer (ALB) — AWS内のサーバーサイドサイト、API、コンテナに使用されます。バックエンドがEC2、ECS、EKSで動作している場合は、ALBにWAFを設置します。
  • API Gateway — RESTおよびWebSocket APIの保護。SPA、モバイルアプリ、マイクロサービスに適しています。
  • AWS AppSync (GraphQL API)
  • Amazon Cognito (ログイン/登録)
  • AWS App Runner (コンテナアプリケーション)
  • AWS Amplify Hosting (フロントエンドホスティング)
  • AWS Verified Access (内部アプリケーションへのアクセス)

ステップ 1. AWSアカウントを作成する(持っていない場合)

https://portal.aws.amazon.com/billing/signup にアクセスします。アカウントを作成 > メールと電話番号を確認します。

ステップ 2. 標準または新しいAWS WAFインターフェースを使用できます:

  1. AWSコンソールに移動します
  2. AWS WAFを開きます。左側のメニューでTry the new experienceをクリックします(提案された場合)。

ステップ 3. 保護パック(Web ACL)を作成する

これがリソースに対する保護ルールのセットになります。

  1. 左側のメニューで次を選択します:Resources & protection packs (Web ACLs)
  2. Add protection pack (web ACL)をクリックします。

ステップ 4. アプリケーションカテゴリを設定する:

Tell us about your appブロックで:

  • App category — Web / API / Both を選択
  • Traffic source — トラフィックの発生元(Web、API、またはその両方)

これらのパラメータは、AWSが最適なルールを提案するために必要です。

ステップ 5. 保護するリソースを選択する

  1. Add resourcesをクリックします
  2. 接続する対象を選択します:

サイトがCloudFrontにある場合 > CloudFront distributionsを選択
バックエンドがALBにある場合 > Regional resourcesを選択
APIの場合 > API Gateway REST APIを選択
必要なリソースにチェックを入れる > Addをクリックします。

ステップ 6. 開始ルールセットを選択する。

AWSは以下を提案します:

Recommended for you — 初心者に最適なオプション

これには以下が含まれます:

  • 基本的な保護
  • SQLiおよびXSSに対するルール
  • IP reputation lists(IPレピュテーションリスト)
  • Bot Control(オプション)
  • Web/API用のルール

Nextをクリックします。

ステップ 7. 設定(オプション)

Customize protection pack (web ACL)画面で:

主なパラメータ:

  • Default action:
    • Allow all except blocked — 通常はこれを選択します
    • Block all except allowed — サイトが閉鎖的な場合
  • Default rate limits: リクエスト数の制限(DDoS L7緩和)
  • IP addresses: ホワイトリスト/ブラックリスト
  • Country specific origins: 国別のトラフィック制限

ロギング(Logging)

ログの保存先を選択します:

  • CloudWatch
  • S3
  • Firehose

(S3 + Athenaが推奨されます)。

ステップ 8. Web ACLを作成

クリック:Add protection pack (web ACL)

AWSがルールを作成し、リソースに紐付けます。

検証

保護が機能していることを確認するには:

  1. WAFを開く > Web ACLを選択
  2. Monitoringに移動
  3. 以下を確認:
    • トラフィックグラフ
    • ブロックされたリクエスト
    • サンプルリクエスト(sample requests)

追加(任意)

  • CAPTCHAまたはChallengeを有効にする

    任意のルール > Action > CAPTCHA / Challenge

    これによりボットのトラフィックが減少し、ログインページやフォームが保護されます。

  • Managed Rule Groupsを追加する

    Rule groupsセクションで以下を追加できます:

    • AWS Managed
    • Bot Control
    • Account takeover prevention(アカウント乗っ取り防止)
    • Marketplace rules (F5, Imperva, Fortinet)
  • Shield Advancedと連携する。DDoS(L3–L7)からの保護のため。

Background
想定されるエラーとデバッグ
Bug Icon
無効なドメインまたはルール — Challengeが表示されない
AWS WAF WebACLが正しいドメイン(CloudFront Distribution / ALB / API Gateway)および正しいパスに紐付けられており、ルール間で競合がないことを確認してください。
Bug Icon
ページの読み込みまたはチェックのタイムアウト
ブラウザやスクリプトがAWS WAFの応答を待たない場合があります。テストのタイムアウト時間を延長し、バックエンドが遅延なくリクエストを処理していることを確認してください。
Bug Icon
期限切れのAWS WAF Cookie
古くなった _aws_waf_token_… や関連するCookieタグは、再Challengeまたは一時的なブロックを引き起こします。
Bug Icon
過敏なルール
厳しすぎるBot Controlシグネチャ、CAPTCHAルール、またはRate-based(レートベース)ルールは、実際のユーザーをブロックする可能性があります。
Bug Icon
WebACLの構成ミス
ルールの順序、優先順位、または条件の誤りは、誤検知やブロックを引き起こす可能性があります。
保護の堅牢性チェック
統合後は、システムが本当に自動化された操作からサイトを守れているか確認しましょう。
セキュリティと最適化のヒント
リスクレベルに応じてWebACLを設定してください。Managed Rules(AWS、AWS Marketplace)、AWS Bot Control、およびIPレピュテーション、ヘッダー、レート制限などの条件に基づくカスタムルールを使用します。
WAFイベントをログに記録してください。誤検知の分析とルールの最適化のために、<a href="https://docs.aws.amazon.com/waf/latest/developerguide/logging.html" target="_blank">AWS WAF Logging (Kinesis Firehose / S3 / CloudWatch Logs)</a>を有効にします。
<b>プライバシーポリシー</b>と<b>利用規約</b>へのリンクを追加してください。これは透明性のため、またセキュリティ要件とユーザーの期待に応えるために重要です。
まとめ

すでにキャプチャや別の保護システムが導入されているサイトを引き継いだものの、コードにはアクセスできない場合でも心配はいりません!どの技術が使われているかを特定するのはそれほど難しくありません。動作が正しいか確認するには、隔離されたテスト環境で認識サービスCapMonster Cloudを利用し、トークン処理の仕組みと検証ロジックが正しく機能しているかをチェックできます。

Amazon AWS WAFの場合も、システムを特定し、その挙動を調べて、保護機能が正しく動いていることを確認すれば十分です。この記事では、Amazon AWS WAFを見分ける方法と、その導入や再設定に関する手順書の見つけ方を紹介しました。これにより、防御を安心して維持し、その動作をしっかりと管理できます。

Conclusion
参考リンク
DocIconAWS WAF ドキュメントDocIconCapMonster Cloud ドキュメント(AWS WAFとの連携)DocIconAWS WAFを使用したWebリソース保護の概要