Google Cloud Armor 提供预配置的 WAF 规则,每条规则包含多个来自 ModSecurity 核心规则集 (CRS) 的签名。每个签名都对应于规则集中的攻击检测规则。根据预配置的 WAF 规则评估传入请求。如果请求与与预配置的 WAF 规则相关联的任何签名匹配,则该请求与预配置的 WAF 规则匹配。当 evaluatePreconfiguredWaf()
或 evaluatePreconfiguredExpr()
表达式返回值 true
时,将进行匹配。
选择敏感度级层
每个签名的敏感度级别都对应于一个 ModSecurity 偏执级别。您可以选择 0
和 4
之间的敏感度,但敏感度级层 0
表示默认情况下不启用规则。
较低的敏感度级别表示较高的置信度签名,生成假正例的可能性较小。较高的敏感度级别会提高安全性,但也会增加生成假正例的风险。 为 WAF 规则选择敏感度级层时,您即是选择启用敏感度级层低于或等于所选敏感度级层的签名。在以下示例中,您可以通过选择敏感度级层 1
来调整预配置的 WAF 规则:
evaluatePreconfiguredWaf('sqli-v33-stable', {'sensitivity': 1})
停用规则签名
如果您确定预配置的 WAF 规则匹配的请求超过必要请求,或者如果该规则正阻止需要允许的流量,则可以调整该规则以停用嘈杂或不必要的签名。如需在特定的预配置 WAF 规则中停用签名,您可向 evaluatePreconfiguredWaf()
表达式提供不需要的签名的 ID 列表。
以下示例会从预配置的 sqli-v33-stable
(CRS 3.3) WAF 规则中排除两个 CRS 规则 ID:
evaluatePreconfiguredWaf('sqli-v33-stable', {'sensitivity': 4, 'opt_out_rule_ids': ['owasp-crs-v030301-id942350-sqli', 'owasp-crs-v030301-id942360-sqli']})
从预配置的 CRS 规则集中停用 ID 时,必须将签名 ID 版本与规则集版本(CRS 3.0 或 3.3)匹配,以避免配置错误。
您还可以使用旧版表达式 evaluatePreconfigureExpr()
停用签名 ID。如需详细了解预配置的 WAF 规则表达式,请参阅自定义规则语言参考文档。
选择启用规则签名
您可以选择启用原本要停用的敏感度级层中的特定规则签名,而不是停用规则签名。我们建议您在给定敏感度级层使用的签名数量少于要停用的规则时,才选择启用规则签名。如需启用规则签名,敏感度级层必须为 0
。以下示例将在所有敏感度级层停用所有 cve-canary
签名,然后明确启用 owasp-crs-v030001-id044228-cve
和 owasp-crs-v030001-id144228-cve
:
evaluatePreconfiguredWaf('cve-canary', {'sensitivity': 0, 'opt_in_rule_ids': ['owasp-crs-v030001-id044228-cve', 'owasp-crs-v030001-id144228-cve']})
从检查中排除请求字段
您的自定义应用的请求字段(例如标头、Cookie、查询参数或 URI)中包含的内容可能会与预配置的 WAF 规则中的签名匹配,但您知道这些内容是正当的内容。在这种情况下,您可以将请求字段的排除项列表与安全政策规则关联,以便从检查中排除这些请求字段,从而减少假正例。请注意,如果您将请求字段排除项附加到 WAF 规则,则无法使用 allow
操作。
配置请求字段排除项时,您可以将其与目标相关联,后者可以是整条预配置的 WAF 规则,也可以是预配置的 WAF 规则下的签名列表。您可以使用字段运算符和字段值来指定完全匹配或部分匹配。可用的字段运算符如下所示:
EQUALS
:如果字段值等于指定值,则运算符匹配。STARTS_WITH
:如果字段值以指定值开头,则运算符匹配。ENDS_WITH
:如果字段值以指定值结尾,则运算符匹配。CONTAINS
:如果字段值包含指定值,则运算符匹配。EQUALS_ANY
:如果字段值为任何值,则运算符匹配。
以下部分详细介绍了可以从检查中排除的请求字段,后跟示例。
请求标头
一个请求标头名称列表,其值在预配置的 WAF 规则评估期间从检查中排除。
排除项仅适用于最初检查请求标头值的目标中的签名。这包括与 ModSecurity 核心规则集中的以下请求标志关联的签名:
- REQUEST_HEADERS
只有指定的请求标头的值才会从检查中排除。系统仍会检查名称。
请求 Cookie
一个请求 Cookie 名称列表,其值在预配置的 WAF 规则评估期间从检查中排除。
排除项仅适用于最初检查请求 Cookie 值的目标中的签名。这包括与 ModSecurity 核心规则集中的以下请求标志关联的签名:
- REQUEST_COOKIES
只有指定的请求 Cookie 的值才会从检查中排除。系统仍会检查名称。
请求查询参数
一个请求查询参数名称列表,其值在预配置的 WAF 规则评估期间从检查中排除。
排除项仅适用于最初检查请求参数的目标中的签名。这包括与 ModSecurity 核心规则集中的以下请求标志关联的签名:
- ARGS
- ARGS_GET
- REQUEST_URI
- REQUEST_URI_RAW
- REQUEST_LINE
只有指定的查询参数的值才会从检查中排除,检查可位于查询字符串或 POST 正文中。系统仍会检查名称。
由于查询参数是 URI 和请求行的一部分,因此在排除指定的查询参数后,系统会重新组合这些字段以用于检查。但是,对于检查整个请求正文的签名(例如与请求标志 REQUEST_BODY
关联的签名),系统不会应用查询参数的排除项。
例如,假设排除名为“args”的查询参数,如果请求在 POST 正文中包含“args”参数并且“args”的值匹配,则您可能仍会看到检查整个请求正文的签名匹配项。
请求 URI
一个用于在预配置的 WAF 规则评估期间从检查中排除的请求行 URI 列表,不包括查询字符串数据。
排除项仅适用于最初检查请求 URI 的目标中的签名。这包括与 ModSecurity 核心规则集中的以下请求标志关联的签名:
- REQUEST_URI
- REQUEST_URI_RAW
- REQUEST_LINE
- REQUEST_FILENAME
- REQUEST_BASENAME
如果排除上述任何字段,则该字段会完全从检查中排除,并且不会执行重新组合。
字段值
如果您使用 EQUALS_ANY
以外的字段运算符,则必须指定字段值。
对于请求标头、请求 Cookie 和请求查询参数,字段值的允许字符集包括以下字符:
!
、#
、$
、%
、&
、*
、+
、-
、.
、^
、_
、`
、|
、~
- 字母
A
到Z
(包括大写和小写) - 数字字符
0
到9
为这些请求字段应用排除项时,系统会将配置的字段值与请求中的值(转换后的值,不区分大小写)进行比较。如果您想排除不在允许的字符集中的特定字符,则无需执行额外的编码。
对于请求 URI,字段值必须采用 URI 格式,如下所示:
- 允许使用架构,但仅限 http 或 https。
- 允许使用主机,并且可以是 IP 地址。
- 允许使用端口。
- 允许使用路径。
- 不允许查询。
- 不允许使用 fragment。
为请求 URI 应用排除项时,系统会将配置的字段值与请求行中的 URI(转换后的 URI,不区分大小写,不包括查询字符串)进行比较。请求行中的 URI 可以是相对 URI,也可以是绝对 URI。在为请求 URI 配置排除项时,请考虑这一点。
示例
第一个示例更新位于 PRIORITY 的安全政策 POLICY_1 中的规则,以便为 sqli-v33-stable
WAF 规则下的所有签名添加排除项配置,进而从检查中排除所有请求 Cookie:
gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \ --security-policy POLICY_1 \ --target-rule-set "sqli-v33-stable" \ --request-cookie-to-exclude "op=EQUALS_ANY"
第二个示例更新位于 PRIORITY 的安全政策 POLICY_2 中的规则,以便为 xss-v33-stable
WAF 规则下的签名 owasp-crs-v030301-id941140-xss
和 owasp-crs-v030301-id941270-xss
添加排除项配置,进而从检查中排除以 abc
开头或以 xyz
结尾的请求标头:
gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \ --security-policy POLICY_2 \ --target-rule-set "xss-v33-stable" \ --target-rule-ids "owasp-crs-v030301-id941140-xss" "owasp-crs-v030301-id941270-xss" \ --request-header-to-exclude "op=STARTS_WITH,val=abc" \ --request-header-to-exclude "op=ENDS_WITH,val=xyz"
第三个示例更新位于 PRIORITY 的安全政策 POLICY_3 中的规则,以便移除 sqli-v33-stable
下的规则 ID owasp-crs-v030301-id942110-sqli
和 owasp-crs-v030301-id942120-sqli
的所有请求字段排除项。
gcloud compute security-policies rules remove-preconfig-waf-exclusion PRIORITY \ --security-policy POLICY_3 \ --target-rule-set "sqli-v33-stable" \ --target-rule-ids "owasp-crs-v030301-id942110-sqli,owasp-crs-v030301-id942120-sqli"
对自定义 Content-Type
标头值应用解析
当 Google Cloud Armor 根据预配置的 WAF 规则评估 POST 正文时,Content-Type
标头指示请求正文中数据的格式。默认情况下,Google Cloud Armor 将 POST 正文的内容视为一个字符串,整体符合检查和匹配预配置 WAF 规则的条件。但是,如果传入请求具有不同的编码,您可以配置更精确的解析。Google Cloud Armor 支持以下编码类型:
- JSON
- GraphQL
如需了解详情,请参阅 POST 正文内容解析。
后续步骤
- 详细了解如何配置安全政策。
- 详细了解适用于预配置 WAF 规则的规则签名。
- 如需详细了解预配置 WAF 规则,请参阅自定义规则语言参考文档。