Web アプリケーション ファイアウォールの除外リスト
Azure Application Gateway Web アプリケーション ファイアウォール (WAF) では、Web アプリケーションの保護が提供されます。 この記事では、WAF 除外リストの構成について説明します。 これらの設定は、Application Gateway に関連付けられている WAF ポリシーに配置されています。 WAF ポリシーの詳細については、Azure Application Gateway 上の Azure Web アプリケーション ファイアウォールに関する記事、および「Application Gateway 用の Web アプリケーション ファイアウォール ポリシーの作成」を参照してください。
アプリケーションで許可される要求が WAF によってブロックされる場合があります。 WAF の除外リストを使用すると、WAF の評価から特定の要求属性を省略できます。 要求の残りの部分は通常として評価されます。
たとえば、Active Directory によって認証に使用されるトークンが挿入されます。 要求ヘッダーで使用される場合、これらのトークンには、WAF ルールに基づいて擬陽性検出をトリガーすることがある特殊文字が含まれる可能性があります。 除外リストにヘッダーを追加することで、ヘッダーを無視するように WAF を構成できますが、WAF は引き続き要求の残りの部分を評価します。
除外は、特定の WAF ルールが評価される際に適用されるように、またはすべての WAF ルールの評価にグローバルに適用されるように構成することができます。 除外ルールは、Web アプリケーション全体に適用されます。
除外する要求属性を識別する
WAF の除外を構成する場合は、WAF 評価から除外する必要がある要求の属性を指定する必要があります。 WAF の除外は、次の要求属性に対して構成できます。
- 要求ヘッダー
- 要求 Cookie
- 要求の属性名 (引数) は、次のような除外要素として追加できます。
- フォーム フィールド名
- JSON エンティティ
- URL クエリ文字列引数
要求ヘッダー、本文、cookie、またはクエリ文字列属性については完全一致を指定できます。 また、部分一致を指定することも可能です。 除外を構成するには、次の演算子を使用します。
- Equals: この演算子は完全一致の場合に使用されます。 たとえば、bearerToken という名前のヘッダーを選択した場合は、bearerToken として設定されるセレクターで equals 演算子を使用します。
- Starts with:この演算子は指定したセレクター値で始まるすべてのフィールドと一致します。
- Ends with: この演算子は指定したセレクター値で終わるすべての要求フィールドと一致します。
- Contains:この演算子は指定したセレクター値を含むすべての要求フィールドと一致します。
- Equals any:この演算子は、すべての要求フィールドと一致します。 * はセレクター値になります。 たとえば、特定の一致変数の正確な値がわからないが、要求トラフィックがルールの評価から引き続き除外されるようにする場合に、この演算子を使用します。
除外の処理には、WAF エンジンが次の表に基づいて大文字と小文字を区別する、または区別しない一致検索を実行します。 なお、セレクターに正規表現は使用できません。XML 要求本文はサポートされていません。
要求本文 | CRS 3.1 以前 | CRS 3.2 以降 |
---|---|---|
ヘッダー* | 大文字と小文字の区別をしない | 大文字と小文字の区別をしない |
Cookie* | 大文字と小文字の区別をしない | 大文字と小文字の区別 |
クエリ文字列* | 大文字と小文字の区別をしない | 大文字と小文字の区別 |
URL エンコードされた本文 | 大文字と小文字の区別をしない | 大文字と小文字の区別 |
JSON 本文 | 大文字と小文字の区別をしない | 大文字と小文字の区別 |
XML 本文 | サポートされていません | サポートされていません |
マルチパート本文 | 大文字と小文字の区別をしない | 大文字と小文字の区別 |
*お使いのアプリケーションによって、ヘッダー、Cookie、クエリ引数の名前と値に対して、大文字と小文字が区別される場合と区別されない場合があります。
Note
詳細とトラブルシューティング ヘルプについては、「WAF トラブルシューティング」を参照してください。
キーと値による要求属性
除外を構成する場合は、キーまたは値を WAF 評価から除外するかどうかを決定する必要があります。
たとえば、要求に次のヘッダーが含まれているとします。
My-Header: 1=1
ヘッダーの値 (1=1
) は、WAF による攻撃として検出される可能性があります。 ただし、これがシナリオの正当な値であることがわかっている場合は、ヘッダーの "値" に対して除外を構成できます。 これを行うには、RequestHeaderValues 一致変数、演算子 contains、セレクター (My-Header
) を使用します。 この構成では、ヘッダー My-Header
のすべての値の評価が停止されます。
注意
キーと値による要求属性は、CRS 3.2 以降と Bot Manager 1.0 以降でのみ使用できます。
名前による要求属性は、値による要求属性と同じように機能し、CRS 3.1 以前のバージョンとの下位互換性のために装備されています。 名前による属性ではなく、値による要求属性を使用することをお勧めします。 たとえば、RequestHeaderNames ではなく RequestHeaderValues を使用します。
これに対し、WAF がヘッダーの名前 (My-Header
) を攻撃として検出した場合は、RequestHeaderKeys 要求属性を使用してヘッダーの "キー" に対する除外を構成できます。 RequestHeaderKeys 属性は、CRS 3.2 以降と Bot Manager 1.0 以降でのみ使用できます。
要求属性の例
次の表は、特定の一致変数の除外を構造化する方法の例を示しています。
除外する属性 | matchVariable | selectorMatchOperator | セレクターの例 | 要求の例 | 除外対象 |
---|---|---|---|---|---|
クエリ文字列 | RequestArgKeys | 等しい | /etc/passwd |
Uri: http://localhost:8080/?/etc/passwd=test |
/etc/passwd |
クエリ文字列 | RequestArgKeys | EqualsAny | 該当なし | Uri: http://localhost:8080/?/etc/passwd=test&.htaccess=test2 |
/etc/passwd および .htaccess |
クエリ文字列 | RequestArgNames | 等しい | text |
Uri: http://localhost:8080/?text=/etc/passwd |
/etc/passwd |
クエリ文字列 | RequestArgNames | EqualsAny | 該当なし | Uri: http://localhost:8080/?text=/etc/passwd&text2=.cshrc |
/etc/passwd および .cshrc |
クエリ文字列 | RequestArgValues | 等しい | text |
Uri: http://localhost:8080/?text=/etc/passwd |
/etc/passwd |
クエリ文字列 | RequestArgValues | EqualsAny | 該当なし | Uri: http://localhost:8080/?text=/etc/passwd&text2=.cshrc |
/etc/passwd および .cshrc |
要求本文 | RequestArgKeys | Contains | sleep |
要求本文: {"sleep(5)": "test"} |
sleep(5) |
要求本文 | RequestArgKeys | EqualsAny | 該当なし | 要求本文: {".zshrc": "value", "sleep(5)":"value2"} |
.zshrc および sleep(5) |
要求本文 | RequestArgNames | 等しい | test |
要求本文: {"test": ".zshrc"} |
.zshrc |
要求本文 | RequestArgNames | EqualsAny | 該当なし | 要求本文: {"key1": ".zshrc", "key2":"sleep(5)"} |
.zshrc および sleep(5) |
要求本文 | RequestArgValues | 等しい | test |
要求本文: {"test": ".zshrc"} |
.zshrc |
要求本文 | RequestArgValues | EqualsAny | 該当なし | 要求本文: {"key1": ".zshrc", "key2":"sleep(5)"} |
.zshrc および sleep(5) |
Header | RequestHeaderKeys | 等しい | X-Scanner |
ヘッダー: {"X-Scanner": "test"} |
X-scanner |
Header | RequestHeaderKeys | EqualsAny | 該当なし | ヘッダー: {"X-Scanner": "test", "x-ratproxy-loop": "value"} |
X-Scanner および x-ratproxy-loop |
Header | RequestHeaderNames | 等しい | head1 |
ヘッダー: {"head1": "X-Scanner"} |
X-scanner |
Header | RequestHeaderNames | EqualsAny | 該当なし | ヘッダー: {"head1": "myvar=1234", "User-Agent": "(hydra)"} |
myvar=1234 および (hydra) |
Header | RequestHeaderValues | 等しい | head1 |
ヘッダー: {"head1": "X-Scanner"} |
X-scanner |
Header | RequestHeaderValues | EqualsAny | 該当なし | ヘッダー: {"head1": "myvar=1234", "User-Agent": "(hydra)"} |
myvar=1234 および (hydra) |
クッキー | RequestCookieKeys | Contains | /etc/passwd |
ヘッダー: {"Cookie": "/etc/passwdtest=hello1"} |
/etc/passwdtest |
クッキー | RequestCookieKeys | EqualsAny | 該当なし | ヘッダー: {"Cookie": "/etc/passwdtest=hello1", "Cookie": ".htaccess=test1"} |
/etc/passwdtest および .htaccess |
クッキー | RequestCookieNames | 等しい | arg1 |
ヘッダー: {"Cookie": "arg1=/etc/passwd"} |
/etc/passwd |
クッキー | RequestCookieNames | EqualsAny | 該当なし | ヘッダー: {"Cookie": "arg1=/etc/passwd", "Cookie": "arg1=.cshrc"} |
/etc/passwd および .cshrc |
クッキー | RequestCookieValues | 等しい | arg1 |
ヘッダー: {"Cookie": "arg1=/etc/passwd"} |
/etc/passwd |
クッキー | RequestCookieValues | EqualsAny | 該当なし | ヘッダー: {"Cookie": "arg1=/etc/passwd", "Cookie": "arg1=.cshrc"} |
/etc/passwd および .cshrc |
Note
selectorMatchOperator EqualsAny
を使用して除外を作成すると、セレクター フィールドに入力した内容は、除外の作成時にバックエンドによって "*" に変換されます。
スコープの除外
除外は、特定の WAF ルールのセット、ルールセット、またはすべてのルール全体でグローバルに適用するように構成できます。
ヒント
攻撃者がシステムを悪用する余地を誤って残さないように、除外を可能な限り絞り込んで特定することをお勧めします。 除外ルールを追加する必要がある場合は、可能な限りルールごとの除外を使用します。
ルールごとの除外
特定のルール、ルールのグループ、またはルール セットの除外を構成できます。 除外対象のルールを指定する必要があります。 WAF 評価から除外する必要がある要求属性も指定する必要があります。 ルールの完全なグループを除外するには、ruleGroupName
パラメーターのみを指定します。rules
パラメーターは、除外をグループの特定のルールに制限する場合にのみ役立ちます。
ルールごとの除外は、OWASP (CRS) ルールセット バージョン 3.2 以降または Bot Manager ルールセット バージョン 1.0 以降を使用する場合に使用できます。
例
WAF で要求ヘッダー User-Agent
の値を無視するとします。 ヘッダー User-Agent
には、ネットワーク プロトコル ピアが、要求側のソフトウェア ユーザー エージェントのアプリケーションの種類、オペレーティング システム、ソフトウェア ベンダー、またはソフトウェア バージョンを識別するための文字列が含まれます。 詳細については、「User-Agent」をご覧ください。
このヘッダーの評価を無効にする理由はいくつもあります。 WAF によって検出され、悪意があると仮定されている文字列がある可能性があります。 たとえば、ヘッダー User-Agent
には、文字列にクラシック SQL インジェクション攻撃 x=x
が含まれる場合があります。 場合によっては、これは正当なトラフィックに指定できます。 したがって、このヘッダーを WAF 評価から除外する必要が生じることがあります。
次の方法を使用して、すべての SQL インジェクション ルールによってヘッダー User-Agent
を評価から除外できます。
Azure portal を使用してルールごとの除外を構成するには、次の手順に従います。
WAF ポリシーに移動し、[マネージド ルール] を選択します。
[除外の追加] を選択します。
[適用対象] で、除外を適用する CRS ルール セット (OWASP_3.2 など) を選択します。
[ルールの追加] を選択し、除外を適用するルールを選択します。
一致変数、演算子、セレクターを構成します。 次に、 [保存] を選択します。
複数の除外を構成できます。
ルール 942270 だけで、評価から User-Agent
ヘッダーを除外することもできます。
前の例で説明されている手順に従い、手順 4 でルール 942270 を選択します。
グローバル除外
すべての WAF ルールに適用するように除外を構成できます。
例
この例では、URL を介して要求に渡される "user" パラメーターの値を除外します。 たとえばお使いの環境で、WAF が悪意のあるコンテンツと見なし、ブロックしている文字列が user
クエリ文字列引数に含まれていることがよくあるとします。 WAF がフィールドの値を評価しないように、名前が user
から始まるすべてのクエリ文字列引数を除外できます。
次の例は、クエリ文字列引数 user
を評価から除外する方法を示しています。
Azure portal を使用してグローバルの除外を構成するには、次の手順に従います。
WAF ポリシーに移動し、[マネージド ルール] を選択します。
[除外の追加] を選択します。
[適用対象] で、[グローバル] を選択します。
一致変数、演算子、セレクターを構成します。 次に、 [保存] を選択します。
複数の除外を構成できます。
したがって、URL http://www.contoso.com/?user%3c%3e=joe
が WAF によってスキャンされた場合、文字列 joe は評価されませんが、パラメーター名 user%3c%3e は引き続き評価されます。
次のステップ
- ご自分の WAF 設定を構成したら、その WAF ログを表示する方法を学習できます。 詳細については、Application Gateway の診断に関するトピックを参照してください。
- Azure ネットワーク セキュリティの詳細を確認する