BLOG

2019/09/10

AWS WAF 解説 【第2回 Condition と Filter の関係性】

【目次】

  • はじめに
  • 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つでも満たすことが真となる条件となります。
    Filtersincondition

    ② Condition の評価
    Rule 内の Condition は AND 条件で評価されます。
    従って、Rule 内の Condition の全てが満たされることが真となる条件となります。
    Condition は “does match(一致する)” or “does not match(一致しない)”で指定します。
    Conditionsinrule

    ③ 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 に焦点を当てて活用例を含め、ご紹介していきますので、楽しみにしていてください。
     

    第3回:AWS WAF「String and regex matching の仕組みと活用例」