你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

带有 Azure Front Door 排除列表的 Web 应用程序防火墙

有时,Azure Front Door 的 Azure Web 应用程序防火墙可能会阻止合法请求。 在优化 Web 应用程序防火墙 (WAF) 时,可以将 WAF 配置为允许应用程序的请求。 使用 WAF 排除列表,可从 WAF 评估中忽略特定请求属性。 请求的其余部分照常评估。

例如,Microsoft Entra ID 提供用于身份验证的令牌。 在请求标头中使用时,这些令牌可包含可能会导致一个或多个 WAF 规则触发误报检测的特殊字符。 可以将标头添加到排除列表,这会告知 WAF 忽略标头。 WAF 仍会检查请求的其余部分是否存在可疑内容。

排除范围

可以在以下范围内创建排除项:

  • 规则集:这些排除项适用于规则集中的所有规则。
  • 规则组:这些排除项适用于规则集中特定类别的所有规则。 例如,可以配置适用于所有 SQL 注入规则的排除项。
  • 规则:这些排除适用于单个规则。

排除项选择器

排除项选择器会标识排除项适用的请求部分。 WAF 将忽略它在请求的指定部分找到的任何检测。 可以在单个排除项中指定多个排除项选择器。

每个排除项选择器都指定了匹配变量、运算符和选择器。

匹配变量

你可以将以下请求属性添加到排除项:

  • 请求标头名称
  • 请求 cookie 名称
  • 查询字符串参数名称
  • 请求正文 POST 参数名称
  • 请求正文 JSON 参数名称(在 DRS 2.0 或更高版本上受支持)

不会根据 WAF 规则评估所使用的字段值,但会评估其名称。 排除列表禁用了对该字段值的检查。 但是仍会计算字段名称。 有关详细信息,请参阅排除其他请求属性

运算符

可以指定请求标头、正文、cookie 或查询字符串属性的完全匹配项。 或者,也可以选择指定部分匹配项。 匹配条件支持以下运算符:

  • Equals:匹配与指定选择器值完全匹配的所有请求字段。 例如,若要选择名为“bearerToken”的标头,请结合使用 Equals 运算符和设为“bearerToken”的选择器。
  • Starts with:与以指定选择器值开头的所有请求字段匹配。
  • Ends with:与以指定选择器值结尾的所有请求字段匹配。
  • Contains:与包含指定选择器值的所有请求字段匹配。
  • Equals any:与所有请求字段匹配。 使用 Equals any 运算符时,选择器值将自动设置为 *。 例如,可以使用 Equals any 运算符配置适用于所有请求标头的排除项。

事例敏感性

标头和 cookie 名称不区分大小写。 查询字符串、POST 参数和 JSON 参数区分大小写。

正文内容检查

某些托管规则会在将请求正文的原始有效负载分析为 POST 参数或 JSON 参数之前先对其进行评估。 因此,在某些情况下,你可能会看到 matchVariableName 值为 InitialBodyContentsDecodedInitialBodyContents 的日志条目。

例如,假设创建一个排除项,其中包含 Request body POST args 的匹配变量和用于标识和忽略名为 FOO 的 POST 参数的选择器。 你再也看不到任何 matchVariableName 值为 PostParamValue:FOO 的日志条目。 但是,如果名为 FOO 的 POST 参数包含触发规则的文本,则日志可能会在初始正文内容中显示检测。 当前无法为初始正文内容创建排除项。

基于 Azure Web 应用程序防火墙日志定义排除规则

你可以使用日志来查看被阻止请求的详细信息,包括触发规则的请求部分。 有关详细信息,请参阅 Azure Web 应用程序防火墙监视和日志记录

有时,特定的 WAF 规则会根据请求标头、Cookie、POST 参数、查询字符串参数或请求正文中的 JSON 字段中包含的值生成误报检测。 如果发生这些误报检测,可以将规则配置为从请求评估中排除请求的相关部分。

下表显示了 WAF 日志中的示例值和可以创建的相应排除项选择器。

WAF 日志中的 matchVariableName 门户中的规则排除
CookieValue:SOME_NAME 请求 cookie 名称等于 SOME_NAME
HeaderValue:SOME_NAME 请求标头名称等于 SOME_NAME
PostParamValue:SOME_NAME 请求正文 POST 参数名称等于 SOME_NAME
QueryParamValue:SOME_NAME 查询字符串参数名称等于 SOME_NAME
JsonValue:SOME_NAME 请求正文 JSON 参数名称等于 SOME_NAME

JSON 请求正文的排除项

从 DRS 版本 2.0 开始,WAF 会检查 JSON 请求正文。 例如,请考虑此 JSON 请求正文:

{
  "posts": [
    {
      "id": 1,
      "comment": ""
    },
    {
      "id": 2,
      "comment": "\"1=1\""
    }
  ]
}

请求包括 SQL 注释字符序列,WAF 将其检测为潜在的 SQL 注入攻击。

如果确定请求合法,则可以创建一个匹配变量为 Request body JSON args name、运算符为 Equals 且选择器为 posts.comment 的排除项。

排除其他请求属性

如果 WAF 日志条目显示的 matchVariableName 值不在上表中,则无法创建排除项。 例如,当前无法为 Cookie 名称、标头名称、POST 参数名称或查询参数名称创建排除项。

相反,请考虑执行以下操作之一:

  • 禁用提供误报的规则。
  • 创建显式允许这些请求的自定义规则。 请求绕过所有 WAF 检查。

具体而言,如果 matchVariableName 的值为 CookieNameHeaderNamePostParamNameQueryParamName,则表示字段的名称(而不是其值)已触发规则。 规则排除目前不支持这些 matchVariableName 值。

后续步骤