👻

AWS WAFの評価ロジックを整理する

2024/08/31に公開

AWS WAFの概要

[参考]
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/what-is-aws-waf.html

AWS WAFとは

AWS WAF は、保護されたウェブアプリケーションリソースに転送される HTTPおよび HTTPSリクエストをモニタリングできるウェブアプリケーションファイアウォールです。

AWS WAFの保護対象リソース

  • Amazon CloudFront ディストリビューション
  • Amazon API Gateway REST API
  • Application Load Balancer
  • AWS AppSync GraphQL API
  • Amazon Cognito ユーザープール
  • AWS App Runner サービス
  • AWS Verified Access インスタンス

WAFの構成要素

  • WebACL
    リソースを保護する実体。WebACLにルールを追加することで保護戦略を定義。WebACL自体はAWSにおける「リソース」
  • ルール
    WebACLに追加するルール。
    リクエストの何をどう見るかという検査基準を定義するステートメントと、その結果リクエストをどうするかのアクションを含む。これ自体はリソースではない
  • ルールグループ
    WebACLに追加できる再利用可能なルールのセット。これは「リソース」

WebACLを使用してリソースを保護。
ルールをWebACLまたはルールグループに追加。
ルールグループは任意のWebACLに追加。

評価ロジック

優先順位(priority)による評価順序

https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/web-acl-processing-order.html

  • WebACLに追加された単独のルールとルールグループを評価する。
  • ルールグループに追加されたルールはそのグループ内で順序が決まる。
  • Rule1 — 優先度 0
  • RuleGroupA — 優先度 100
    • RuleA1 – 優先度 10,000
    • RuleA2 – 優先度 20,000
  • Rule2 — 優先度 200
  • RuleGroupB — プライオリティ 300
    • RuleB1 – 優先度 0
    • RuleB2 – 優先度 1

この場合は以下の順序で評価される。

Rule1
RuleGroupルール A1
RuleGroupルール A2
Rule2
RuleGroupB ルール B1
RuleGroupB ルール B2

アクションによる処理

アクションには以下の4つがある。

  • Allow
  • Block
  • Count
  • CAPTCHAおよびChallenge

このうち AllowBlockは「終了アクション」であり、この時点でアプリケーションへのリクエストを許可またはブロックする。
Countはリクエストをカウントするのみで許可/ブロックを決定しない「非終了アクション」で残りのルールの処理を継続する。
CAPTCHAおよびChallengeはリクエストがbotではない(人間である)ことを確認し、トークンを発行する「非終了アクション」である。ただしトークンが向こう・期限切れの場合はBloclアクションと同様に「終了」する。(トークンが有効であればWAFの処理を継続する)

  • デフォルトアクション
    WebACLで必ずデフォルトアクションを設定する。
    WebACLのルール評価をすべて通過したリクエストにこのデフォルトアクションが適用される。
    デフォルトアクションは「終了アクション」であるべき=AllowまたはBlockを設定する。

つまり

リクエストを以下のように評価してAllow/Blockを決定する。
waf_logic

例えば

「あるパスパターンのみアクセスを許可 かつ あるIPアドレスからのみアクセスを許可」したい場合

  1. パターン1

    • デフォルトアクション: Block
    • [priority: 0] あるパスパターン 以外をBlock
    • [priority: 1] あるIPアドレス だったらAllow
  2. パターン2

    • デフォルトアクション: Allow
    • [priority: 0] あるパスパターン 以外をBlock
    • [priority: 1] あるIPアドレス 以外をBlock

【※想定通りにならないパターン】
WAFの評価ロジックを理解できていなかった時、以下のように実装して想定通りの挙動をしませんでした。

  • デフォルトアクション: Block
  • [priority: 0] あるパスパターン だったらAllow
  • [priority: 1] あるIPアドレス だったらAllow

この実装だと、「Allow」=「終了アクション」であるためpriority: 0の「あるパスパターンに当てはまった時点」でリクエストを許可して次のIPアドレスの評価を行いません。

まとめ

AWS WAFを用いてリクエストの制限を行う際にWebACLの評価ロジック・アクションの挙動を整理できていることで想定通りの実装をすることができました。
今回は特定の要件に基づくシンプルなリクエスト制限について整理しましたが、AWS WAFの役割・機能や"できること"についても様々な側面からまた理解を深めていきたいと思います。

GitHubで編集を提案
Fusic 技術ブログ

Discussion