AWS WAFの評価ロジックを整理する
AWS WAFの概要
[参考]
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)による評価順序
- 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
このうち Allowと Blockは「終了アクション」であり、この時点でアプリケーションへのリクエストを許可またはブロックする。
Countはリクエストをカウントするのみで許可/ブロックを決定しない「非終了アクション」で残りのルールの処理を継続する。
CAPTCHAおよびChallengeはリクエストがbotではない(人間である)ことを確認し、トークンを発行する「非終了アクション」である。ただしトークンが向こう・期限切れの場合はBloclアクションと同様に「終了」する。(トークンが有効であればWAFの処理を継続する)
- デフォルトアクション
WebACLで必ずデフォルトアクションを設定する。
WebACLのルール評価をすべて通過したリクエストにこのデフォルトアクションが適用される。
デフォルトアクションは「終了アクション」であるべき=AllowまたはBlockを設定する。
つまり
リクエストを以下のように評価してAllow/Blockを決定する。
例えば
「あるパスパターンのみアクセスを許可 かつ あるIPアドレスからのみアクセスを許可」したい場合
-
パターン1
- デフォルトアクション: Block
- [priority: 0] あるパスパターン 以外をBlock
- [priority: 1] あるIPアドレス だったらAllow
-
パターン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の役割・機能や"できること"についても様々な側面からまた理解を深めていきたいと思います。
Discussion