WAFとは何か?Webアプリケーション防火壁の基礎
WAF(Web Application Firewall)が何を守り、何を守れないのかを整理する。AWS WAF の推奨マネージドルール構成、カスタムルール、設置位置、運用記事への導線もまとめる。
WAFとは何か?
WAF(Web Application Firewall)は、HTTP/HTTPS の通信内容を見て、Webアプリケーション向けの攻撃をブロックする防火壁です。
ネットワークのファイアウォールが「どのIP・ポートへ通信できるか」を見るのに対し、WAFは URL・ヘッダー・リクエストボディなど、アプリケーション層(L7)の内容 をルールで評価します。
この記事の結論
- WAFは 本番トラフィックの入口 に置き、既知の攻撃パターンやボットなどを ルールベースで遮断 するための仕組み
- アプリの脆弱性そのものを直す道具ではない(防御の1層として使う)
- いきなり BLOCK ではなく、COUNT で観測してから適用 するのが安全
- AWS では CloudFront / ALB / API Gateway に AWS WAF を付与するのが典型
- まずは IP Reputation + Core rule set + Known bad inputs を基本セットにし、スタックに応じて追加する
運用の詳細は次の記事へ:
WAFが守るもの・守れないもの
守りやすいもの(代表的な脅威)
| 脅威 | WAFでできること(例) |
|---|---|
| SQLインジェクション | 疑わしいクエリ文字列をブロック |
| XSS(クロスサイトスクリプティング) | 危険なスクリプト断片を検知 |
| 既知の悪意ある入力 | マネージドルールで既知パターンを遮断 |
| ボット・スキャン | レート制限、Bot制御、IPレピュテーション |
| 管理画面への不正アクセス | パスベースのルールで制限 |
守りにくいもの(WAFだけでは不十分)
| ケース | なぜ不十分か |
|---|---|
| アプリ固有の認可バグ | 正常に見えるリクエストは通る |
| ビジネスロジックの欠陥 | ルールだけでは文脈を判断できない |
| 認証情報の漏洩 | 正規ユーザーとして見える |
| 内部者による不正 | 入口の外側からは防げない |
WAFは 多層防御の1層 です。アプリ側の入力検証、認可設計、依存ライブラリの更新などと併用します(Webアプリ脆弱性診断の Shift Left 実践ガイド も参照)。
ネットワークFW・CDN・WAFの違い
| 種類 | 主に見るもの | 典型な役割 |
|---|---|---|
| ネットワークFW | IP、ポート、プロトコル | 通信経路の許可/拒否 |
| CDN(例: CloudFront) | 配信・キャッシュ・TLS終端 | 高速化、入口の集約 |
| WAF | HTTPリクエスト/レスポンスの中身 | Web攻撃の検知・遮断 |
| DDoS対策(例: AWS Shield) | 大量トラフィック | 可用性の維持 |
CDNとWAFは 併用 されることが多いです。CDNで入口を集約し、その手前または同じ経路にWAFを置く構成が一般的です。
WAFの動き(ざっくり)
ルールの代表的なアクション
| アクション | 意味 |
|---|---|
| ALLOW | 通す |
| BLOCK | 遮断する |
| COUNT | 通すがログに記録(観測用) |
| CAPTCHA / Challenge | ボット対策で追加検証(製品による) |
本番導入時は、いきなり BLOCK ではなく COUNT で誤検知を確認 してから BLOCK に昇格させるのが定石です(COUNT モード運用)。
AWS WAF ではどこに付けるか
AWS WAF は単体で動くのではなく、保護対象リソースにアタッチ して使います。
| 付与先 | よくある用途 |
|---|---|
| CloudFront | 静的サイト・グローバル配信の入口 |
| ALB | Web/API の L7 ロードバランサ手前 |
| API Gateway | REST/HTTP API の入口 |
| AppSync | GraphQL API の入口 |
入口の責務全体(ALB / CloudFront / WAF の関係)は Apache / Nginx は必要? でも触れています。
ルールの種類
1. マネージドルール
クラウド事業者やベンダーが用意した 既知攻撃向けルール群 です。AWS では AWS Managed Rules(例: Core rule set、Known bad inputs)が代表例です。
- メリット: すぐ導入できる、CVE系の既知パターンをカバーしやすい
- 注意: 誤検知があり得るので COUNT 期間が必要
2. カスタムルール
自社の要件に合わせて作るルールです。
- 特定パス(
/admin)へのアクセス制限 - 特定国・IPレンジのブロック
- レートベースルール(同一IPからの過剰リクエスト)
3. ルールグループ
複数ルールをまとめた単位です。Web ACL にルールグループを追加して、評価順序と優先度を管理します。
AWS WAF では WCU(Web ACL Capacity) という容量上限があり、ルールを増やすほど消費します。追加前に見積もりが必要です(WCU の整理)。
AWS WAF の推奨ルール構成
ここでは AWS Managed Rules を中心に、実務でよく使う推奨構成を整理します。
いずれも導入直後は COUNT で観測し、誤検知がなければ BLOCK に昇格させます(COUNT モード運用)。
基本セット(まず入れる)
多くの Web サイト / API で、最初に検討するのは次の3つです。
| 優先度 | ルールグループ(AWS 名称) | 役割 | WCU | 備考 |
|---|---|---|---|---|
| 1 | AWSManagedRulesAmazonIpReputationList | 悪性IPの遮断 | 25 | コスト対効果が高い。まず入れやすい |
| 2 | AWSManagedRulesCommonRuleSet | OWASP系の広範な防御(Core rule set) | 700 | SQLi / XSS などの基礎防御。ほぼ必須 |
| 3 | AWSManagedRulesKnownBadInputsRuleSet | 既知の危険な入力パターン | 200 | Log4j 系など既知攻撃の補完 |
合計 WCU: 925(1500 上限のうち約6割)。この時点でも十分な入口防御の土台になります。
スタック・用途に応じて追加するルール
基本セットに加えて、環境に合うものだけ足します。
| ルールグループ(AWS 名称) | 役割 | いつ入れるか | WCU | 注意点 |
|---|---|---|---|---|
AWSManagedRulesSQLiRuleSet | SQLインジェクション攻撃の検知・遮断 | RDB を使う Web/API | 240 | ORM 利用でも入口防御として有効 |
AWSManagedRulesLinuxRuleSet | LFI・コマンドインジェクションなど Linux 向け攻撃の検知 | EC2 / ECS など Linux 上のアプリ | 200 | パス設計と併用 |
AWSManagedRulesWindowsRuleSet | IIS / Windows 向けの既知攻撃パターンの検知 | IIS / Windows サーバー | 200 | Linux 環境では不要 |
AWSManagedRulesPHPRuleSet | PHP 固有の脆弱性・攻撃パターンの検知 | PHP アプリ(WordPress 以外も) | 100 | Node.js / Java などでは不要 |
AWSManagedRulesAdminProtectionRuleSet | 管理画面・管理パスへのスキャン・不正アクセスの抑制 | /admin など管理画面がある | 100 | API のみの構成では省略可 |
AWSManagedRulesWordPressRuleSet | WordPress 固有の攻撃(プラグイン狙い等)の検知 | WordPress サイト | 100 | WP 以外では不要 |
AWSManagedRulesAnonymousIpList | VPN・Tor・プロキシ等の匿名IPからのアクセス制限 | 匿名経路のアクセスを抑えたい | 50 | 誤検知が出やすい。COUNT 必須 |
AWSManagedRulesBotControlRuleSet | 自動化ボット・スクレイパー等の検知・制御 | ボット対策を強化したい | 可変 | 料金・WCU が増えやすい。必要性を見て判断 |
「全部 ON」はおすすめしません。使っている OS・言語・フレームワークに関係するものだけ 足すのが現実的です。
カスタムルールとして足すとよいもの
マネージドルールだけでは足りない部分は、カスタムルールで補います。
| 種類 | 例 | 目的 |
|---|---|---|
| レートベースルール | 同一 IP から 5分間に 1000 リクエスト超で BLOCK | ブルートフォース・スキャン抑制 |
| Geo match | 特定国以外を BLOCK | 海外からのアクセスが不要なサービス向け |
| IP セット(許可リスト) | 社内 VPN / 監視拠点のみ許可 | 管理画面や内部 API の入口制限 |
| パスベースルール | /health は WAF 評価をスキップ | ヘルスチェック誤検知の回避 |
レートベースルールは ログイン API・検索 API・POST 系 に優先して入れる価値が高いです。
推奨するルール評価順(上から評価)
AWS WAF では 優先度の小さい番号ほど先に評価 されます。典型例は次の順です。
- 許可リストを最優先 にすると、誤検知の影響を局所化しやすい
- レート制限はマネージドルールより前 に置くと、スキャン流量を先に落とせる
- デフォルトアクション は多くの場合
ALLOW(個別ルールで BLOCK)が運用しやすい
用途別のおすすめ構成例
一般的な Web/API(Linux + RDB)
- Amazon IP Reputation List
- Core rule set
- Known bad inputs
- SQLi rule set
- Linux rule set
- レートベースルール(ログイン・書き込み API)
合計 WCU 目安: 約 1365(上限 1500 以内に収まる典型例)
静的サイト + CloudFront
- Amazon IP Reputation List
- Core rule set
- Known bad inputs
- Anonymous IP List(必要なら COUNT で試す)
管理画面がなければ Admin Protection は省略できます。
API Gateway のみ(認証付き JSON API)
- Amazon IP Reputation List
- Core rule set
- Known bad inputs
- レートベースルール(
/login/tokenなど)
PHP / WordPress 向けルールは通常不要です。
入れない・慎重にすべきパターン
- 初日から全ルールを BLOCK 本番障害の原因になる。必ず COUNT 期間を設ける
- Anonymous IP List を無条件 BLOCK 正規ユーザーの VPN 利用で弾かれることがある
- Bot Control を理由なく全 API に適用 コストと誤検知のトレードオフが大きい。ボット問題が顕在化してから検討
- WCU を見ずにルールを追加
1500を超えると追加料金。追加前に合計 WCU を計算する
導入の進め方(推奨)
- 基本セット3つを COUNT で投入
- WAF ログを S3 / CloudWatch Logs に出力
- 1〜2週間、URI・User-Agent・誤検知を確認
- 問題なければ基本セットを BLOCK に昇格
- スタックに応じたルールを 1グループずつ COUNT → BLOCK
- レートベース・Geo などカスタムルールを追加
ルール単位の昇格手順と WCU 表の詳細は マネージドルール運用記事 を参照してください。
WAFログをなぜ見るか
WAFを入れただけでは終わりではありません。何をブロックしたか・何を通したか をログで確認しないと、次の判断ができません。
- 誤検知(正常ユーザーをブロック)の検出
- 攻撃トレンドの把握
- ルール調整の根拠
ログの集約・可視化は SIEM への WAF ログ取り込み を参照。
導入時によくある誤解
- 「WAFを入れたら安全」 WAFは既知パターンや入口制御に強いが、アプリの設計ミスは別途直す必要がある
- 「BLOCK ルールを全部 ON にすればよい」 誤検知で本番障害になりうる。COUNT → 評価 → BLOCK の順が安全
- 「CDN があれば WAF 不要」 CDNは配信最適化が主目的。攻撃遮断は WAF の役割
- 「Shield があれば WAF 不要」 Shield は DDoS 対策が中心。SQLi や XSS などアプリ層の攻撃は WAF の領域
最低限の導入チェックリスト
- 保護対象(CloudFront / ALB / API Gateway)を決める
- マネージドルールを COUNT で投入する
- WAF ログを S3 などに出力する
- 1〜2週間、誤検知とヒット傾向を確認する
- 問題なければ必要なルールだけ BLOCK に昇格する
- 監視・アラートと SIEM 連携を整える
まとめ
WAFは Webアプリケーションの入口で HTTP を中身まで見て遮断する L7 防火壁 です。
ネットワークFWやCDN、DDoS対策と役割が違うので、入口の多層防御の1ピース として位置づけます。
AWS 環境では CloudFront や ALB に AWS WAF を付け、IP Reputation + Core rule set + Known bad inputs を土台に、COUNT で観測してから BLOCK する運用が現実的です。ルール運用とログ分析は、それぞれ次の記事で深掘りできます。