Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

AWS WAFで複数ステートメントからなる独自ルールを作成して特定ウェブリクエストをブロックする手順

はじめに

システム運用を行っていると、特定条件に当てはまったウェブリクエストのみ許可あるいは拒否したい等の要望が出てくることがあります。
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」をクリックします。
WebACL画面

②「Name」に「test」を入力、「Type」を「Regular rule」、全条件に一致した時のアクションとしたいので「matches all the statements(AND)」を選択します。
ルール追加-1

③条件:Refererヘッダーを含まない
「Negate statement results」にチェックを入れ、「Match type」に「Size Greater than」、「Size in bytes」は「0」にして下図のように指定します。
ルール追加-2

特定ヘッダーを含まない条件式は、以下を参考にさせていただきました。
AWS WAF を使用して、User-Agent ヘッダーを指定しない HTTP リクエストをブロックする | AWS re:Post

④条件:特定のUser-Agent(今回はTestを対象)
今回はUser-Agentが完全一致した場合として、「Match type」を「Exactly matches string」にして下図のように指定します。
ルール追加-3

⑤条件:特定のURIパス(今回は/test/配下を対象)
/test/から始まるURIを防ぎたいので、「Match type」を「Starts with string」にして下図のように指定します。
ルール追加-4

⑥「Action」を「Block」に選択して、「Save rule」をクリックします。
ルール追加-5

⑦今回はプライオリティが一番上になるように設定して完了です。
プライオリティ設定

動作確認

正常系確認

まずは正常系パターンで、以下のパターンに当てはまるリクエストが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されていることが確認できました。
SampledRequests画面

おわりに

以上、AWS WAFの複数ステートメントからなる独自ルールについて設定手順をまとめてみました。
メモ的な備忘でしたが、誰かのお役に立てばと思います。