【目次】
- はじめに
- AWS WAFの Condition と Filter の関係性
- Condition の種類と利用可能な Filter の組み合わせ
- Filter で使用される各項目の詳細
- AWS WAF ルール動作
- 運用を想定した AWS WAF ルールサンプル
- おわりに
■ はじめに
連載第2回はCondition と Filter の関係性について解説していきます。
まだ第1回の 【AWS WAF 基本構造編】に関するブログをご覧になっていない方は、そちらをご一読いただいた後に本ブログを読んでいただけますと、より理解していただけます。
第1回:AWS WAF 「基本構造編」
第2回:AWS WAF 「Condition と Filter の関係性」(本記事)
第3回:AWS WAF 「String and regex matching の仕組みと活用例」
■ AWS WAF の Condition と Filter の関係性
Condition は AWS WAF でリクエストを許可または拒否する為の条件となります。具体的な文字列マッチ条件や検査を実施する箇所等の詳細をFilterを使用して設定していきます。
■ Condition の種類と利用可能な Filter の組み合わせ
Condition | 利用可能な Filter |
クロスサイトスクリプト一致条件 悪意のあるスクリプトが含まれている可能性があるかどうかに基づいてリクエストを許可または拒否する条件 |
・Part of the request to filter on ・Transformation |
IP 一致条件 送信元の IP アドレスに基づいてリクエストを許可または拒否する条件 |
・IP addresses |
Geo (Geographic) 一致条件 送信元の国に基づいてリクエストを許可または拒否する条件 |
・Location type |
サイズ制約条件 指定した長さを超えているかどうかに基づいてリクエストを許可または拒否する条件 |
・Part of the request to filter on ・Size ・Comparison operator ・Transformation |
SQL インジェクション一致条件 悪意のある SQL コードが含まれている可能性があるかどうかに基づいてリクエストを許可または拒否する条件 |
・Part of the request to filter on ・Transformation |
文字列一致条件 含まれている文字列に基づいてリクエストを許可または拒否する条件 |
・Part of the request to filter on ・Transformation ・Match type ・Value to match |
正規表現一致条件 リクエストに含まれる正規表現パターンと一致する文字列に基づいてリクエストを許可または拒否する条件 |
・Part of the request to filter on ・Transformation ・Regex patterns to match to request |
IP 一致条件とGeo (Geographic) 一致条件に関しては分かりやすいものでIPアドレスや国での制御となります。その他は該当条件をどことマッチするかを Filter で指定します。Filterで使用される各項目の詳細を確認していきましょう。
■ Filter で使用される各項目の詳細
1. Part of the request to filter on
2. Transformation
3. IP addresses
4. Location type
5. Size (Bytes)
6. Comparison operator
7. Match type
8. Value to match
9. Regex patterns to match to request
1. Part of the request to filter on
HTTP リクエストの中で 検査する箇所を以下より設定します。
種類 | 意味 |
Header | User-Agent などのHTTPヘッダ部分 |
HTTP method | GET, POST などの HTTP メソッド部分 |
Query string | URL のうち、?以降の部分 ?aaa=恵比寿(東京)&bbb=横浜 |
Single query parameter (value only) | Query string のうち、1つのパラメータ部分 ?aaa=恵比寿(東京)&bbb=横浜 |
All query parameters (values only) | Query string のうち、全てのパラメータ部分 ?aaa=恵比寿(東京)&bbb=横浜 |
URI | URL のうちリソースを識別する部分 |
Body | HTTP リクエストの本文 |
※攻撃者がクエリ内やボディ内や特定ヘッダ等様々な箇所に攻撃を仕掛けてくることがあります。攻撃が成立するかは別の問題ですが不審なアクセスを実施していることは間違いないため複数個所指定することが望ましいです。
2. Transformation
WAF で検査する前に実施するデコードなどの処理を以下より設定します。
種類 | 意味 |
None | 処理なし |
Convert to lowercase | 小文字への変換処理 |
HTML decode | HTML デコード処理 |
Normalize whitespace | 改行やタブなどを空白文字に変換する処理 |
Simplify command line | \ ” ‘ ^の削除や, ;の空白文字への置換をする処理 |
URL decode | URLデコード処理 |
3. IP addresses
IP addresses Condition に利用するIP アドレス範囲を CIDR 表記で設定します。
※注意点は以下の制限になります。
AWS WAF は IPv4 アドレス範囲: /8、および /16 から /32 までの範囲をサポートしています。AWS WAF は IPv6 アドレス範囲: /24、/32、/48、/56、/64、および /128 をサポートしています。
4. Location type
Geo match Condition に利用しますが、現状 Country のみが選択できます。
5. Size (Bytes)
Size constraints Condition で利用します。
WAF で監視するクエリ文字列の長さ (バイト単位) を設定します。
6. Comparison operator
Size constraints Condition で利用します。
Size (Bytes) で設定する閾値に対しての比較演算子を以下より設定します。
種類 | 意味 |
Equals | Size (Bytes) で設定した値と等しい |
Not equal | Size (Bytes) で設定した値と等くない |
Greater than | Size (Bytes) で設定した値より大きい |
Greater than or equal | Size (Bytes) で設定した値以上 |
Less than | Size (Bytes) で設定した値より小さい |
Less than or equal | Size (Bytes) で設定した値以下 |
7. Match type
String Match Condition で利用し、Match させる文字列が
「Part of the request to filter on」の中で存在する場所を設定します。
種類 | 意味 |
Contains | 任意の場所に存在 |
Exactly matches | 完全一致で存在 |
Starts with | 先頭に存在 |
Ends with | 末尾に存在 |
Contains word | 英数字および_のみが対象で任意の場所 |
※URIで言えば特定の拡張子を指定したり、一部パス(/wp-admin/)で始まる等を指定することが出来ます。
8. Value to match
WAF が HTTP リクエスト内で検索する値を設定します。
※文字列一致条件の最大長は 50 バイトで正規表現一致条件は70バイトとなります。
9. Regex patterns to match to request
WAF が HTTP リクエスト内で検索する正規表現のパターンを設定します。
公式情報は以下を参照してください。
ウェブアクセスコントロールリスト (ウェブ ACL) の作成と設定
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/web-acl.html
■ AWS WAF ルール動作
ここまでで、各要素の理解ができました、最後にAWS WAFのルール動作を確認しましょう。
AWS WAF のルールは、① Filter を評価し、② Condition を評価し、③ 最後に Action を実行します。
ConditionとFilterでOR 条件かAND 条件かが変わります。
順番によって挙動も変わりますので注意してください。
① Filter の評価
Condition 内の Filter は OR 条件で評価されます。
従って、Condition 内の Filter のどれか1つでも満たすことが真となる条件となります。
② Condition の評価
Rule 内の Condition は AND 条件で評価されます。
従って、Rule 内の Condition の全てが満たされることが真となる条件となります。
Condition は “does match(一致する)” or “does not match(一致しない)”で指定します。
③ Action の実行
Rule が True の場合に Action(Allow, Block, Count) を実行します。
Rule は Order 順に評価され、True があった時点で評価終了します。
ActionがCountの場合は次のルールに進みます。
どの Rule にも マッチしなかった場合、Default Action(Allow, Block)を実行します。
Default Actionは基本的にAllowにしていないと通信が止まる恐れがありますのでご注意ください。
■ 運用を想定した AWS WAF ルールサンプル
これまでの説明をふまえて、実際に運用可能なルールのサンプルを作りました。
上記ルール構成例
1.ホワイトリスト(Allow)
管理者作業を実施する拠点等の信頼できる接続元を登録する。
あまりにも広すぎる登録(日本のIPアドレス等)は万が一を考え避ける。
2.ブラックリスト(Block)
無駄にリソースを消費して、ブロックしても何度もアクセスが来るようなIPアドレスを登録する。WHOISで念のため情報を確認する。クライアントがほぼ日本であれば海外からのアクセスの遮断も検討する
3.サイズが大きい不審なアクセスを捕捉(Count)
サイトのつくりにもよりますが、あまりにも大きいサイズは攻撃コードが含まれている可能性もあり、不審なアクセスである可能性があるので後で確認できるようにカウントで検知
4.SQLインジェクション(Block)
1.HTMLデコードしたボディ内で検知
2.URLデコードしたボディ内で検知
3.HTMLデコードしたクエリ内で検知
4.URLデコードしたクエリ内で検知
5.URLデコードしたURI内で検知
5.クロスサイトスクリプティング(Block)
1.HTMLデコードしたボディ内で検知
2.URLデコードしたボディ内で検知
3.HTMLデコードしたクエリ内で検知
4.URLデコードしたクエリ内で検知
5.URLデコードしたURI内で検知
ルール枠は残しておいた方が緊急時に除外設定する等で使用できます。予算に余裕があるようであればマネージドルールで枠を一つ使用することもおすすめです。
■ おわりに
AWS WAF のCondition と Filter に関して理解できましたでしょうか。
Condition と Filter を使いこなすことができれば、AWS WAF で様々な攻撃を自身の手で防ぐことが可能です!
次回は、String and regex matching に焦点を当てて活用例を含め、ご紹介していきますので、楽しみにしていてください。