tech#azure#front-door#waf#security#log-analytics#azure-monitor#sentinel

Azure Front Door WAF が実際の攻撃スキャンを防いだ記録

公開 👁 —
Azure Front Door WAF が実際の攻撃スキャンを防いだ記録

Azure Front Door Premium と Web Application Firewall(WAF)をどこまで導入するかは、今でも悩みます。個人サイトに対しては大きな固定費ですし、平常時は防御効果が見えにくいからです。

しかし、2026年9月13日、Memolog に対して自動化された脆弱性スキャンが行われました。WAF は危険と判定した 373件をエッジでブロックし、その通信をオリジンへ到達させませんでした。

この記事では、Memolog がどのような構成で通信を防ぎ、通知後に何を調査したのかを振り返ります。また、WAF がなかった場合に考えられた被害を、確認済みの事実と分けて整理します。

目次

先に結論

今回の調査で確認できたことは、次のとおりです。

WAF がすべてのリクエストを止めたわけではありません。しかし、攻撃パターンに一致した通信をオリジンの手前で止め、危険な処理が実行される機会を減らしました。

今回の一番の学びは、WAF は「導入したから安心」という製品ではなく、アプリケーションの防御と組み合わせて、攻撃が脆弱性へ到達する確率とオリジンの負荷を下げる層だということです。

Memolog の入口を守る構成

Memolog では、公開通信の入口を Azure Front Door Premium に集約しています。静的コンテンツは Azure Static Web Apps、/api/* は Azure Functions へ転送します。

この構成は WAF だけで完結しているわけではありません。Managed Identity、OIDC、Azure Policy、独立した security log、Microsoft Sentinel などを含む取り組み全体は、FinOps と GDPR から始めた Memolog のセキュリティ改善で整理しています。

Memolog の Azure Front Door WAF 構成インターネットからの通信を Azure Front Door Premium と Web Application Firewall で検査し、静的コンテンツを Azure Static Web Apps、API を Azure Functions と Azure Storage へ転送する。アクセスログと WAF ログは Log Analytics に保存し、Azure Monitor の Scheduled Query Rule からメール通知するMemolog の入口を守る構成インターネットHTTPSAzure Front Door Premium公開通信の入口Web Application FirewallPrevention modeDefault Rule Set 2.1 ・ Bot Manager Rule Set 1.1API ごとの rate limit静的コンテンツAzure Static Web Apps/api/*Azure FunctionsAzure StorageAccess / WAF logLog Analyticsログを保存・検索Azure MonitorScheduled Query Rule → メール通知
公開通信は Front Door と WAF を通り、静的コンテンツと API へ分岐します。Access Log と WAF Log は Log Analytics に保存し、Azure Monitor から異常を通知します。

WAF ポリシーは Detection ではなく Prevention mode です。Microsoft の公式ドキュメントでは、Detection mode は一致した request を記録するだけなのに対し、Prevention mode は設定された action を実行すると説明されています。Block action の場合、WAF 自身が client へ応答し、request を origin へ転送しません。

Memolog では WAF の block response を 429 に設定しています。また、検索 API、公開 read API、公開 write API、status API ごとに rate limit を分けています。

もう 1 つ重要なのが、オリジンの直接アクセス制限です。WAF があっても、攻撃者が Azure Functions の既定 hostname を直接呼べれば Front Door を迂回できます。Memolog の Function App は Azure Front Door の backend service tag と Front Door ID を使って入口を制限し、通常の通信が Front Door を通るようにしています。

今回起きたこと

2026年9月13日 02:38:27〜02:39:14 UTC(日本時間 11:38:27〜11:39:14)の約 47秒間に、単一の送信元から多数の探索 request が届きました。

探索対象には、次のような path が含まれていました。

これは Memolog の実装を理解した上で特定の脆弱性を狙ったというより、インターネット上の Web site に対して既知の path と payload を広く試す、自動化された脆弱性スキャンと考えるのが自然です。

送信元 IP の WHOIS 上の割り当て先は Google LLC でした。ただし、ここから分かるのは Google Cloud 系の network から通信された可能性までです。正規利用者による scan、侵害された VM や container、漏えいした account、proxy などをこちらの log だけで区別することはできません。IP の所有組織と実際の攻撃者を同一視しないことも、調査では重要です。

観測できた WAF block の日別傾向

今回の調査をきっかけに、直近 1 か月の日別傾向も確認しました。ただし、Front Door Access Log と WAF Log が保存されているのは、2026年9月12日 14:29 JST 以降の約 2日分だけでした。9月12日より前を 0件として扱う根拠がないため、グラフには実際に観測できた 2日間だけを示します。

集計では、WAF Log の行数ではなく tracking reference を使って request を一意に数えました。また、GitHub Actions の Hot Topics i18n check が公開 API を全件確認した際の rate limit block 5件は、node User-Agent、対象 path、適用 rule を Access Log と突き合わせて除外しています。

観測できた 2日間の WAF block request 数2026年9月12日は 0件、9月13日は 376件。block が発生した日は 1日で、9月13日の 376件のうち 373件が 47秒間の同一スキャンに集中した。Hot Topics i18n check の 5件は除外しているWAF block の日別推移観測できた期間2日block が発生した日1日i18n check 除外後376 request4003002001000ユニーク block request 数09月12日3769月13日373件47秒間の同一スキャンログ観測開始: 2026年9月12日 14:29 JST / Hot Topics i18n check の 5件は除外
観測可能な期間の日別集計。9月13日の 376件のうち 373件は、本記事で扱う単一送信元からの自動スキャンです。残る 3件は別の時間帯と送信元で発生しました。

この範囲では、block が発生した日は 1日でした。9月13日の 376件のうち 373件が 11:38 JST ごろの 47秒間に集中し、272種類の path を探索していました。/fetch、/proxy、/.env などが含まれており、少数の URL を繰り返す負荷試験よりも、既知の脆弱な endpoint や秘密 file を広く探す自動スキャンの特徴が強く表れています。

一方で、この 2日間だけでは週次や月次の増減傾向は判断できません。今後も同じ定義で記録を蓄積し、少なくとも 1 か月分の連続した Log が揃ってから、発生日数、request 数、送信元数、探索 path の変化を再評価する必要があります。

どの WAF ルールが防いだのか

今回の block を最終的に実行したのは、Bot Manager ではなく Microsoft Default Rule Set 2.1 の 949110 でした。

949110 は Inbound Anomaly Score Exceeded を示します。これは個別の攻撃 signature ではありません。request が複数の managed rule に一致すると anomaly score が加算され、その合計が block threshold に達したときに最終的な block を実行する rule です。

今回、score の加算に関係した主な検知は次のとおりでした。

分類観測した rule の例探していたもの
制限ファイルへのアクセス930130credential、設定、repository 情報など
Remote File Inclusion931100、931130外部 file の読み込みや実行につながる入力
Command Injection932100、932110OS command と解釈される可能性がある入力
禁止された file extension920440公開すべきでない file 種別
SQL Injection99031001 などquery 構文を操作する入力
Path Traversal930100、930110公開 directory 外の file 参照

1 つの request が複数 rule に一致するため、rule match 数を合計して「攻撃 request 数」とみなすことはできません。今回の 373件は、access log と WAF の最終 block action を基準に数えています。

Azure Portal の Log Analytics で、Azure Front Door WAF がブロックした 373件の探索 request と適用 rule を確認している画面
実際の WAF block log。秘密ファイルを探す request が並んでいますが、それらの file が存在したことを示すものではありません。送信元 IP は公開用にマスクしています。

Bot Manager 1.1 も unknown bot や攻撃 tool の可能性を示す rule に一致していましたが、Memolog では一部を Log action にしています。今回の主な役割は自動通信の分類と記録であり、最終 block の根拠は Default Rule Set の anomaly scoring でした。

通知を受けて調査したこと

最初に届いたのは、Azure Monitor の Severity 1 alert でした。Log Analytics に保存された Front Door WAF log を 5分ごとに確認し、15分間に /api/ の Block が 1件でもあれば発報する設定です。

調査は次の順番で行いました。

  1. alert の発火時刻と query を確認する
  2. WAF log から action、request URI、client IP、rule、tracking reference を確認する
  3. 同じ時間帯の Front Door access log と突き合わせる
  4. block 件数、API 対象件数、送信元数、最初と最後の時刻を集計する
  5. block された request に origin URL が記録されていないことを確認する
  6. WAF を通過した response の status、route、origin URL、response size を確認する
  7. 秘密ファイルに見える path の response body が、実データではなく共通 404 HTML であることを確認する
  8. Azure Activity Log と Service Health から、同時刻の設定変更や Azure 障害がないことを確認する
  9. 02:45 UTC 以降に同じ送信元から block が継続していないことを確認する

調査に使った KQL の考え方を簡略化すると、次のようになります。実際には hostname、時間範囲、tracking reference なども使って request 単位で照合します。

AzureDiagnostics
| where Category == "FrontDoorWebApplicationFirewallLog"
| extend WafAction = tostring(action_s)
| extend RequestUri = tostring(requestUri_s)
| extend RequestPath = tostring(parse_url(RequestUri).Path)
| where WafAction =~ "Block"
| summarize
    BlockedRequests = count(),
    ApiBlockedRequests = countif(RequestPath startswith "/api/"),
    FirstSeen = min(TimeGenerated),
    LastSeen = max(TimeGenerated)

最終的に、WAF が block した 373件は origin 到達 0件でした。API を対象にした block は 32件です。同時刻に Front Door や WAF の構成変更はなく、Azure 側の service incident も確認されませんでした。

WAF を通過したリクエストと 404

WAF は「存在しない URL をすべて拒否する装置」ではありません。既知の攻撃 pattern や構成した custom rule に一致しない request は、通常どおり route 判定へ進みます。

今回も、一部の request は WAF を通過しました。その後の動作は、静的 path と API path で異なります。

Azure Front Door WAF で block される request と Azure Functions が 404 を返す request の流れrequest が Azure Front Door WAF に到達した後、WAF rule に一致した場合は edge で 429 を返して origin へ転送せず、一致しない API request は Azure Functions へ転送され、該当 endpoint がなければ 404 を返す 2 つの経路WAF 判定後の 2 つの request flowClient requestwww.memobog.netAzure Front Door WAFmanaged rule と custom rule で検査WAF rule に一致1攻撃 pattern を検知anomaly score が block threshold に到達2WAF が HTTP 429 を返すMemolog の custom block responseEdge で遮断し、origin には到達しないWAF rule に一致しない1AFD が /api/* route を選択request を origin へ転送2Azure Functions が受信該当する endpoint は存在しない3Functions が HTTP 404 を返す処理対象がなく、data access もない429: WAF が edge で block / 404: origin に該当 endpoint なし
WAF rule に一致した request は edge で block されます。一致しない API request は Azure Functions まで到達しますが、該当 endpoint がなければ 404 を返します。

404 は rate limit ではありません。Memolog では WAF の block response を独自に 429 へ設定しているため、rate limit と今回の managed rule による block はどちらも client からは 429 に見えます。原因を区別するには、WAF log の rule と action を確認する必要があります。存在しない endpoint が返したのは 404 です。

静的 site では、存在しない秘密ファイル風の path に HTTP 200 が記録されたものもありました。status だけを見ると情報漏えいを疑いますが、response body を確認すると、すべて同じ 404 | Memolog の HTML でした。Static Web Apps の fallback によって HTTP status と表示内容が一致していなかったためです。

この経験から、HTTP status だけで侵害や情報漏えいを判断してはいけないことも分かりました。route、origin 到達、content type、response size、実際の body を合わせて確認する必要があります。

WAF がなかった場合に考えられた被害

ここからは、今回実際に起きた被害ではなく反実仮想です。WAF がなかったからといって、必ず侵害されていたわけではありません。

今回 WAF を通過した存在しない API が 404 で終わったように、アプリケーション、framework、hosting platform の検証も防御として機能します。公開物に秘密情報が含まれておらず、脆弱な endpoint も存在しなければ、同じ scan がすべて後段へ届いても侵害には至りません。

それでも、WAF がない場合には次の risk が高まります。

1. 誤公開した秘密情報が取得される

build artifact に .env、credential、source map、repository metadata、Terraform state などが誤って含まれていた場合、単純な HTTP request だけで取得される可能性があります。WAF は誤公開そのものを直しませんが、既知の探索 pattern を edge で遮断する追加防御になります。

2. 未修正の脆弱性へ payload が届く

framework や application に file inclusion、path traversal、command injection、SQL injection などの脆弱性が存在すれば、payload が処理系まで届きます。成功した場合は、file の読み取り、data の改ざん、remote code execution、credential 取得、ほかの resource への横展開につながる可能性があります。

3. API と依存 service の負荷が増える

侵害に失敗しても、すべての request が Functions、Storage、database、外部 API まで到達すれば、実行回数、transaction、telemetry、scale-out が増えます。高コストな検索や集計 endpoint を繰り返し呼ばれると、可用性低下や cloud cost の増加につながります。

4. 攻撃者に追加の情報を与える

404、401、403、500 の違い、header、response body、処理時間などから、存在する endpoint、technology、認証方式、内部 error を推測される場合があります。WAF で既知の攻撃 request を共通 response にできれば、後段の挙動を観測される機会を減らせます。

つまり今回 WAF が減らしたのは、確定した 1 つの被害ではなく、攻撃 payload が脆弱性や高コスト処理へ接触する機会です。防御が成功した事例では「起きなかった被害」を証明できないため、この線引きを保つ必要があります。

Azure Monitor と Sentinel の役割

今回の流れに Microsoft Sentinel は直接参加していません。

層今回の役割
Azure Front Door WAF危険な request をその場で block
Log AnalyticsFront Door access log と WAF log を保存
Azure MonitorScheduled Query Rule で WAF block を検知して通知
手動調査WAF / access log、実 response、Activity Log、Service Health を照合
Microsoft Sentinel今回は Incident 化せず

Sentinel は WAF の次に自動的に呼ばれる段階ではありません。Analytics Rule を構成し、WAF block の直後に同じ送信元から成功した API request がある、Entra ID や Storage でも異常がある、threat intelligence と一致するといった複数 signal を相関させるときに力を発揮します。

今回のように、WAF が block し、後段の異常や情報漏えいが確認されなかった事象をすべて Sentinel Incident にすると、日常的な internet scan で Incident が増えすぎます。

役割分担は、防御は WAF、運用通知は Azure Monitor、複合的な侵害兆候の相関と Incident 管理は Sentinelと考えると整理しやすくなります。

AFD と WAF をどこまで入れるか

今回の経験だけで、すべての個人 site や小規模 system に Azure Front Door Premium が必要だとは考えていません。費用、守る data、公開 API、origin の防御、運用できる log を合わせて判断する必要があります。

まず SKU の境界として、Azure Front Door Standard でも custom WAF rule と rate limit は利用できます。一方、今回 block した Default Rule Set 2.1 や Bot Manager のような Microsoft managed rule set は Premium の機能です。既知の攻撃 pattern の保守を Microsoft に任せたいかどうかが、Standard と Premium を分ける重要な判断材料になります。

Premium は Standard より固定費が大きいため、静的 site だけを守るために一律で選ぶのではなく、公開 API、認証、扱う data、origin を非公開化する要件と合わせて判断します。価格は変更されるため、検討時点の Azure Front Door の料金と Azure Pricing Calculatorで確認します。SKU の詳しい比較は、Azure Front Door Standard と Premium の違いを整理するにまとめています。

状況検討の方向
静的 file だけで、secret や個人 data を扱わないhosting platform の防御、secure な build、dependency 管理を優先する
認証、個人 data、write API を公開するmanaged WAF、rate limit、origin 制限の価値が上がる
API が Storage や database へ接続するWAF に加えて入力検証、認可、Managed Identity、最小権限を必須にする
高コストな検索、生成 AI、外部 API があるendpoint 別 rate limit、quota、timeout、cost alert を検討する
複数 system の security log があるSentinel で相関し、単独 alert から Incident へ昇格する条件を設計する

WAF を導入する場合も、最初から強く block すればよいわけではありません。Microsoft は Detection mode で traffic と false positive を確認し、必要な tuning を行ってから Prevention mode にすることを案内しています。

また、次の対策は WAF の有無に関係なく必要です。

WAF は脆弱性修正の代わりではありません。複数の防御層のうち、internet と application の間で request を落とす層です。

今回の経験から改善したいこと

今回の防御は成功しましたが、監視設定には改善点がありました。

現在の Azure Monitor alert は、15分間に /api/ の WAF block が 1件でもあると Severity 1 になります。internet に公開した service では単発の scan は珍しくないため、block に成功しただけの事象を常に最上位 severity にする設定は過敏です。

今後は、次のように signal を分けるのが妥当だと考えています。

防御製品の導入だけでなく、通知の精度と調査可能性まで含めて初めて運用できる WAF になると実感しました。

まとめ

Azure Front Door WAF は、Memolog に届いた自動脆弱性スキャンのうち、危険と判定した 373件を edge で block しました。block された通信は origin へ到達せず、後段の API や data access を実行する機会を減らしました。

一方で、WAF を通過した request は application 側の 404 や静的 site の fallback で終了しました。秘密情報流出や侵害は確認されていません。これは WAF だけで守ったのではなく、routing、hosting platform、application、origin 制限を重ねた結果です。

平常時は、WAF の固定費や運用負担だけが目につきます。今回、実際に internet から探索を受けて初めて、攻撃を origin の手前で止めること、止めた記録を残すこと、記録から被害の有無を説明できることに価値があると実感しました。

WAF を入れるか迷ったときは、「攻撃が来るか」ではなく、攻撃 payload が後段まで届いたときに何を失うか、どれだけ負荷がかかるか、あとから調査できるかで判断するのがよさそうです。

参考資料

Microsoft 公式ドキュメント

Memolog 内の関連記事