AWS WAFのWeb ACL(Web Access Control List)とは、Webアプリケーションに届くHTTP/HTTPSリクエストを検査し、許可・ブロック・カウント・CAPTCHA・Challengeなどの処理を行うための設定です。
AWS WAFでは、Web ACLが防御設定の中心になります。
CloudFront、Application Load Balancer、API Gateway REST API、AWS AppSync、Amazon Cognito、AWS App Runner、AWS Amplify、AWS Verified AccessなどのリソースにWeb ACLを関連付けることで、対象リソースに届くリクエストをAWS WAFで制御できます。
簡単にいうと、Web ACLは「どのアクセスを通し、どのアクセスを止めるか」を決めるためのルールセットです。
たとえば、以下のような制御をWeb ACLで実現できます。
AWS公式ドキュメントでは、Web ACLは「protection pack (web ACL)」と表記されることもあります。
ただし、実務上は現在も「Web ACL」という呼び方で問題なく通じます。
Web ACLを使うと、Webアプリケーションに対するアクセスをアプリケーション層で制御できます。
セキュリティグループがIPアドレス、ポート、プロトコルなどのネットワークレベルで通信を制御するのに対し、AWS WAFのWeb ACLはHTTPリクエストの中身を見て判断します。
たとえば、以下のような情報をもとにリクエストを判定できます。
これにより、単なる通信許可・拒否だけでなく、Webアプリケーション特有の攻撃や不審なアクセスを検出できます。
Web ACLは、保護したいAWSリソースに関連付けて使います。
主な関連付け対象は以下です。
| 対象リソース | 用途 |
|---|---|
| Amazon CloudFront | グローバル配信されるWebサイトやAPIの保護 |
| Application Load Balancer | ALB配下のWebアプリケーション保護 |
| Amazon API Gateway REST API | APIへの攻撃や過剰アクセス対策 |
| AWS AppSync | GraphQL APIの保護 |
| Amazon Cognito user pool | 認証関連エンドポイントの保護 |
| AWS App Runner | App Runner上のWebアプリケーション保護 |
| AWS Amplify | Amplifyでホストするアプリケーション保護 |
| AWS Verified Access | Verified Access経由のアクセス保護 |
CloudWatchは、Web ACLの通常の関連付け対象というより、AWS WAFのメトリクス確認やログ出力先として利用されます。
Web ACLで検査したリクエストのログは、CloudWatch Logs、Amazon S3、Amazon Data Firehoseなどに出力できます。
Web ACLを作成するときは、Scopeを選択します。
Scopeには大きく分けて以下の2種類があります。
| Scope | 対象 |
|---|---|
| CloudFront / Global | CloudFrontディストリビューション |
| Regional | ALB、API Gateway、AppSync、Cognito、App Runner、Amplify、Verified Accessなど |
CloudFront用のWeb ACLはグローバル扱いです。
ただし、AWS WAF上では、CloudFront用Web ACLはUS East (N. Virginia) / us-east-1、またはコンソール上のGlobal (CloudFront)として作成・管理します。
一方、ALBやAPI GatewayなどのリージョナルリソースにWeb ACLを関連付ける場合は、保護対象リソースと同じリージョンでWeb ACLを作成する必要があります。
たとえば、東京リージョンのALBを保護する場合は、東京リージョンでRegional Web ACLを作成します。
Web ACLは、主に以下の要素で構成されます。
| 構成要素 | 内容 |
|---|---|
| Name | Web ACLの名前 |
| Scope | CloudFront用かRegional用か |
| Default action | どのルールにも一致しなかった場合の動作 |
| Rules | リクエストを評価する個別ルール |
| Rule groups | 複数ルールをまとめたグループ |
| Managed rule groups | AWSやベンダーが提供する管理済みルールグループ |
| Priority | ルールの評価順序 |
| Rule action | ルール一致時の動作 |
| Visibility config | CloudWatchメトリクスやサンプリング設定 |
| Logging | WAFログの出力設定 |
Web ACLは、これらの設定を組み合わせて「どのようなアクセスをどの順番で評価し、どのように処理するか」を定義します。
Default actionとは、Web ACL内のルールをすべて評価した結果、どのルールでも最終的な処理が決まらなかった場合に適用されるアクションです。
Default actionには、基本的に以下の2つがあります。
| Default action | 内容 |
|---|---|
| Allow | ルールに一致しなかったリクエストを許可する |
| Block | ルールに一致しなかったリクエストをブロックする |
一般公開サイトでは、多くの場合、Default actionをAllowにします。
つまり、基本的にはリクエストを通し、危険なリクエストだけをルールでブロックする設計です。
一方、管理画面や社内向けシステム、限定公開APIなどでは、Default actionをBlockにすることもあります。
この場合、明示的に許可した条件に一致するリクエストだけをAllowし、それ以外はすべてブロックします。
一般的なWebサイトでは、Default actionをAllowにすることが多いです。
たとえば、以下のようなサイトです。
この場合、基本方針は以下のようになります。
通常のアクセスは許可する
明らかに危険なアクセスだけをブロックする
不審なアクセスはCountやChallengeで様子を見る
Default actionをBlockにするのは、アクセス元を厳しく限定したい場合です。
たとえば、以下のようなケースです。
この場合、基本方針は以下です。
原則すべてブロックする
許可したIPや条件に一致するリクエストだけを通す
ホワイトリスト型の強い防御ができますが、IPアドレス変更やVPN障害があると正規ユーザーもアクセスできなくなる可能性があります。
そのため、運用体制も含めて設計する必要があります。
Ruleとは、Web ACLの中でリクエストを判定するための条件と、その条件に一致したときのアクションを定義するものです。
AWS WAFのRuleは、単独のAWSリソースとして独立して存在するものではありません。
Web ACLまたはRule groupの中に定義されます。
たとえば、以下のようなルールを作成できます。
条件: URIパスが /wp-login.php で、同一IPから短時間に大量アクセスがある
アクション: Block
または、以下のようなルールも作成できます。
条件: 送信元IPが自社オフィスIPに一致する
アクション: Allow
このように、Ruleは「何を検査するか」と「一致したらどうするか」を決める設定です。
AWS WAFのRuleでは、さまざまな条件を指定できます。
| 条件 | 例 |
|---|---|
| IP address | 特定IPやCIDRからのアクセスを制御 |
| Geo match | 特定国・地域からのアクセスを制御 |
| URI path | /admin や /wp-login.php へのアクセスを制御 |
| Query string | クエリ文字列に不審な値があるか検査 |
| Header | User-AgentやRefererなどを検査 |
| Cookie | Cookieの値をもとに判定 |
| Body | フォーム本文やJSON本文を検査 |
| HTTP method | GET、POST、PUTなどを条件にする |
| Size constraint | リクエストサイズを条件にする |
| Regex match | 正規表現でパターン判定する |
| SQLi match | SQLインジェクションらしい入力を検査 |
| XSS match | XSSらしい入力を検査 |
| Rate-based | 一定時間内のリクエスト数で判定 |
| Label match | 他のルールが付与したラベルで判定 |
これらを組み合わせることで、単純なIP制限から高度な攻撃検知まで対応できます。
Rule actionとは、ルールに一致したリクエストに対してAWS WAFが実行する動作です。
主なアクションは以下です。
| アクション | 内容 |
|---|---|
| Allow | リクエストを許可する |
| Block | リクエストをブロックする |
| Count | 許可・ブロックせず、カウントだけする |
| CAPTCHA | ユーザーにCAPTCHAを要求する |
| Challenge | ブラウザ検証などのチャレンジを行う |
AWS WAFでは、アクションによってルール評価が終了するものと、次のルール評価に進むものがあります。
| アクション | 評価の扱い |
|---|---|
| Allow | 終了アクション |
| Block | 終了アクション |
| Count | 非終了アクション |
| CAPTCHA | トークン状態により終了または非終了 |
| Challenge | トークン状態により終了または非終了 |
AllowやBlockが適用されると、その時点でWeb ACLの評価は終了します。
一方、Countはリクエストを止めずに記録だけを行い、次のルール評価に進みます。
そのため、新しいルールを本番環境に導入するときは、最初にCountで様子を見るのが安全です。
CAPTCHAやChallengeは少し特殊です。
リクエストに有効なトークンがない場合は、ユーザーにCAPTCHAやChallengeを提示し、評価が終了することがあります。
一方、有効なトークンがある場合は、Countに近い非終了アクションとして扱われ、後続のルール評価に進むことがあります。
Web ACL内のルールにはPriorityがあります。
AWS WAFは、Priorityの数値が小さいルールから順番に評価します。
たとえば、以下のような順番です。
| Priority | ルール | アクション |
|---|---|---|
| 0 | 自社IPを許可 | Allow |
| 10 | 悪質IPをブロック | Block |
| 20 | AWS Managed Rules Common Rule Set | BlockまたはCount |
| 30 | SQLi対策ルール | BlockまたはCount |
| 40 | レートベースルール | Block |
| Default | どのルールにも一致しない | Allow |
Priority 0のルールが最初に評価され、次にPriority 10、Priority 20と続きます。
AWS WAFでは、ルールの順番によって結果が変わることがあります。
たとえば、自社IPを許可するルールを最初に置いた場合、自社IPからのリクエストはAllowされ、その時点で評価が終了します。
つまり、後続のManaged Rulesには評価されません。
一方、自社IP許可ルールをManaged Rulesの後ろに置いた場合、自社IPからの正常な管理作業がManaged Rulesで誤検知され、ブロックされる可能性があります。
そのため、以下のようなルールは順序を慎重に設計する必要があります。
Rule groupとは、複数のRuleをまとめたものです。
同じルール群を複数のWeb ACLで使い回したい場合や、管理しやすくしたい場合に利用します。
たとえば、以下のような共通ルールをRule groupにまとめられます。
複数サービスで同じセキュリティポリシーを使いたい場合、Rule groupを使うと管理が楽になります。
Rule groupには、主に以下の種類があります。
| 種類 | 内容 |
|---|---|
| 自作Rule group | 自分で作成・管理するルールグループ |
| AWS Managed Rules | AWSが提供・管理するルールグループ |
| Marketplace managed rule groups | サードパーティが提供するルールグループ |
自作Rule groupは、社内共通ルールを再利用したい場合に便利です。
AWS Managed Rulesは、AWSが一般的な攻撃パターンに対応するために提供している管理済みルールです。
自分で細かく攻撃パターンを定義しなくても、代表的なWeb攻撃への対策を導入できます。
AWS Managed Rulesは、AWSが提供・保守するマネージドルールグループです。
SQLインジェクション、XSS、既知の悪意ある入力、低レピュテーションIP、匿名IP、Bot、WordPress向け攻撃など、さまざまな脅威に対応するルールグループが用意されています。
Managed Rulesを使うメリットは、攻撃パターンの定義やメンテナンスをすべて自分で行わなくても、一定水準の防御を導入できる点です。
代表的なAWS Managed Rulesには、以下のようなものがあります。
| ルールグループ | 主な目的 |
|---|---|
| AWSManagedRulesCommonRuleSet | 一般的なWeb攻撃対策 |
| AWSManagedRulesKnownBadInputsRuleSet | 既知の悪意ある入力パターン対策 |
| AWSManagedRulesSQLiRuleSet | SQLインジェクション対策 |
| AWSManagedRulesAmazonIpReputationList | AWSが管理する低レピュテーションIP対策 |
| AWSManagedRulesAnonymousIpList | VPN、プロキシ、匿名化ネットワーク対策 |
| AWSManagedRulesBotControlRuleSet | Bot対策 |
| AWSManagedRulesAdminProtectionRuleSet | 管理画面系パスの保護 |
| AWSManagedRulesLinuxRuleSet | Linux固有の攻撃パターン対策 |
| AWSManagedRulesPHPRuleSet | PHPアプリ向け攻撃パターン対策 |
| AWSManagedRulesWordPressRuleSet | WordPress向け攻撃パターン対策 |
すべてのルールグループを入れればよいわけではありません。
アプリケーションの技術スタックや公開範囲に合わせて、必要なものを選ぶことが重要です。
たとえば、WordPressを使っていないサイトにWordPress向けルールを入れても効果は限定的です。
PHPを使っていないアプリケーションにPHP向けルールを入れる必要性も高くありません。
Managed Rule Groupを使う場合、ルールグループ全体、または個別ルールの動作を上書きできます。
これをOverrideと呼びます。
たとえば、AWSManagedRulesCommonRuleSetの中に複数のルールが含まれている場合、そのうち特定のルールだけをCountに変更できます。
Managed Rulesは便利ですが、すべてのアプリケーションに完全に合うとは限りません。
たとえば、以下のようなケースでは誤検知が起きることがあります。
このような場合、ルールグループ全体を無効にするのではなく、誤検知している個別ルールだけをCountにする、または除外条件を追加するのが現実的です。
実務では、以下の流れで調整するのが安全です。
いきなりすべてをBlockにすると、正常なユーザーや管理者の操作まで止めてしまうリスクがあります。
Countモードは、ルールに一致したリクエストをブロックせず、検出だけを行う設定です。
AWS WAFの導入時には、Countモードが非常に重要です。
Countモードを使うことで、以下を確認できます。
AWS Managed Rulesは強力ですが、アプリケーションの仕様によっては正常なリクエストを攻撃と判断することがあります。
特に以下のようなサイトでは注意が必要です。
いきなりBlockにすると、問い合わせフォームが送信できない、購入処理が失敗する、管理画面で保存できない、API連携が失敗する、といった問題が起きる可能性があります。
そのため、まずはCountで導入し、ログを確認してからBlockへ移行するのが安全です。
WCU(Web ACL Capacity Unit)とは、AWS WAFのルールやWeb ACLが消費する処理キャパシティを表す単位です。
AWS WAFでは、ルールの種類によって必要なWCUが異なります。
たとえば、単純なIP一致ルールは比較的少ないWCUで済みます。
一方、正規表現、SQLインジェクション検査、XSS検査、リクエスト本文検査などは、より多くのWCUを消費します。
Web ACLにはWCUの上限があります。
実務上、特に重要なのは以下です。
| 項目 | 内容 |
|---|---|
| 基本料金に含まれるWCU | 1,500 WCUまで |
| 1,500 WCU超過 | 追加料金が発生 |
| Web ACLの最大WCU | 5,000 WCU |
| Rule groupの最大WCU | 5,000 WCU |
Managed Rule Groupを複数追加すると、WCUの合計が大きくなります。
「念のため全部入れる」という設計にすると、WCUが増え、コストや管理負荷も増える可能性があります。
そのため、アプリケーションに必要なルールを選定することが重要です。
Rate-based ruleとは、一定時間内に同じ条件で届いたリクエスト数をもとに制御するルールです。
たとえば、以下のような制御ができます。
同一IPから5分間に500回以上アクセスがあった場合にBlockする
また、対象を特定のパスに限定することもできます。
/wp-login.php に対して、同一IPから5分間に20回以上アクセスがあった場合にBlockする
Rate-based ruleは、以下のような対策に有効です。
Rate-based ruleは便利ですが、厳密なAPIレートリミッターではありません。
高頻度リクエストを緩和するための仕組みであり、「1分あたり必ず何回まで」といった厳密な利用回数制御を目的とする場合は、API Gatewayの使用量プラン、アプリケーション側の制御、認証基盤側の制限なども併用する必要があります。
また、AWS WAFのクォータとして、Rate-based ruleには以下のような制限があります。
| 項目 | 内容 |
|---|---|
| Web ACLあたりのRate-based rule数 | 最大10個 |
| Rule groupあたりのRate-based rule数 | 最大4個 |
| 設定可能な最小リクエストレート | 10 |
AWS WAFでは、リクエスト本文を検査できます。
そのため、フォーム送信内容やJSON本文に含まれるSQLインジェクション、XSS、既知の悪意ある入力などを検出できます。
ただし、AWS WAFで検査できるリクエスト本文サイズには上限があります。
| 対象リソース | 本文検査サイズ |
|---|---|
| Application Load Balancer | 8KB固定 |
| AWS AppSync | 8KB固定 |
| CloudFront | デフォルト16KB、最大64KB |
| API Gateway | デフォルト16KB、最大64KB |
| Amazon Cognito | デフォルト16KB、最大64KB |
| AWS App Runner | デフォルト16KB、最大64KB |
| AWS Verified Access | デフォルト16KB、最大64KB |
大きなJSON、ファイルアップロード、大容量フォーム送信などでは、WAFが本文全体を検査できない場合があります。
大きなリクエスト本文を扱うアプリケーションでは、WAFだけに依存しない設計が必要です。
たとえば、以下のような対策を組み合わせます。
AWS WAFは有効な防御層ですが、アプリケーション側のバリデーションを代替するものではありません。
Web ACLでは、リクエストのログを出力できます。
WAFログを有効化すると、以下のような情報を確認できます。
ログを確認することで、AWS WAFがどのように動作しているかを把握できます。
AWS WAFのログ出力先としては、主に以下を利用できます。
| 出力先 | 用途 |
|---|---|
| Amazon CloudWatch Logs | すぐにログ確認・検索したい場合 |
| Amazon S3 | 長期保存や分析基盤連携 |
| Amazon Data Firehose | S3、OpenSearch、外部分析基盤などへの配送 |
ログ量が多いサイトでは、ログ保存コストも無視できません。
そのため、必要に応じてログフィルタリング、保持期間の設定、S3ライフサイクルポリシーなどを検討します。
WAFは設定して終わりではありません。
ログを見ながら継続的に調整することで、防御効果を高められます。
特に以下の観点で確認します。
ECサイトや問い合わせフォームでは、誤検知が売上やCVRに影響する可能性があります。
Webマーケティングの観点でも、WAFログとコンバージョンデータをあわせて確認することが重要です。
AWS WAFの料金は、主に以下の要素で発生します。
| 料金要素 | 内容 |
|---|---|
| Web ACL | 作成したWeb ACLごとの料金 |
| ルール | Web ACL内のルールごとの料金 |
| リクエスト数 | Web ACLで処理されたWebリクエスト数 |
| Rule group | 自作またはManaged Rule Groupの利用 |
| Managed Rule Group | AWS Managed RulesやMarketplaceルール |
| WCU超過 | 1,500 WCUを超えた場合の追加料金 |
| CAPTCHA / Challenge | 利用回数に応じた料金 |
| Bot Control | Bot Control利用時の追加料金 |
| Fraud Control | Fraud Control利用時の追加料金 |
| ログ | CloudWatch Logs、S3、Firehoseなどの料金 |
Allow、Block、Countといった標準アクション自体に追加料金はありません。
一方で、CAPTCHA、Challenge、Bot Control、Fraud Control、1,500 WCU超過、ログ保存などは追加コストの要因になります。
AWS WAFのコストを見積もるときは、以下を確認します。
アクセス数が多いWebサイトでは、リクエスト数による料金とログ保存料金が大きくなることがあります。
また、Bot Controlなどの高度な機能は便利ですが、追加料金が発生するため、費用対効果を見ながら導入することが大切です。
一般的なWebサイトでは、以下のような構成が考えられます。
Default action: Allow
Rules:
1. AWSManagedRulesAmazonIpReputationList
2. AWSManagedRulesCommonRuleSet
3. AWSManagedRulesKnownBadInputsRuleSet
4. AWSManagedRulesSQLiRuleSet
5. Rate-based rule
この構成では、通常のアクセスを許可しながら、一般的な攻撃パターンや不審なIP、過剰アクセスを抑制します。
最初はManaged RulesをCountで導入し、ログを確認してからBlockに切り替えるのが安全です。
WordPressサイトでは、以下のような構成が考えられます。
Default action: Allow
Rules:
1. 自社IPまたは管理者IPをAllow
2. 悪質IPをBlock
3. AWSManagedRulesAmazonIpReputationList
4. AWSManagedRulesCommonRuleSet
5. AWSManagedRulesKnownBadInputsRuleSet
6. AWSManagedRulesSQLiRuleSet
7. AWSManagedRulesWordPressRuleSet
8. /wp-login.php へのRate-based rule
9. /xmlrpc.php のBlock
WordPressでは、特に以下のパスが攻撃対象になりやすいです。
/wp-login.php/wp-admin/xmlrpc.php不要な/xmlrpc.phpはブロックし、ログイン画面にはレート制限やIP制限を検討するとよいでしょう。
API GatewayやALB配下のAPIを保護する場合は、以下のような構成が考えられます。
Default action: Allow
Rules:
1. 許可するHTTPメソッドを制限
2. 不審IPをBlock
3. SQLi / XSS対策
4. JSON本文の検査
5. APIパスごとのRate-based rule
6. Botやスクレイピング対策
APIでは、Webページとは違う観点が重要です。
たとえば、以下を確認します。
厳密なAPI利用制限が必要な場合は、AWS WAFだけでなく、API Gatewayの使用量プランやアプリケーション側の認可・レート制限も併用します。
管理画面や社内向けシステムでは、Default actionをBlockにするホワイトリスト型も有効です。
Default action: Block
Rules:
1. 社内IPをAllow
2. VPN出口IPをAllow
3. 特定取引先IPをAllow
この構成では、許可されたアクセス元以外はすべてブロックされます。
攻撃面を大きく減らせますが、以下の点に注意が必要です。
セキュリティは強くなりますが、運用ミスによって正規ユーザーが締め出されるリスクもあります。
まず、どのリソースをAWS WAFで保護するか決めます。
候補は以下です。
Webサイト全体をCloudFrontで配信している場合は、CloudFrontにWeb ACLを関連付ける構成がよく使われます。
ALBに直接アクセスされる構成であれば、ALBにWeb ACLを関連付けることもあります。
ただし、CloudFrontを使っている場合は、オリジン直アクセスを防ぐ設計もあわせて検討します。
次に、Web ACLのScopeを選びます。
CloudFrontを守るなら、CloudFront / Global用のWeb ACLを作成します。
ALBやAPI Gatewayなどを守るなら、対象リソースと同じリージョンでRegional Web ACLを作成します。
一般公開サイトなら、基本的にはDefault actionをAllowにすることが多いです。
Default action: Allow
管理画面や限定APIなら、Default actionをBlockにする構成も検討します。
Default action: Block
どちらを選ぶかは、サイトの公開範囲と運用方針によって変わります。
最初は、代表的なAWS Managed RulesをCountで導入します。
例として、以下のようなルールグループが候補になります。
AWSManagedRulesAmazonIpReputationList
AWSManagedRulesCommonRuleSet
AWSManagedRulesKnownBadInputsRuleSet
AWSManagedRulesSQLiRuleSet
WordPressサイトなら、以下も検討します。
AWSManagedRulesWordPressRuleSet
ただし、すべてをいきなりBlockにするのではなく、まずはCountでログを確認します。
次に、過剰アクセスが問題になりやすい箇所にRate-based ruleを設定します。
代表的な対象は以下です。
/wp-login.php/xmlrpc.phpたとえば、以下のような設計が考えられます。
/wp-login.php に対して、同一IPから5分間に20回以上アクセスがあればBlock
ただし、しきい値が低すぎると正規ユーザーも影響を受ける可能性があります。ログを見ながら調整することが重要です。
Countで導入した後は、WAFログを確認します。
特に以下を見ます。
問題がなければ、対象ルールをBlockに変更します。
誤検知がある場合は、以下の方法で調整します。
重要なのは、誤検知があるからといってルール全体を安易に無効化しないことです。
可能であれば、影響のある条件だけを狭く除外します。
Countで問題がないことを確認できたルールから、段階的にBlockへ移行します。
おすすめの流れは以下です。
一度にすべてをBlockにするのではなく、段階的に変更することで障害リスクを抑えられます。
AWS WAFは一度設定して終わりではありません。
以下のタイミングで見直すとよいです。
Webアプリケーションの仕様が変われば、適切なWAF設定も変わります。
CloudFrontにWeb ACLを関連付けると、エッジ側でリクエストを検査できます。
これには以下のメリットがあります。
CloudFrontを使っているWebサイトでは、まずCloudFrontにWAFを適用する構成がよく採用されます。
CloudFrontにWAFを設定しても、ALBやEC2などのオリジンに直接アクセスできる構成だと、WAFを迂回される可能性があります。
そのため、CloudFrontを使う場合は、オリジン側でも以下のような対策を検討します。
AWS WAFは強力ですが、設置場所を誤ると期待した防御効果を得られません。
AWS WAFのWeb ACLとセキュリティグループは、どちらもアクセス制御に関係しますが、役割が異なります。
| 項目 | Web ACL | セキュリティグループ |
|---|---|---|
| サービス | AWS WAF | Amazon EC2 / VPC関連 |
| 主なレイヤー | アプリケーション層 | |
| 主な対象 | HTTP/HTTPSリクエスト | |
| 制御内容 | URI、ヘッダー、Cookie、本文、攻撃パターン | |
| 例 | SQLiをブロック、特定パスを制限 | |
| 目的 | Web攻撃対策 | |
| 代表的な用途 | Webアプリケーション保護 |
セキュリティグループは、主にIPアドレス、ポート、プロトコル単位で通信を制御します。
| 項目 | セキュリティグループ |
|---|---|
| 主なレイヤー | ネットワーク層・トランスポート層 |
| 主な対象 | EC2、ALB、RDSなど |
| 制御内容 | IP、ポート、プロトコル |
| 例 | 443番ポートのみ許可 |
| 目的 | ネットワークアクセス制御 |
たとえば、セキュリティグループでは「443番ポートへのアクセスを許可する」ことはできます。
しかし、「クエリ文字列にSQLインジェクションらしい文字列がある場合にブロックする」といった制御はできません。
このようなHTTPリクエストの中身を見た制御を行うのが、AWS WAFのWeb ACLです。
Web ACLは、以下のような脅威に対して有効です。
SQLインジェクションは、入力値にSQL文を混ぜてデータベースを不正操作しようとする攻撃です。
AWS WAFでは、SQLi match statementやAWSManagedRulesSQLiRuleSetを使うことで、SQLインジェクションの疑いがあるリクエストを検出できます。
クロスサイトスクリプティング、いわゆるXSSは、入力欄などにスクリプトを混入させる攻撃です。
AWS WAFでは、XSS match statementやCommon Rule Setなどを使って、XSSの疑いがあるリクエストを検出できます。
攻撃でよく使われる文字列やパターンを検出できます。
AWSManagedRulesKnownBadInputsRuleSetを利用すると、既知の悪意ある入力パターンへの対策を導入できます。
AWSManagedRulesAmazonIpReputationListなどを使うと、AWSが管理する低レピュテーションIPからのアクセスを制御できます。
また、自社で管理するIP setを使えば、特定IPのブロックや許可も可能です。
AWSManagedRulesAnonymousIpListを使うと、VPN、プロキシ、Torノード、ホスティングプロバイダーなど、匿名性の高いアクセス元を検出できます。
ただし、VPN利用者や海外ユーザーに影響が出る可能性があるため、導入時はCountで確認するのが安全です。
Rate-based ruleを使うことで、同一IPなどからの短時間の大量アクセスを制御できます。
ログイン試行、フォーム連投、API連打、スクレイピングなどの抑制に役立ちます。
Bot ControlやChallengeを使うことで、一部のBotや自動化アクセスに対策できます。
ただし、すべてのBotを完全に防げるわけではありません。
検索エンジン、監視ツール、広告クローラー、外部連携サービスなど、許可すべきBotも存在するため、ログを見ながら調整する必要があります。
AWS WAFは有効なセキュリティ対策ですが、万能ではありません。
以下のような問題は、Web ACLだけでは防ぎにくいです。
正規アカウントでログインしたユーザーが不正操作を行う場合、リクエスト自体は正常に見えることがあります。
このようなケースでは、アプリケーション側の認可制御、操作ログ、異常検知が必要です。
たとえば、他人のユーザーIDをURLに指定すると情報が見えてしまうような脆弱性は、WAFだけでは根本的に防げません。
アプリケーション側で、ユーザーごとのアクセス権限を正しくチェックする必要があります。
クーポンの不正利用、ポイントの不正取得、在庫の買い占め、紹介制度の悪用などは、通常のHTTPリクエストとして送られることがあります。
このような攻撃には、アプリケーション側のロジック制御、不正検知、利用制限などが必要です。
ID・パスワードが漏えいしている場合、攻撃者は正規ユーザーとしてログインできます。
WAFだけで完全に防ぐのは難しいため、多要素認証、ログイン通知、異常ログイン検知、パスワードリセットなどの対策が必要です。
AWS WAFは攻撃リクエストを検出・遮断する防御層ですが、アプリケーションの脆弱性そのものを修正するものではありません。
脆弱性診断、セキュアコーディング、依存ライブラリの更新、パッチ適用なども必要です。
Web ACLを導入するときは、以下を確認します。
| チェック項目 | 確認内容 |
|---|---|
| 保護対象 | CloudFront、ALB、API Gatewayなどが正しいか |
| Scope | CloudFront用かRegional用か |
| リージョン | Regionalの場合、対象リソースと同じリージョンか |
| Default action | Allow / Blockの方針が適切か |
| Priority | ルール順序に矛盾がないか |
| WCU | 1,500 WCU超過や上限に注意しているか |
| ログ | WAFログを有効化しているか |
| メトリクス | CloudWatchで確認できるか |
ルール設計では、以下を確認します。
| チェック項目 | 確認内容 |
|---|---|
| Managed Rules | 必要なルールグループだけ選んでいるか |
| Count検証 | いきなりBlockにしていないか |
| 誤検知対応 | Overrideや除外条件を設計しているか |
| Rate-based rule | しきい値が低すぎないか |
| IP制限 | 管理画面や限定APIに適用しているか |
| Bot対策 | 正常なBotまで止めていないか |
| 本文検査 | 検査サイズ上限を理解しているか |
運用では、以下を確認します。
| チェック項目 | 確認内容 |
|---|---|
| ログ監視 | 定期的にWAFログを確認しているか |
| 誤検知対応フロー | ブロック事故時の対応手順があるか |
| ルール更新 | アプリ改修時にWAF設定も見直しているか |
| コスト確認 | リクエスト数、WCU、ログ料金を確認しているか |
| オリジン保護 | CloudFrontを迂回されない構成か |
| 緊急対応 | 一時的なAllow / Count変更手順があるか |
AWS WAF導入時によくある失敗は、Managed Rulesを一気にBlockで有効化してしまうことです。
これにより、正常なフォーム送信、ログイン、購入処理、API通信、管理画面操作がブロックされる可能性があります。
まずはCountで導入し、ログを確認してから段階的にBlockへ移行しましょう。
AWS WAFはPriority順にルールを評価します。
そのため、ルールの順番を間違えると、意図しないアクセスが許可されたり、逆に正常アクセスがブロックされたりします。
特に、自社IPのAllowルール、悪質IPのBlockルール、Managed Rules、Rate-based ruleの順番は慎重に設計する必要があります。
一般公開ページと管理画面では、防御方針が異なります。
一般公開ページでは、通常アクセスを許可しながら攻撃だけをブロックする構成が多いです。
一方、管理画面では、IP制限やVPN制限などを使ってアクセス元を絞るほうが安全です。
AWS WAFは、設定して終わりではありません。
ログを確認しながら、以下を継続的に見直します。
AWS WAFは強力な防御層ですが、アプリケーションのセキュリティ設計を代替するものではありません。
以下の対策も組み合わせる必要があります。
AWS WAFのWeb ACLは、Webアプリケーションに届くHTTP/HTTPSリクエストを検査し、許可・ブロック・カウント・CAPTCHA・Challengeなどの処理を行うための中心的な設定です。
CloudFront、ALB、API Gateway、AppSync、Cognito、App Runner、Amplify、Verified Accessなどに関連付けることで、WebアプリケーションやAPIをさまざまな攻撃から保護できます。
Web ACLを理解するうえで重要なのは、以下のポイントです。
実務では、まず以下の流れで導入すると安全です。
1. 保護対象を決める
2. Scopeを選ぶ
3. Default actionを決める
4. Managed RulesをCountで導入する
5. WAFログを確認する
6. 誤検知を調整する
7. 問題ないルールからBlockへ移行する
8. 定期的に見直す
AWS WAFのWeb ACLは、単にルールを追加するだけの機能ではありません。
Webアプリケーションの構成、アクセス傾向、管理画面の有無、APIの性質、運用体制、コストを踏まえて設計することで、より効果的なセキュリティ対策になります。
以上、AWS WAFのウェブACLについてでした。
最後までお読みいただき、ありがとうございました。