この記事では、よくある疑問にできるだけお答えしました。まず最初のステップは、どのような保護システムが使われているかを特定することです。そのために、代表的なキャプチャやボット対策システムの一覧を参照できます。ここには、どの仕組みが使われているかを素早く見分けるための画面イメージや主な特徴がまとめられています。
もしサイトで Amazon AWS WAF が使われていることが分かったら、次のステップはその特徴と動作をより詳しく確認することです。同じこの記事の中で、Amazon AWS WAF をサイトに導入するための手順書も確認できるので、あなたのサイト上でどのように機能しているのかをしっかり理解できます。これにより、現在の保護を正しく把握できるだけでなく、今後の運用や保守も計画的に行えるようになります。
AWS WAF (Amazon Web Services Web Application Firewall) は、攻撃や悪意のあるトラフィックからサイト、API、Webアプリケーションを保護するAmazonのクラウドWebファイアウォールです。簡単に言えば、サイトやAPIの前に設置されるフィルターであり、どの訪問者のトラフィックを通し、どれをブロックするかを決定します。
サイトでChallenge/CAPTCHAが有効になっている場合、訪問者には別の確認ページが表示されることがあります。「ボットではないこと」を確認するために、例えばカテゴリ内のすべての画像を選択するなどのタスクを完了するよう求められます。
AWS WAFで保護されたリソースをテストする際、保護が正しく機能し、適切に統合されていることを確認することが重要です。
保護の動作は手動で確認できます:
確認に成功すると、AWS WAFはユーザーまたはクライアントがチェックに合格し、信頼できるトラフィックが許可されたことを証明するCookieを設定します。
自動的なキャプチャ認識のためには、専用のサービス、例えばCapMonster Cloudを使用できます。これはキャプチャのパラメータを受け取り、サーバーで処理して、すぐに使えるCookieやトークンを返すツールです。これらをブラウザに適用することで、ユーザーの操作なしにチェックを通過できます。
CapMonster Cloud API を使った一般的な手順:
AWS WAFを解決するためのリクエストには、以下のパラメータを指定する必要があります:
type - AmazonTask;
websiteURL - キャプチャが解決されるメインページのアドレス;
challengeScript - challenge.jsへのリンク;
以下のパラメータは window.gokuProps から取得されます(すべて文字列型):
captchaScript - captcha.jsへのリンク(Challengeのみの場合は存在しない可能性があります);
cookieSolution - デフォルトは false です。レスポンスとして "captcha_voucher" と "existing_token" を受け取ります。"aws-waf-token" Cookieが必要な場合は、true を指定してください。;
userAgent - ブラウザのUser-Agent。Windows OSからの実際のUAのみを送信してください;
また、このタスクにはご自身のプロキシの使用が必要です:
proxyType :
proxyAddress - プロキシのIPv4/IPv6 IPアドレス;
proxyPort - プロキシのポート;
proxyLogin - プロキシサーバーのログインID;
proxyPassword - プロキシサーバーのパスワード.
https://api.capmonster.cloud/createTask{
"clientKey": "API_KEY",
"task": {
"type": "AmazonTask",
"websiteURL": "https://example.com/index.html",
"websiteKey": "h15hX7brbaRTR...Za1_1",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36",
"captchaScript": "https://234324vgvc23.yejk.captcha-sdk.awswaf.com/234324vgvc23/jsapi.js",
"cookieSolution": true,
"proxyType": "http",
"proxyAddress": "8.8.8.8",
"proxyPort": 8080,
"proxyLogin": "proxyLoginHere",
"proxyPassword": "proxyPasswordHere"
}
}{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/getTaskResult{
"clientKey":"API_KEY",
"taskId": 407533072
}{
"errorId":0,
"status":"ready",
"solution": {
"cookies": {
"aws-waf-token": "10115f5b-ebd8-45c7-851e-cfd4f6a82e3e:EAoAua1QezAhAAAA:dp7sp2rXIRcnJcmpWOC1vIu+yq/A3EbR6b6K7c67P49usNF1f1bt/Af5pNcZ7TKZlW+jIZ7QfNs8zjjqiu8C9XQq50Pmv2DxUlyFtfPZkGwk0d27Ocznk18/IOOa49Rydx+/XkGA7xoGLNaUelzNX34PlyXjoOtL0rzYBxMAQy0D1tn+Q5u97kJBjs5Mytqu9tXPIPCTSn4dfXv5llSkv9pxBEnnhwz6HEdmdJMdfur+YRW1MgCX7i3L2Y0/CNL8kd8CEhTMzwyoXekrzBM="
},
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36"
}
}CapMonster Cloudから受け取ったデータ(有効なAWS WAF Cookie)は、ブラウザコンテキストまたはHTTPクライアントに適用できます。その後、サイトはリクエストを検証済みとして認識し、追加のチェックやチャレンジページなしで作業を続行できるようにします。
自動化とテストには、Puppeteer、Selenium、またはPlaywrightを使用すると便利です。これらを使用すると以下が可能になります:
これにより、保護機能の正当性を確認し、サイトが有効なAWS WAF Cookieを正しく受け入れ、処理していることを確認できます。
重要: これらのコード例では cookieSolution=False を使用しています。結果としてCookieを取得する必要がある場合は、cookieSolution=True を設定してください。
// 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はWebサイトに直接インストールすることはできません。以下のAWSリソースを介してのみ機能します:
ステップ 1. AWSアカウントを作成する(持っていない場合)
https://portal.aws.amazon.com/billing/signup にアクセスします。アカウントを作成 > メールと電話番号を確認します。
ステップ 2. 標準または新しいAWS WAFインターフェースを使用できます:
ステップ 3. 保護パック(Web ACL)を作成する
これがリソースに対する保護ルールのセットになります。
ステップ 4. アプリケーションカテゴリを設定する:
Tell us about your appブロックで:
これらのパラメータは、AWSが最適なルールを提案するために必要です。
ステップ 5. 保護するリソースを選択する
サイトがCloudFrontにある場合 > CloudFront distributionsを選択
バックエンドがALBにある場合 > Regional resourcesを選択APIの場合 > API Gateway REST APIを選択必要なリソースにチェックを入れる > Addをクリックします。
ステップ 6. 開始ルールセットを選択する。
AWSは以下を提案します:
Recommended for you — 初心者に最適なオプション
これには以下が含まれます:Nextをクリックします。
ステップ 7. 設定(オプション)
Customize protection pack (web ACL)画面で:
主なパラメータ:
ロギング(Logging)
ログの保存先を選択します:
(S3 + Athenaが推奨されます)。
ステップ 8. Web ACLを作成
クリック:Add protection pack (web ACL)
AWSがルールを作成し、リソースに紐付けます。
検証
保護が機能していることを確認するには:
任意のルール > Action > CAPTCHA / Challenge
これによりボットのトラフィックが減少し、ログインページやフォームが保護されます。
Rule groupsセクションで以下を追加できます:
すでにキャプチャや別の保護システムが導入されているサイトを引き継いだものの、コードにはアクセスできない場合でも心配はいりません!どの技術が使われているかを特定するのはそれほど難しくありません。動作が正しいか確認するには、隔離されたテスト環境で認識サービスCapMonster Cloudを利用し、トークン処理の仕組みと検証ロジックが正しく機能しているかをチェックできます。
Amazon AWS WAFの場合も、システムを特定し、その挙動を調べて、保護機能が正しく動いていることを確認すれば十分です。この記事では、Amazon AWS WAFを見分ける方法と、その導入や再設定に関する手順書の見つけ方を紹介しました。これにより、防御を安心して維持し、その動作をしっかりと管理できます。