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

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

选择敏感度级层

每个签名的敏感度级别都对应于一个 ModSecurity 偏执级别。您可以选择 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 规则,也可以是预配置的 WAF 规则下的签名列表。您可以使用字段运算符和字段值来指定完全匹配或部分匹配。可用的字段运算符如下所示:

  • EQUALS:如果字段值等于指定值,则运算符匹配。
  • STARTS_WITH:如果字段值以指定值开头,则运算符匹配。
  • ENDS_WITH:如果字段值以指定值结尾,则运算符匹配。
  • CONTAINS:如果字段值包含指定值,则运算符匹配。
  • EQUALS_ANY:如果字段值为任何值,则运算符匹配。

以下部分详细介绍了可以从检查中排除的请求字段,后跟示例。

请求标头

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

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

  • REQUEST_HEADERS

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

请求 Cookie

在预配置的 WAF 规则评估期间,系统会从检查中排除的请求 Cookie 名称列表。

排除项仅适用于最初检查请求 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”的值匹配,则您可能仍会看到检查整个请求正文的签名匹配项。

Request URI

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

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

  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE
  • REQUEST_FILENAME
  • REQUEST_BASENAME

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

字段值

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

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

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

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

对于请求 URI,字段值必须按如下 URI 格式提供:

  • 允许使用 scheme,但仅限 http 或 https。
  • 系统允许主机,可以是 IP 地址。
  • 允许端口。
  • 允许使用路径。
  • 不允许执行查询。
  • 不允许使用片段。

为请求 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

如需配置要应用其他解析的自定义 Content-Type 标头值列表,请使用以下示例。该示例更新了安全政策 POLICY_NAME 以启用 JSON 解析,并指定内容类型 application/jsonapplication/vnd.api+jsonapplication/vnd.collection+jsonapplication/vnd.hyper+json

gcloud compute security-policies update POLICY_NAME \
    --json-parsing STANDARD \
    --json-custom-content-types "application/json,application/vnd.api+json,application/vnd.collection+json,application/vnd.hyper+json"

或者,如果您的安全政策保护着使用 GraphQL 的应用或接收 GraphQL 编码内容的应用,您可以使用参数 STANDARD_WITH_GRAPHQL 将 POST 正文内容解析为 GraphQL 内容,如以下示例所示:

gcloud compute security-policies update POLICY_NAME \
    --json-parsing STANDARD_WITH_GRAPHQL

POST 正文的检查仅限于前 8 KB。如需了解详情,请参阅安全政策限制

  • 如果 JSON 内容大于 8 KB,则 Google Cloud Armor 会对任何预配置 WAF 规则检查的前 8 KB 内容应用 JSON 解析。

  • 如果 JSON 解析器未返回任何结果,您可以尝试 URI 解析。如果 URI 解析器未返回名称值参数或仅返回部分名称参数,则整个或部分字符串可能会被视为检查的参数名称。

后续步骤