调整 Google Cloud Armor 预配置的 WAF 规则

Google Cloud Armor 提供预配置的 WAF 规则,每条规则包含多个来自 OWASP 核心规则集 (CRS) 的签名。每个签名都对应于规则集中的攻击检测规则。根据预配置的 WAF 规则评估传入请求。如果请求与与预配置的 WAF 规则相关联的任何签名匹配,则该请求与预配置的 WAF 规则匹配。当 evaluatePreconfiguredWaf() 表达式返回值 true 时,将进行匹配。

选择敏感度级层

每个签名的敏感度级别都对应于一个 OWASP 偏执级别。您可以选择 04 之间的敏感度,但敏感度级层 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-cveowasp-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 规则评估期间从检查中排除。

排除项仅适用于最初检查请求标头值的目标中的签名。这包括与 OWASP 核心规则集中的以下请求标志关联的签名:

  • REQUEST_HEADERS

只有指定的请求标头的值才会从检查中排除。系统仍会检查名称。

请求 Cookie

一个请求 Cookie 名称列表,其值在预配置的 WAF 规则评估期间从检查中排除。

排除项仅适用于最初检查请求 Cookie 值的目标中的签名。这包括与 OWASP 核心规则集中的以下请求标志关联的签名:

  • REQUEST_COOKIES

只有指定的请求 Cookie 的值才会从检查中排除。系统仍会检查名称。

请求查询参数

一个请求查询参数名称列表,其值在预配置的 WAF 规则评估期间从检查中排除。

排除项仅适用于最初检查请求参数的目标中的签名。这包括与 OWASP 核心规则集中的以下请求标志关联的签名:

  • ARGS
  • ARGS_GET
  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE

只有指定的查询参数的值才会从检查中排除,检查可位于查询字符串或 POST 正文中。系统仍会检查名称。

由于查询参数是 URI 和请求行的一部分,因此在排除指定的查询参数后,系统会重新组合这些字段以用于检查。但是,对于检查整个请求正文的签名(例如与请求标志 REQUEST_BODY 关联的签名),系统不会应用查询参数的排除项。

例如,假设排除名为“args”的查询参数,如果请求在 POST 正文中包含“args”参数并且“args”的值匹配,则您可能仍会看到检查整个请求正文的签名匹配项。

请求 URI

一个用于在预配置的 WAF 规则评估期间从检查中排除的请求行 URI 列表,不包括查询字符串数据。

排除项仅适用于最初检查请求 URI 的目标中的签名。这包括与 OWASP 核心规则集中的以下请求标志关联的签名:

  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE
  • REQUEST_FILENAME
  • REQUEST_BASENAME

如果排除上述任何字段,则该字段会完全从检查中排除,并且不会执行重新组合。

字段值

如果您使用 EQUALS_ANY 以外的字段运算符,则必须指定字段值。

对于请求标头、请求 Cookie 和请求查询参数,字段值的允许字符集包括以下字符:

  • !#$%&*+-.^_`|~
  • 字母 AZ(包括大写和小写)
  • 数字字符 09

为这些请求字段应用排除项时,系统会将配置的字段值与请求中的值(转换后的值,不区分大小写)进行比较。如果您想排除不在允许的字符集中的特定字符,则无需执行额外的编码。

对于请求 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-xssowasp-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-sqliowasp-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 正文内容解析

后续步骤