連鎖ルール内のルールの設定

鎖ルールは追加、編集、削除、そして複製が可能です。 ルールとは、着信または発信 HTTP(S) トラフィックに対して確認される条件です。 それぞれの連鎖ルールは、1つ以上の設定されたルールを持つことができ、使用する前に最低1つのルールを持つ必要があります。

Figure 12:45 ルールの追加ページ

WAF_rules_add_rule_tips.jpg

 

ルールにより、管理者は肯定セキュリティ モデルと否定セキュリティ モデルの両方を利用できます。 肯定セキュリティ モデルでは、ポリシーは許可する既知のトラフィックのみで記述され、それ以外すべてを遮断します。

ルールには、いくつかの構成要素があります。

• 変数 - これらは、正当または不正なトラフィックを区別する支援をする、ウェブ アプリケーション ファイアウォールによって走査されるHTTPプロトコルのエンティティです。 複数の変数を「値」 フィールド内に設定された値に対して照合することができます。 ’+’ と’-’ ボタンにより、「変数」 ドロップダウン リストから変数を追加する、また、それらを選択済み変数のリストから削除することができます。 指定した値と照合することを要求するために、複数の変数を結合させることができます。 複数の変数が設定された場合は、ルールは設定した変数のうちのどれか1つが対象の値に一致するかどうか照合されます。 変数の詳細情報については、変数について を参照してください。

• 演算子 - これらは、計算および文字列演算子です。 「否定」 チェックボックスは、設定した条件を除いたどんな値にも一致させるために使われる、逆演算子です。演算子の詳細情報については、演算子について を参照してください。

• 値 - このエンティティには数字、そのままの文字、または正規表現が使用可能で、走査される対象と比較されます。 これは、指定された演算子に従って、設定された変数の値と比較されます。

• 2つ以上の値と変数を比較するために、複数の値を 「値」 フィールドに空白で区切って入力して、「キーワード一致」 演算子を選択できます。 「キーワード一致」 演算子を選択した場合は、空白区切りのみ動作します。

• 回避対策 - このフィールドにより、特に回避対策の強化を目的とした、「演算子」フィールドによってサポートされている以上の対策を適用できます。これらの対策の詳細については、回避対策についてを参照してください。

以下のセクションで、ルールについての詳細情報を提供します。

ヒント/ヘルプ サイドバーについて

変数について

演算子について

回避対策について

ルールのユースケース例

ルールの削除

ルールの複製

ルールの追加と編集

ヒント/ヘルプ サイドバーについて

「変数」 ドロップダウン リストで変数を選択することで、その変数に関する詳細情報を、「ヒント/ヘルプ」 サイドバーに表示することができます。 このサイドバーは、それぞれの変数がいつ使用されて、HTTPプロトコルのどこで見つけられるかを説明します。

「回避対策」ドロップダウン リストの項目も、選択すると詳細情報が「ヒント / ヘルプ」サイドバーに表示されます。

このサイドバーはまた、状況感知検索を提供します。 変数を選択してから、特定のキーワードを検索すると、検索結果は変数に関連するものだけになります。

変数について

変数は、正当または不正なトラフィックを区別する支援をする、ウェブ アプリケーション ファイアウォールによって走査されるHTTPプロトコルのエンティティです。 複数の変数を「値」 フィールド内に設定された値に対して照合することができます。 ’+’ と’-’ ボタンにより、「変数」 ドロップダウン リストから変数を追加する、また、それらを選択済み変数のリストから削除することができます。

指定した値と照合することを要求するために、複数の変数を結合させることができます。 複数の変数が設定された場合は、ルールは設定した変数のうちのどれか1つが対象の値に一致するかどうか照合されます。

変数は、単一の値または集合で表現できます。 変数を 「パラメータ値」 のような集合で表現した場合は、集合内の特定の変数を、その名前を選択用テキストボックスに入力して コロン(:)の右側に付加することによって設定できます。 例えば、「URI」 または 「ホスト」 変数に対する値は各HTTP(S)要求内で一意です。 そのような変数に対しては、選択用テキストボックスは表示されません。 「要求ヘッダ値」 や 「応答ヘッダ名」 といったその他の変数は、集合を表現します。

集合自身を入力に対して試験する必要がある場合は、選択用テキストボックスを空のままにします。 しかしながら、集合内の特定項目の値を検索する必要がある場合は、選択用テキストボックスにその項目を指定します。 例えば、HTTP(S)要求内に password パラメータが存在するかどうかを試験する必要がある場合は、「パラメータ名」 変数を設定して、選択用テキストボックスを空のままにします。 「演算子」 を「文字列一致」 に、そして「値」 を password に設定します。 しかし、このpassword パラメータの値が特定の文字列 (例えば”foo”) と一致しているかどうかを確認したい場合は、「パラメータ値」 変数を選択して、選択用テキストボックスにpassword を設定します。 そして「値」 フィールドに foo を設定します。

Table 16 ルール内で使用される変数

変数名

集合

説明

ホスト

いいえ

HTTP 要求のホスト ヘッダ内のホスト名または IP アドレスを指します。一般的には、ブラウザのアドレス バー内の URL のホスト部分を指します。

URI

いいえ

URL 内のパスとクエリ引数の組み合わせを指します。

HTTP メソッド

いいえ

ブラウザがウェブ サーバのリソースを要求するために使用する GET や POST などのメソッドを指します。

HTTP 状況コード

いいえ

ウェブ サーバからの応答の状況を指します。ウェブ サーバからの様々なエラー コードに対する動作を設定するために、これを使用できます。

パラメータ値

はい

すべてのクエリ引数と現在の要求の一部であるフォーム パラメータの値を含む、すべての要求パラメータ値の集合を指します。

パラメータ値の個数のような、パラメータ値のリスト全体の状況に対して照合するには、選択フィールドを空のままにします。

特定のパラメータの値に対して照合するには、パラメータの名前を選択フィールドに指定してコロンの右側に付加します。

パラメータ名

はい

すべてのクエリ引数と現在の要求の一部であるフォーム パラメータの値を含む、すべての要求パラメータ名の集合を指します。

パラメータ名のリスト全体の状況に対して照合するには、選択フィールドを空のままにします。

特定のパラメータの名前に対して照合するには、パラメータの名前を選択フィールドに指定してコロンの右側に付加します。

リモート アドレス

いいえ

クライアントの IP アドレスを指します。この値により、特定の IP アドレスからのアクセスを許可または遮断することができます。

要求ヘッダ値

はい

現在の要求に対するすべての HTTP(S) 要求ヘッダ値の集合を指します。

要求ヘッダ値のリスト全体の状況に対して照合するには、選択フィールドを空のままにします。

特定のヘッダ値に対して照合するには、ヘッダの名前を選択フィールドに指定してコロンの右側に付加します。

例えば、Ajax 要求を遮断するには、「変数」として「要求ヘッダ値」を選択し、選択テキスト ボックスに「X-Request-With」を指定し、「値」フィールドに「ajax」と入力します。

要求ヘッダ名

はい

現在の要求に対するすべての HTTP(S) 要求ヘッダ名の集合を指します。

要求ヘッダ名のリスト全体の状況に対して照合するには、選択フィールドを空のままにします。

特定のヘッダ名に対して照合するには、ヘッダの名前を選択フィールドに指定してコロンの右側に付加します。

例えば、信頼済みホストから参照されたものではない要求を遮断するには、「変数」として「要求ヘッダ名」を選択し、選択テキスト ボックスに「Referer」を指定し、「値」フィールドに信頼済みホストのホスト名または IP アドレスを入力し、「否定」チェックボックスをオンにして、「キーワード一致」演算子を選択します。

応答ヘッダ値

はい

現在の要求に対するすべての HTTP(S) 応答ヘッダ値の集合を指します。

応答ヘッダ値のリスト全体の状況に対して照合するには、選択フィールドを空のままにします。

特定のヘッダ値に対して照合するには、ヘッダの名前を選択フィールドに指定してコロンの右側に付加します。

応答ヘッダ名

はい

現在の要求に対するすべての HTTP(S) 応答ヘッダ名の集合を指します。

応答ヘッダ名のリスト全体の状況に対して照合するには、選択フィールドを空のままにします。

特定のヘッダ名に対して照合するには、ヘッダの名前を選択フィールドに指定してコロンの右側に付加します。

応答コンテンツ長

いいえ

応答ペイロードのサイズを指します。

応答ペイロード

いいえ

ユーザに表示されるウェブ ページの内容を指します。

ポータル ホスト名

いいえ

クライアントからの要求を受け付ける SRA ポータルの仮想ホスト名を指します。

特定の仮想ホストに適用する連鎖ルールを作成するには、1 つのルールはホストと一致するようにして、もう 1 つに照合するための別の条件を指定します。

ポータル アドレス

いいえ

クライアントからの要求を受け付ける SRA ポータルの IP アドレスまたは仮想 IP アドレスを指します。

要求パス

いいえ

ウェブ サイトの特定のリソースにアクセスするための相対パスを指します。

演算子について

多くの計算および文字列演算子があります。 「否定」 チェックボックスは、設定した条件を除いたどんな値にも一致させるために使われる、逆演算子です。

これらの演算子は、「回避対策」と組み合わせて使用できます。例えば、「文字列一致」演算子を、「回避対策」内の「小文字変換」または「URI パスの正規化」とともに使うことができます。

表 2 で、ルールで使用することができる演算子を説明します。

Table 17 ルールの演算子

演算子

種別

説明

部分一致

文字列

走査した変数の 1 つ以上が 「値」 フィールドの内容を含みます。

文字列一致

文字列

走査した変数が 「値」 フィールド内の英数字文字列と完全一致します。

=

計算

走査した変数が 「値」 フィールドの内容と同値です。

>

計算

走査した変数が 「値」 フィールドの内容を超えます。

>=

計算

走査した変数が 「値」 フィールドの内容以上です。

<

計算

走査した変数が 「値」 フィールドの内容未満です。

<=

計算

走査した変数が 「値」 フィールドの内容以下です。

キーワード一致

文字列

走査した変数の 1 つ以上が 「値」 フィールド内のキーワードの 1 つに一致します。 複数のキーワードを指定する場合は、空白で区切る必要があります。

正規表現一致

文字列

走査した変数の 1 つ以上が 「値」 フィールド内の正規表現に一致します。 例えば、4 文字の十進数を照合する正規表現は、\d{4} です。

回避対策について

回避対策は、入力が指定された値に対して照合される前に、選択された変数によって特定された入力に適用されます。例えば、「文字列長」の対策を使用すると、一致した入力の長さを計算して、それを比較に使うことができます。ウェブ アプリケーション ファイアウォールのルールをバイパスするために入力をエンコードしようとする、ハッカーの企てを阻止するために使われる回避対策もあります。リストの中の回避対策を選択すると、その対策に関する詳細情報が「ヒント / ヘルプ」サイドバーに表示されます。

回避対策は、通常の演算子と組み合わせて使用できます。「回避対策」フィールドでは、入力をそのままにする「なし」の対策を含む、10 種類の対策が選択できます。

複数の回避対策を同時に選択して個々に適用することができます。Ctrl キーを押しながら次の対策を選択することで、複数の対策が選択できます。ルール内で「なし」の対策をその他の対策と同時に選択した場合は、入力はそのままの状態で比較され、また、別の対策によってデコードまたは変換された後にも比較されます。Table 18 に、ルールで使用できる回避対策の説明を示します。

Table 18 ルールで使用できる回避対策

対策

説明

なし

スキャンした入力を変更せずに、設定した変数や値と比較したい場合に、「なし」を使います。

文字列長

選択した変数が文字列で、かつ選択した演算子の適用前に文字列の長さを計算したい場合に、「文字列長」を使います。

小文字変換

比較の前に入力をすべて小文字に変換することにより、大文字小文字を区別しない比較をしたい場合に、「小文字変換」を使います。この対策を使用する場合は、「値」フィールドに必ずすべて小文字の文字列を入力してください。

これは、ハッカーが大文字と小文字の変換によって、ルールをバイパスすることを防ぐ回避対策です。

URI パスの正規化

URI 内の後方参照 (URI の先頭は除く)、連続するスラッシュや自己参照といった、不正な参照を削除する場合に、「URI パスの正規化」を使います。例えば、www.eshop.com/././//login.aspx という URI は www.eshop.com/login.aspx に変換されます。

これは、ハッカーが不正な参照の追加によって、ルールをバイパスすることを防ぐ回避対策です。

空白の削除

比較の前に入力文字列内の空白を削除する場合に、「空白の削除」を使います。余分な空白によって入力がルールに一致しなくなることがありますが、バックエンドのウェブ アプリケーションはこれを解釈します。

これは、ハッカーが文字列に空白を追加することで、ルールをバイパスすることを防ぐ回避対策です。

Base64 デコード

ルールに基づく比較の前に base64 エンコードされたデータをデコードする場合に、「Base64 デコード」を使います。

一部のアプリケーションはバイナリ データを、URL やフォーム フィールドに含めるのに都合の良い方法でエンコードします。Base64 エンコードは、このようなデータをコンパクトにするために使用されます。バックエンド アプリケーションがこのデータをデコードします。

これは、ハッカーが入力に base64 エンコードを使用することで、ルールをバイパスすることを防ぐ回避対策です。

16 進数デコード

ルールに基づく比較の前に 16 進数エンコードされたデータをデコードする場合に、「16 進数デコード」を使います。

これは、ハッカーが入力に 16 進数エンコードを使用することで、ルールをバイパスすることを防ぐ回避対策です。

URL デコード

URL デコード (ユニコード)

入力内の URL エンコードされた文字列をデコードする場合に、「URL デコード」を使います。%uXXXX エンコーディングを処理するには、「URL デコード (ユニコード)」を使います。URL エンコードは、URL に ASCII 文字セット以外の文字が含まれている場合に、インターネット上でデータを安全に送信するために使用されます。

注 : すでにデコードされている入力に対しては、この対策を使用しないでください。

これは、バックエンド ウェブ サーバが悪意のある入力をデコード後に解釈できることを知るハッカーが、URL エンコードの使用によってルールをバイパスすることを防ぐ回避対策です。

例えば、www.eshop.com/hack+URL%3B という URI は、この対策によって比較の前に www.eshop.com/hack URL に変換されます。

両端空白の除去

比較の前に入力データの前後の空白を削除する場合に、「両端空白の除去」を使います。余分な空白によって入力がルールに一致しなくなることがありますが、バックエンドのウェブ アプリケーションはこれを解釈します。

これは、ハッカーが入力データの前後に空白を追加することで、ルールをバイパスすることを防ぐ回避対策です。

ルールのユースケース例

このセクションでは、対回避手法をさらに深く理解できるように、ポジティブおよびネガティブのセキュリティ モデルの例と、回避対策の使用方法を示すいくつかの例を紹介します。

例 - 肯定セキュリティモデル: 不正ログインの遮断

パスワードの長さが 8 文字未満だった場合に、アプリケーション オフロードされたウェブ サイトへのログインを防ぐには、以下の 2 つのルールを持つ連鎖ルールを作成します。

1.: 「変数」 として 「ホスト」 を選択し、「+」 を選択してこれを追加します。「演算子」 として 「文字列一致」 を設定し、「値」 にポータルの仮想ホスト名を設定します。 これは、ログイン要求のホスト ヘッダが防御しようとしているサイトに一致することを確認します。 この場合、連鎖ルールは 1 サイトにのみ適用されます。

2.: 「変数」 として 「パラメータ値」 を選択し、選択用フィールドに password を入力して、「+」 を選択してこの変数と選択した項目をルールに追加します。「演算子」 として 「< (未満)」 を設定し、「値」 に 8 を設定します。 パスワード フォーム パラメータの長さを計算するために、「回避対策」リストで「文字列長」を選択します。

この連鎖ルールの動作は 「防御」 に設定します。 Figure 12:46 は、この例の連鎖ルールを示します。

Figure 12:46 連鎖ルールの例 - 不正ログインの遮断

WAF_rule_chain_ex1.jpg

 

例 - 肯定セキュリティモデル: 好ましくないパラメータを持つフォーム提出の遮断

この連鎖ルールは、フォームがformId 以外の要求パラメータを持つ場合と、formId の値が 4 文字を超える数字を含む場合にフォーム提出を遮断します。 これを完了するには、以下の 2 つの連鎖ルールを作成する必要があります。

1.: 1 つ目の連鎖ルールは、以下の 2 つのルールを持ちます。

– 1 つ目のルールは、フォームが提出された URL を確認します。

– 2 つ目のルールは、「パラメータ名」 が正しいパラメータの名前である formId と一致していないかを確認します。 これは、「文字列一致」 演算子を、逆転の 「否定」 チェックボックスを選択して使います。

WAF_rule_chain_ex2a.jpg

 

2.: 2 つ目の連鎖ルールは、以下の 2 つのルールを持ちます。

– 1 つ目のルールは、フォームが提出された URL を確認します。

– 2 つ目のルールは、「パラメータ値:formId」 変数に含まれる値が、1 文字から 4 文字の数字のどれかを含むものと照合するため、正規表現の ^\d{1,4}$ と一致するかどうかを確認します。 ルールが1 文字から 4 文字の数字を含まないものすべてに一致するように、逆転の 「否定」 チェックボックスを選択して使います

WAF_rule_chain_ex2b.jpg

 

例 - 否定セキュリティモデル: フォームへの悪意のある入力の遮断

フォームへの悪意のある入力を遮断するには、以下の 2 つのルールを持つ連鎖ルールを作成します。

1.: 1 つ目のルールは、フォームの URL を確認します。

2.: 2 つ目のルールは、フォーム パラメータの shell_cmd と、不正な入力の traceroute を確認します。

WAF_rule_chain_ex3.jpg

 

例 - URL デコードと なし の使用

もしもハッカーが、要求 URI が CR と LF 文字 (キャリッジ リターンとライン フィード)に対して走査されていることを知ると、このハッカーはそれらの文字を、要求に追加する前にURL エンコードを実行することで、要求内に巧妙に挿入しようと試行するかもしれません。 そうすると、このURI は HTTP 応答スプリッティング攻撃の開始に使われる可能性がある、%0D と %0A 文字を含みます。 「URL デコード」と「URL デコード (ユニコード)」の対策は、スキャンした入力を、照合対象として設定した値と比較する前にデコードすることで、この種の攻撃を阻止するために使用できます。

具体的には、要求が http://www.host.com/foo%20bar/ という URI に対して行われ、「URL デコード」の対策が選択されている場合、スキャンされた URI はデコード後、http://www.host.com/foo bar/ となり、安全に照合できます。エンコードしていない要求に加えてエンコードした要求を送信するハッカーを阻止するために、管理者はルールに「なし」 と 「URL デコード」 オプションを選択できます。

例 - パラメータ値で小文字変換と URL デコードの使用

管理者が、「パラメータ値」 変数の内容が、値 foo bar と一致しているかどうかの確認を、そのような要求を遮断するために望んでいます。 バックエンド アプリケーションが大文字小文字を区別する入力 (foo bar と FOO BAR) を受け入れるので、ハッカーは要求内の foo BAR を通過させ、ルールを回避することができます。 この回避行為を阻止するために、管理者は「小文字変換」の対策を指定して、値を「foo bar」のようにすべて小文字で設定します。 これにより、すべての要求パラメータ値は小文字に変換されて、大文字小文字の区別が無い確認のために、値と比較されます。

同様に、ハッカーは一般的にブラウザにより使用される URL エンコードされた形である、foo%20BAR を通過させることができます。 この回避行為を阻止するために、管理者は「URL デコード」の対策を指定して要求エンティティに適用します。入力の foo%20BAR は、foo BAR に URL デコードされます。 入力が既に foo BAR の場合は、URL デコードは適用されません。

例 - パラメータ値:ID で文字列長と URL デコードの使用

デコードされた入力に対して比較することで、管理者は「文字列長」の対策を使用して、入力の長さを対応する変数と比較することができます。例えば、ウェブ アプリケーションの「ID」パラメータが 4 文字以下でなければならない場合、管理者はまず、「変数」フィールドで「パラメータ値」を選択し、選択フィールドに「ID」と入力して、「+」を選択して変数と選択した項目をルールに追加します。続いて、「値」フィールドに 4 と入力し、「演算子」リストで「>」を選択して、「回避対策」リストで「URL デコード」と「文字列長」の両方を選択します。

ルールの削除

連鎖ルールからルールを削除するには、以下の手順に従います。

1. 「ウェブ アプリケーション ファイアウォール > ルール」ページで、削除したいルールがある連鎖ルールの「設定」 列の連鎖ルールの編集アイコン

icon_edit00028.jpg

を選択します。 連鎖ルールのページが開きます。

2. 削除したいルールの「設定」 列の削除アイコン

icon_delete00029.jpg

を選択します。

3. 確認のダイアログボックスで、「OK」 を選択します。

4. 「適用」 を選択します。

ルールの複製

ルールを複製するには、以下の手順に従います。

1. 「ウェブ アプリケーション ファイアウォール > ルール」ページで、複製したいルールがある連鎖ルールの「設定」 列の連鎖ルールの編集アイコン

icon_edit00030.jpg

を選択します。 連鎖ルールのページが開きます。

2. 複製したいルールの「設定」 列の複製アイコン

icon_clone00031.jpg

を選択します。

3. 確認のダイアログボックスで、「OK」 を選択します。

これで、ルールを編集してカスタマイズできるようになりました。 ルールの追加と編集 を参照してください。

ルールの追加と編集

連鎖ルールのルールを追加または編集するには、以下の手順に従います。

1. 「ウェブ アプリケーション ファイアウォール > ルール」ページで、ルールを追加または編集したい連鎖ルールの「設定」 列の連鎖ルールの編集アイコン

icon_edit00032.jpg

を選択します。 連鎖ルールのページが開きます。

2. 新しいルールを追加するには 「ルールの追加」ボタンを選択、ルールを編集するには、編集したいルールの「設定」 列の編集アイコンを選択します。

3. ルールの追加ページまたは、ルールを編集するためのページで、「変数」 ドロップダウン リストから変数を選択します。 利用可能な変数の情報については、変数について を参照してください。

4. 選択した変数が変数の集合の場合は、「変数」 フィールドの右側に選択用フィールドが表示されます。 集合の特定のメンバに対して比較したい場合は、その項目の名前を選択用フィールドに入力します。
集合自身を入力に対して試験する必要がある場合は、選択用テキストボックスを空のままにします。 例えば、要求内に特定のパラメータが存在するかどうか試験するには、「パラメータ名」 変数を選択して、「値」 フィールド (変数の選択用フィールドではない) にその特定のパラメータ名を入力します。

5. プラス ボタン

plus_button.jpg

を選択して、変数をルールに追加します。 さらに変数を追加するには、2. から 5. を繰り返します。
また、変数を削除するには、大きいテキストボックス内で対象を選択してから、マイナス ボタン

minus_button.jpg

を選択します。

6. 「演算子」 ドロップダウン リストから、文字列または計算の演算子を選択します。 逆演算を行うには、「否定」 チェックボックスを選択します。

7. 「値」 フィールドに、走査される HTTP(S) 入力内の選択した変数と比較する値を入力します。 「キーワード一致」 演算子を選択する場合は、複数の値それぞれを空白で区切って入力することで、入力を複数の値と比較することができます。

8. 「回避対策」リストから、1 つ以上の対策を選択します。複数の対策を選択するには、キーボードの Ctrl キーを押しながら選択します。

9. 終了後に 「適用」 を選択します。