JSON サービス拒否保護チェック
JSON サービス拒否 (DoS) チェックは、受信 JSON リクエストを調べ、DoS 攻撃の特性と一致するデータがあるかどうかを検証します。リクエストにJSON違反があった場合、アプライアンスはリクエストをブロックし、データをログに記録し、SNMPアラートを送信し、JSONエラーページも表示します。JSON DoS チェックの目的は、攻撃者が JSON リクエストを送信して JSON アプリケーションまたは Web サイトに対して DoS 攻撃を起動するのを防ぐことです。
クライアントがCitrix ADCアプライアンスにリクエストを送信すると、JSONパーサーはリクエストペイロードを解析し、違反が観察された場合、アプライアンスはJSON構造に制約を適用します。この制約は、JSON リクエストのサイズ制限を強制します。その結果、JSON 違反が発生した場合、アプライアンスはアクションを適用し、JSON エラーページに応答します。
JSON DoS規則
アプライアンスが JSON リクエストを受信すると、JSON DOS 保護により、リクエストペイロードの次の DoS パラメータにサイズ制限が適用されます。
- 最大深さ:JSONドキュメントの最大ネスト(深さ)。このチェックは、階層の深さが過剰なドキュメントに対して保護します。
- 最大ドキュメント長:JSONドキュメントの最大ドキュメント長。
- 最大配列長:JSONオブジェクトのいずれかの最大配列長。このチェックは、長い長さの配列から保護します。
- 最大文字列長:JSONの最大文字列長。このチェックは、長い長さの文字列から保護します。
- 最大オブジェクトキー数:JSONオブジェクトの最大キー数。このチェックは、多数のキーを持つオブジェクトに対して保護します。
- オブジェクトキーの最大長:JSONオブジェクトの最大キー長。このチェックは、大きなキーを持つオブジェクトに対して保護します。
JSON 解析中に検証された JSON DoS ルールのリストを次に示します。
-
JSONMaxContainerDepth. このチェックは、JSONMaxContainerDepth チェックを設定することで有効にすることができます。デフォルトでは、このオプションはオフです。
-
JSONMaxContainerDepth. このチェックは enabled/disabled 構成可能なオプションJSONMaxContainerDepthCheckによって、デフォルト値はオプションJSONMaxContainerDepthによって変更できます。ただし、最大レベルを 1 ~ 127 の範囲の値に変更できます。デフォルト値:5, 最小値:1, 最大値:127
-
JSONMaxDocumentLength. このチェックを有効にするには、JSONMaxDocumentLength チェックを設定し、デフォルトのオプションは OFF です。
-
JSONMaxDocumentLength. このチェックを有効にするには、JSONMaxDocumentLength チェックを設定し、デフォルトの長さを 20000000 バイトに設定します。最小値:1、 最大値:2147483647
-
JSONMaxObjectKeyCount. このルールは、JSON の最大オブジェクトキー数のチェックがオンまたはオフになっているかどうかを検証します。設定可能な値:ON、OFF、デフォルト値:OFF
-
JSONMaxObjectKeyCount. このチェックは、JSONMaxObjectKeyCount チェックを設定することで有効にできます。この チェックでは、多数のキーを持つオブジェクトに対して保護され、デフォルト値は 1000 バイトに設定されます。最小値:0, 最大値:2147483647
-
JSONMaxObjectKeyLength. このチェックは、JSONMaxObjectKeyLength チェックを設定することで有効にすることができます。このルールは、JSON オブジェクトキーの最大長チェックがオンまたはオフになっているかどうかを検証します。デフォルトではオフになっています。
-
JSONMaxObjectKeyLength. このチェックでは、キーの長さが大きいオブジェクトに対して保護されます。デフォルト値は 128 です。最小値:1、 最大値:2147483647
-
JSONMaxArrayLength. このルールは、JSON の最大配列長チェックが ON または OFF かどうかを検証します。デフォルトではオフになっています。
-
JSONMaxArrayLength. このチェックは、長さが大きい配列に対して保護します。デフォルトでは、値は 10000 に設定されています。最小値:1、 最大値:2147483647
-
JSONMaxStringLength。このチェックは、JSONMaxStringLength チェックを設定することで有効にすることができます。このチェックは、JSON の最大文字列長が ON または OFF かどうかを検証します。デフォルトではオフになっています。
-
JSONMaxStringLength。チェックは、長い長さの文字列から保護します。デフォルトでは 1000000 に設定されています。最小値:1、 最大値:2147483647
JSON DoS 保護チェックの設定
JSON DoS 保護を設定するには、次の手順を完了する必要があります。
- JSON のアプリケーションファイアウォールプロファイルを追加します。
- JSON DoS 設定のアプリケーションファイアウォールプロファイルを設定します。
- アプリケーションのファイアウォールプロファイルをバインドして JSON DoS 変数を設定します。
JSON DoS 保護用のアプリケーションファイアウォールプロファイルの追加
まず、アプリケーションファイアウォールが JSON の DoS 攻撃から JSON Web コンテンツを保護する方法を指定するプロファイルを作成する必要があります。 コマンドプロンプトで入力します。
add appfw profile <name> -type (HTML | XML | JSON)
注:
プロファイルタイプを JSON に設定すると、HTML や XML などの他のチェックは適用されません。
例
add appfw profile profile1 –type JSON
JSON DoS 保護用のアプリケーションファイアウォールプロファイルの設定
1 つ以上の JSON DoS アクションおよび JSON DoS エラーオブジェクトをアプリケーションファイアウォールプロファイルに設定するには、プロファイルを設定する必要があります。 コマンドプロンプトで入力します。
set appfw profile <name> -JSONDoSAction [block] | [log] | [stats] | [none]
Block -このセキュリティー検査に違反する接続をブロックします。 Log - このセキュリティチェックの違反を記録します。 Stats -このセキュリティー検査の統計を生成します。 None -このセキュリティー検査のすべてのアクションを無効にします。
注:
1 つ以上のアクションを有効にするには、「appfw プロファイルの設定-JSONDoSAction」と入力し、次に有効にするアクションを入力します。
例
set appfw profile profile1 -JSONDoSAction block log stat
アプリケーションファイアウォールプロファイルをバインドして DoS 変数を設定する
JSON DoS 保護を提供するには、アプリケーションファイアウォールプロファイルを JSON DoS 設定でバインドする必要があります。 コマンドプロンプトで入力します。
bind appfw profile <name> -JSONDoSURL <expression> [-JSONMaxContainerDepthCheck ( ON | OFF ) [-JSONMaxContainerDepth <positive_integer>]] [-JSONMaxDocumentLengthCheck ( ON | OFF ) [-JSONMaxDocumentLength <positive_integer>]] [-JSONMaxObjectKeyCountCheck ( ON | OFF ) [-SONMaxObjectKeyCount <positive_integer>]] [-JSONMaxObjectKeyLengthCheck ( ON | OFF ) [-JSONMaxObjectKeyLength <positive_integer>]] [-JSONMaxArrayLengthCheck ( ON | OFF ) [-JSONMaxArrayLength <positive_integer>]] [-JSONMaxStringLengthCheck ( ON | OFF ) [-JSONMaxStringLength <positive_integer>]]
例
bind appfw profile profile1 -JSONDoSURL “.*” -JSONMaxContainerDepthCheck ON
注:
JSON DoS チェックは、プロファイルタイプが JSON として選択されている場合にのみ適用されます。また、JSONプロファイルの場合、SQL、クロスサイトスクリプティング、フィールド形式、およびフォームフィールドの署名がクエリパラメーターに適用されます。
JSON エラーページのインポート
着信要求に DoS 攻撃があった場合、その要求をブロックすると、アプライアンスはエラーメッセージを表示します。これを行うには、JSON エラーページをインポートする必要があります。 コマンドプロンプトで入力します。
import appfw jsonerrorpage <src> <name> [-comment <string>] [-overwrite]
各項目の意味は次のとおりです。
src インポートされた JSON エラーオブジェクトを格納する場所の URL (プロトコル、ホスト、パス、および名前)。
注:
インポートするオブジェクトが、アクセスのためにクライアント証明書認証を必要とする HTTPS サーバー上にある場合、インポートは失敗します。これは必須の引数です。 最大長さ:2047。
Name: Citrix ADC上のJSONエラーオブジェクトに割り当てる名前。 これは必須の引数です。 最大長さ:31 コメント。 JSON エラーオブジェクトに関する情報を保持するためのコメント。 最大長:255 上書き。 同じ名前の既存の JSON エラーオブジェクトを上書きします。
構成例
Add appfw prof profjson –type JSON
Bind appfw prof profjson –JSONDoSURL “.*” -JSONMaxDocumentLengthCheck ON -JSONMaxDocumentLength 30 -JSONMaxContainerDepthCheck ON -JSONMaxContainerDepth 3 JSONMaxObjectKeyCountCheck ON -JSONMaxObjectKeyCount 4 -JSONMaxObjectKeyLengthCheck ON -JSONMaxObjectKeyLength 10 -JSONMaxArrayLengthCheck ON -JSONMaxArrayLength 5 -JSONMaxStringLengthCheck ON -JSONMaxStringLength 30
<!--NeedCopy-->
ペイロード、ログメッセージ、カウンタの例:
JSONMaxDocumentLength Violation
JSONMaxDocumentLength: 30 Payload: {“a”:”A”,”b”:”B”,”c”:”C”,”d”:”D”,”e”:”E”}
ログメッセージ:
Document Length exceeds 20000000 May 29 20:23:32 <local0.info> 10.217.31.243 05/29/2019:20:23:32 GMT 0-PPE-0 : default APPFW APPFW_JSON_DOS_MAX_DOCUMENT_LENGTH 136 0 : 10.217.32.134 114-PPE0 - profjson http://10.217.30.120/forms/login.html Document exceeds maximum document length (30). cn1=30467 cn2=115 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked
<!--NeedCopy-->
カウンタ:
1 0 6 as_viol_json_dos
2 0 3 as_viol_json_dos_max_document_length
3 0 6 as_log_json_dos
4 0 3 as_log_json_dos_max_document_length
5 0 6 as_viol_json_dos_profile appfw__(profile1)
6 0 3 as_viol_json_dos_max_document_length_profile appfw__(profile1)
7 0 6 as_log_json_dos_profile appfw__(profile1)
8 0 3 as_log_json_dos_max_document_length_profile appfw__(profile1)
<!--NeedCopy-->
JSONMaxContainerDepth Violation
JSONMaxContainerDepth: 3 Payload: {“a”: {”b”: {“c”: {“d”: { ”e” : “f” }}}}}
ログメッセージ:
May 29 19:33:59 <local0.info> 10.217.31.243 05/29/2019:19:33:59 GMT 0-PPE-1 : default APPFW APPFW_JSON_DOS_MAX_CONTAINER_DEPTH 4626 0 : 10.217.31.247 22-PPE1 – profjson http://10.217.30.120/forms/login.html Document at offset (15) exceeds maximum container depth (3). cn1=30466 cn2=113 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked
<!--NeedCopy-->
カウンタ:
36 20999 7 1 0 as_viol_json_dos
37 0 6 1 0 as_viol_json_dos_max_container_depth
38 0 7 1 0 as_log_json_dos
39 0 6 1 0 as_log_json_dos_max_container_depth
40 0 7 1 0 as_viol_json_dos_profile appfw__(profile1)
41 0 6 1 0 as_viol_json_dos_max_container_depth_profile appfw__(profile1)
42 0 7 1 0 as_log_json_dos_profile appfw__(profile1)
43 0 6 1 0 as_log_json_dos_max_container_depth_profile appfw__(profile1)
<!--NeedCopy-->
JSONMaxObjectKeyCount Violation
JSONMaxObjectKeyCount: 4
Payload: {“a”: ”A”, “b”: “B”, “c”:“C”, “d” :“D”, ”e” : “E” }
ログメッセージ:
May 30 19:42:41 <local0.info> 10.217.31.243 05/30/2019:19:42:41 GMT 0-PPE-1 : default APPFW APPFW_JSON_DOS_MAX_OBJECT_KEY_COUNT 457 0 : 10.217.32.134 219-PPE1 - profjson http://10.217.30.120/forms/login.html Object at offset (41) that exceeds maximum key count (4). cn1=30468 cn2=118 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked
<!--NeedCopy-->
カウンタ:
94 119105 15 1 0 as_viol_json_dos
95 0 4 1 0 as_viol_json_dos_max_object_key_count
96 0 15 1 0 as_log_json_dos
97 0 4 1 0 as_log_json_dos_max_object_key_count
98 0 15 1 0 as_viol_json_dos_profile appfw__(profile1)
99 0 4 1 0 as_viol_json_dos_max_object_key_count_profile appfw__(profile1)
100 0 15 1 0 as_log_json_dos_profile appfw__(profile1)
101 0 4 1 0 as_log_json_dos_max_object_key_count_profile appfw__(profile1)
<!--NeedCopy-->
JSONMaxObjectKeyLength Violation
JSONMaxObjectKeyLength: 10 Payload: {“a”: ”A”, “b1234567890”: “B”, “c”:“C”, “d” :“D”, ”e” : “E” }
ログメッセージ:
May 31 20:26:10 <local0.info> 10.217.31.243 05/31/2019:20:26:10 GMT 0-PPE-1 : default APPFW APPFW_JSON_DOS_MAX_OBJECT_KEY_LENGTH 102 0 : 10.217.32.134 89-PPE1 - profjson http://10.217.30.120/forms/login.html Object key(b1234567890) at offset (12) exceeds maximum key length (10). cn1=30469 cn2=118 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked
<!--NeedCopy-->
カウンタ:
242172 6 1 0 as_viol_json_dos
0 1 1 0 as_viol_json_dos_max_object_key_length
10 0 5 1 0 as_log_json_dos
11 0 1 1 0 as_log_json_dos_max_object_key_length
12 0 6 1 0 as_viol_json_dos_profile appfw__(profile1)
13 0 1 1 0 as_viol_json_dos_max_object_key_length_profile appfw__(profile1)
14 0 5 1 0 as_log_json_dos_profile appfw__(profile1)
15 0 1 1 0 as_log_json_dos_max_object_key_length_profile appfw__(profile1)
<!--NeedCopy-->
JSONMaxArrayLength Violation
JSONMaxArrayLength: 5 ペイロード: {“a”: ”A”, “c”:[”d”,”e”,”f”,”g”,”h”,”i”],”e”:[“E”,”e”]}
ログメッセージ:
May 29 20:58:39 <local0.info> 10.217.31.243 05/29/2019:20:58:39 GMT 0-PPE-1 : default APPFW APPFW_JSON_DOS_MAX_ARRAY_LENGTH 4650 0 : 10.217.32.134 153-PPE1 -profjson http://10.217.30.120/forms/login.html Array at offset (37) that exceeds maximum array length (5). cn1=30469 cn2=120 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked
<!--NeedCopy-->
カウンタ:
36 182293 10 1 0 as_viol_json_dos
37 0 1 1 0 as_viol_json_dos_max_array_length
38 0 10 1 0 as_log_json_dos 39 0 1 1 0 as_log_json_dos_max_array_length
40 0 10 1 0 as_viol_json_dos_profile appfw__(profile1)
41 0 1 1 0 as_viol_json_dos_max_array_length_profile appfw__(profile1)
42 0 10 1 0 as_log_json_dos_profile appfw__(profile1)
43 0 1 1 0 as_log_json_dos_max_array_length_profile appfw__(profile1))
<!--NeedCopy-->
JSONMaxStringLength Violation
JSONMaxStringLength: 10
Payload: {“a”: ”A”, “c”:”CcCcCcCcCcCcCcCcCc”,”e”:[“E”,”e”]}
ログメッセージ:
May 29 20:05:02 <local0.info> 10.217.31.243 05/29/2019:20:05:02 GMT 0-PPE-0 : default APPFW APPFW_JSON_DOS_MAX_STRING_LENGTH 134 0 : 10.217.32.134 80-PPE0 - profjson http://10.217.30.120/forms/login.html String(CcCcCcCcCcCcCc) at offset (27) that exceeds maximum string length (10). n1=30470 cn2=122 cs1=profjson cs2=PPE0 cs4=ALERT cs5=2019 act=blocked
<!--NeedCopy-->
カウンタ:
44 91079 3 1 0 as_viol_json_dos
45 0 1 1 0 as_viol_json_dos_max_string_length
46 0 3 1 0 as_log_json_dos
47 0 1 1 0 as_log_json_dos_max_string_length
48 0 3 1 0 as_viol_json_dos_profile appfw__(profile1)
49 0 1 1 0 as_viol_json_dos_max_string_length_profile appfw__(profile1)
50 0 3 1 0 as_log_json_dos_profile appfw__(profile1)
51 0 1 1 0 as_log_json_dos_max_string_length_profile appfw__(profile1
<!--NeedCopy-->
Citrix のGUIを使用してJSONのDoS保護を構成する
JSON DoS 保護設定を設定するには、以下の手順に従います。
- ナビゲーションペインで、[セキュリティ] > [プロファイル] に移動します。
- [ プロファイル ] ページで、[ 追加] をクリックします。
- [ Citrix Web App Firewallプロファイル ]ページで、[ 詳細設定]の下の[セキュリティチェック]をクリックします。
- [セキュリティチェック] セクションで、[JSON サービス拒否設定] に移動します。
-
チェックボックスの近くにある実行可能アイコンをクリックします。
- 「アクション設定」 をクリックして、「JSON サービス拒否設定」ページにアクセスします。
- JSON DoS アクションを選択します。
-
[OK] をクリックします。
- [Citrix Web App Firewall プロファイル]ページで、[詳細設定]の下の[リラクゼーションルール]をクリックします。
-
[緩和ルール] セクションで、[JSON サービス拒否設定] を選択し、[編集] をクリックします。
- アプリケーションファイアウォールの JSON サービス拒否チェック で、JSON DoS 検証値を設定します。
-
[OK] をクリックします。
- [Citrix Web App Firewall プロファイル]ページで、[詳細設定]の下の [プロファイル設定] をクリックします。
-
「 プロファイル設定 」セクションで「 JSON エラー設定」 サブセクションに移動し、 JSON DoS エラー ページを設定します。
-
JSON エラーページのオブジェクトのインポート ページで、次のパラメータを設定します。
- インポート元。エラーページをテキスト、ファイル、または URL としてインポートします。
- URL。ユーザーをエラーページにリダイレクトする URL。 1 ファイル。JSON DoS エラーファイルとしてインポートするファイルを選択します。
- Text。JSON ファイルの内容を入力します。
- [続行] をクリックします。
- File。ファイル名を入力します。
- ファイルの内容。エラーファイルの内容を追加します。
- [OK] をクリックします。
- [OK] をクリックします。
- [完了] をクリックします。