JSON 拒绝服务保护检查
JSON 拒绝服务 (DoS) 检查检查传入的 JSON 请求,并验证是否有任何数据与 DoS 攻击的特征相匹配。如果请求存在 JSON 违规,设备将阻止请求、记录数据、发送 SNMP 警报以及显示 JSON 错误页面。JSON DoS 检查的目的是防止攻击者发送 JSON 请求对您的 JSON 应用程序或网站发起 DoS 攻击。
当客户端向 NetScaler 设备发送请求时,JSON 解析器会解析请求负载,如果观察到违规,设备将对 JSON 结构实施约束。该约束对 JSON 请求实施大小限制。因此,如果观察到任何 JSON 违规,设备将应用操作并使用 JSON 错误页面进行响应。
JSON DoS 规则
当设备收到 JSON 请求时,JSON DOS 保护会对请求负载中的以下 DoS 参数实施大小限制。
- 最大深度:JSON 文档的最大嵌套(深度)。此检查可防止层次结构深度过高的文档。
- 最大文档长度:JSON 文档的最大文档长度。
- 最大数组长度:任意 JSON 对象中的最大数组长度。此检查可防止阵列长度较大。
- 最大字符串长度:JSON 中的最大字符串长度。此检查可防止长度较大的字符串。
- 最大对象密钥计数:任意 JSON 对象中的最大密钥计数。此检查可防止具有大量密钥的对象。
- 最大对象密钥长度:任意 JSON 对象中的最大密钥长度。此检查可防止具有大密钥的对象。
以下是在 JSON 解析过程中验证的 JSON DoS 规则的列表。
-
JSONMaxContainerDepth。可以通过配置 JSONMaxContainerDepth 检查来启用此检查,默认情况下该选项为关。
-
JSONMaxContainerDepth。此检查可以通过可配置选项JSONMaxContainerDepthCheck 启用/禁用,默认值可以通过选项 jsonMaxContainerDepth 进行更改。但是,您可以将最大等级更改为介于 1 到 127 之间的值。默认值:5,最小值:1,最大值:127
-
JSONMaxDocumentLength。可以通过配置 JSONMaxDocumentLength 检查来启用此检查,默认选项为关。
-
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 Web 内容免受 JSON DoS 攻击。 在命令提示符下,键入:
add appfw profile <name> -type (HTML | XML | JSON)
注意:
将配置文件类型设置为 JSON 时,HTML 或 XML 等其他检查将不适用。
示例
add appfw profile profile1 –type JSON
为 JSON DoS 防护设置应用程序防火墙配置文件
您必须为要在应用程序防火墙配置文件上设置的一个或多个 JSON DoS 操作和 JSON DoS 错误对象配置配置配置文件。 在命令提示符下,键入:
set appfw profile <name> -JSONDoSAction [block] | [log] | [stats] | [none]
阻止-阻止违反此安全检查的连接。 日志-记录此安全检查的冲突情况。 统计信息-为此安全检查生成统计信息。 无-禁用此安全检查的所有操作。
注意:
要启用一个或多个操作,请键入“set appfw profile -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 时,JSON DoS 检查才适用。此外,在 JSON 配置文件的情况下,SQL、跨站点脚本编写、字段格式和表单字段签名也应用于查询参数。
导入 JSON 错误页面
如果传入的请求遭受 DoS 攻击,并且当您阻止该请求时,设备将显示一条错误消息。为此,您必须导入 JSON 错误页面。 在命令提示符下,键入:
import appfw jsonerrorpage <src> <name> [-comment <string>] [-overwrite]
其中,
src。 存储导入的 JSON 错误对象的位置的 URL(协议、主机、路径和名称)。
注意:
如果要导入的对象位于需要客户端证书身份验证才能访问的 HTTPS 服务器上,则导入将失败。这是一个强制性的参数。 最大长度:2047。
名称。 要分配给 NetScaler 上的 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 违规
JSONMaxDocumentLength:30 有效负载: {“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 有效负载: {“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 违规
JSONMaxObjectKeyCount:4
有效负载: {“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 违规
JSONMaxObjectKeyLength:10 有效负载: {“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 冲突
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 违规
JSONMaxStringLength:10
有效负载: {“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-->
使用 GUI 配置 JSON 拒绝服务防护
请按照以下步骤设置 JSON DoS 防护设置。
- 在导航窗格上,导航到“安全”>“配置文件”。
- 在配置文件页面中,单击添加。
- 在 NetScaler Web App Firewall 配置文件页面中,单击“高级设置”下的“安全检查”。
- 在 安全检查 部分,转到 JSON 拒绝服务 设置。
- 单击复选框旁边的可执行文件图标。
- 单击 操作设置 以访问 JSON 拒绝服务设置 页面。
- 选择 JSON DoS 操作。
- 单击确定。
- 在 NetScaler Web App Firewall 配置文件 页面中,单击 高级设置 下的 放宽规则。
- 在 放宽规则 部分中,选择 JSON 拒绝服务 设置,然后单击 编辑。
- 在 应用程序防火墙 JSON 拒绝服务检查 中,设置 JSON DoS 验证值。
-
单击确定。
- 在 NetScaler Web App Firewall 配置文件页面中,单击高级设置下的配置文件设置。
-
在配置文件设置部分,转到 JSON 错误设置子部分以设置 JSON DoS 错误页面。
-
在 JSON 错误页面导入对象 页面中,设置以下参数:
- 从中导入。将错误页面导入为文本、文件或 URL。
- URL。用于将用户重定向到错误页面的 URL。 1 文件。选择要作为 JSON DoS 错误文件导入的文件。
- 文本。输入 JSON 文件的内容。
- 单击继续。
- 文件。输入文件名。
- 文件内容。添加错误文件内容。
- 单击确定。
- 单击确定。
- 单击 Done(完成)。