はじめに
システム運用を行っていると、特定条件に当てはまったウェブリクエストのみ許可あるいは拒否したい等の要望が出てくることがあります。
AWS WAFの独自ルールで以下の条件すべてに当てはまるウェブリクエストをブロックする手順についてまとめてみたいと思います。
- Refererヘッダーを含まない
- 特定のUser-Agent(今回はTestを対象)
- 特定のURIパス(今回は/test/配下を対象)
その他、検査可能なウェブリクエストのコンポーネントは以下をご参照ください。
リクエストコンポーネントオプション - AWS WAF、AWS Firewall Manager、および AWS Shield Advanced
作成手順
①独自ルールの追加対象のWeb ACLを選択し「Rules」タブを選択、「Add rules」から「Add my own rules and rule groups」をクリックします。
②「Name」に「test」を入力、「Type」を「Regular rule」、全条件に一致した時のアクションとしたいので「matches all the statements(AND)」を選択します。
③条件:Refererヘッダーを含まない
「Negate statement results」にチェックを入れ、「Match type」に「Size Greater than」、「Size in bytes」は「0」にして下図のように指定します。
特定ヘッダーを含まない条件式は、以下を参考にさせていただきました。
AWS WAF を使用して、User-Agent ヘッダーを指定しない HTTP リクエストをブロックする | AWS re:Post
④条件:特定のUser-Agent(今回はTestを対象)
今回はUser-Agentが完全一致した場合として、「Match type」を「Exactly matches string」にして下図のように指定します。
⑤条件:特定のURIパス(今回は/test/配下を対象)
/test/から始まるURIを防ぎたいので、「Match type」を「Starts with string」にして下図のように指定します。
⑥「Action」を「Block」に選択して、「Save rule」をクリックします。
⑦今回はプライオリティが一番上になるように設定して完了です。
動作確認
正常系確認
まずは正常系パターンで、以下のパターンに当てはまるリクエストがAWS WAFでBlockされるか確認します。
- Refererヘッダーを含まない
- 特定のUser-Agent(今回はTestを対象)
- 特定のURIパス(今回は/test/配下を対象)
AWS WAFが通信をBlockし、「403 Forbidden」が表示※され、無事にBlockされました。
※AWS WAFのデフォルト動作がBlock時に「403 Forbidden」
$ curl -I -H "User-Agent: Test" https://<試験対象ドメイン>/test/ HTTP/1.1 403 Forbidden Server: CloudFront 以下省略
異常系確認
続いて異常系パターンで、以下のパターンに当てはまるリクエストがAWS WAFでBlockされない事を確認します。
リファラが指定されている場合はBlockされない事が確認できました。
「502 Bad Gateway」になっているのはウェブコンテンツを配置していないためで、きちんとウェブコンテンツを配置していれば「200 OK」が返ります。
$ curl -I -H "Referer: http://www.example.com/" -H "User-Agent: Test" https://<試験対象ドメイン>/test/ HTTP/1.1 502 Bad Gateway Content-Type: text/html 以下省略
User-Agentが一致しない場合もBlockされない事が確認できました。
$ curl -I -H "User-Agent: Test Bot" https://<試験対象ドメイン>/test/ HTTP/1.1 502 Bad Gateway Content-Type: text/html 以下省略
URIが一致しない場合もBlockされない事が確認できました。
$ curl -I -H "User-Agent: Test" https://<試験対象ドメイン>/test2/ HTTP/1.1 502 Bad Gateway Content-Type: text/html 以下省略
リクエストサンプリング確認
「Request sampling options」を「Enable」にしている場合(デフォルトDisable)は、以下のようにリクエストサンプリング画面から確認ができます。
マネジメントコンソールから、「AWS WAF」>「Web ACLs」>「試験対象のWeb ACL」の順に移動し、「Overview」タブの「Sampled requests」のプルダウンを今回作成した「test」にして確認します。
testルールでBlockされていることが確認できました。
おわりに
以上、AWS WAFの複数ステートメントからなる独自ルールについて設定手順をまとめてみました。
メモ的な備忘でしたが、誰かのお役に立てばと思います。