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

Azure 应用程序网关上 Web 应用程序防火墙 v2 的自定义规则

Azure 应用程序网关 Web 应用程序防火墙 (WAF) v2 附带了一个预配置的、由平台管理的规则集,用于防范多种不同类型的攻击。 这些攻击包括跨站点脚本、SQL 注入,等等。 如果你是 WAF 管理员,可能需要编写自己的规则来补充核心规则集 (CRS) 规则。 你的自定义规则可以根据匹配条件阻止、允许或记录请求的流量。 如果 WAF 策略设置为检测模式,并且触发了自定义阻止规则,则会记录请求并且不执行任何阻止操作。

自定义规则允许你创建自己的规则,用于对通过 WAF 的每个请求进行评估。 这些规则的优先级高于托管规则集中的其他规则。 自定义规则包含规则名称、规则优先级和一系列匹配条件。 如果满足这些条件,则需要采取操作(允许、阻止或记录)。 如果触发了自定义规则,并采取了允许或阻止操作,则不会评估进一步的自定义或托管规则。 可以按需启用/禁用自定义规则。

例如,可以阻止来自 192.168.5.0/24 范围内的某个 IP 地址的所有请求。 在此规则中,运算符是 IPMatch,matchValues 是 IP 地址范围 (192.168.5.0/24),操作是阻止流量。 还可以设置规则的名称、优先级和启用/禁用状态。

自定义规则支持使用复合逻辑创建更高级的规则来解决安全需求。 例如,可以使用两个自定义规则创建以下逻辑((rule1:Condition 1 rule1:Condition 2) rule2:Condition 3)。 此逻辑意味着,如果满足条件 1 条件 2,或者满足条件 3,则 WAF 应执行自定义规则中指定的操作。

同一规则中的不同匹配条件始终使用 and 来组合。 例如,仅当发送方使用特定浏览器时,才阻止来自特定 IP 地址的流量。

若要在两个不同的条件之间使用 or,这两个条件必须在不同的规则中。 例如,阻止来自特定 IP 地址的流量,或阻止使用特定浏览器的发送方的流量。

自定义规则还支持正则表达式,就像在 CRS 规则集中一样。 有关示例,请参阅创建和使用自定义 Web 应用程序防火墙规则中的示例 3 和 5。

注意

WAF 自定义规则的最大数目为 100。 有关应用程序网关限制的详细信息,请参阅 Azure 订阅和服务限制、配额与约束

注意

在应用程序网关级别应用的任何重定向规则都将绕过 WAF 自定义规则。 有关重定向规则的详细信息,请参阅应用程序网关重定向概述

允许与阻止

使用自定义规则可以方便地允许和阻止流量。 例如,可以阻止来自某个 IP 地址范围的所有流量。 可以创建另一个规则,以便在请求来自特定的浏览器时允许流量。

若要允许某种流量,请确保将 -Action 参数设置为 Allow。 若要阻止某种流量,请确保将 -Action 参数设置为 Block

$AllowRule = New-AzApplicationGatewayFirewallCustomRule `
   -Name example1 `
   -Priority 2 `
   -RuleType MatchRule `
   -MatchCondition $condition `
   -Action Allow `
   -State Enabled

$BlockRule = New-AzApplicationGatewayFirewallCustomRule `
   -Name example2 `
   -Priority 2 `
   -RuleType MatchRule `
   -MatchCondition $condition `
   -Action Block `
   -State Enabled

上面的 $BlockRule 映射到 Azure 资源管理器中的以下自定义规则:

"customRules": [
      {
        "name": "blockEvilBot",
        "priority": 2,
        "ruleType": "MatchRule",
        "action": "Block",
        "state": "Enabled",
        "matchConditions": [
          {
            "matchVariables": [
              {
                "variableName": "RequestHeaders",
                "selector": "User-Agent"
              }
            ],
            "operator": "Contains",
            "negationCondition": false,
            "matchValues": [
              "evilbot"
            ],
            "transforms": [
              "Lowercase"
            ]
          }
        ]
      }
    ], 

此自定义规则包含名称、优先级、操作,以及执行该操作所要满足的一系列匹配条件。 有关这些字段的进一步解释,请参阅以下字段说明。 有关自定义规则的示例,请参阅创建和使用自定义 Web 应用程序防火墙规则

自定义规则的字段

Name [可选]

规则的名称。 它显示在日志中。

启用规则 [可选]

打开/关闭此规则。 默认情况下,自定义规则是启用的。

Priority [必需]

  • 确定规则评估顺序。 值越小,规则的评估顺序越靠前。 允许的范围为 1 到 100。
  • 必须在所有自定义规则中唯一。 优先级为 40 的规则将在优先级为 80 的规则之前评估。

Rule type [必需]

目前必须为 MatchRule

Match variable [必需]

必须是以下变量之一:

  • RemoteAddr - 远程计算机连接的 IPv4 地址/范围
  • RequestMethod - HTTP 请求方法
  • QueryString - URI 中的变量
  • PostArgs - 在 POST 正文中发送的参数。 仅当“Content-Type”标头设置为“application/x-www-form-urlencoded”和“multipart/form-data”时,才会应用使用此匹配变量的自定义规则。 CRS 版本 3.2 或更高版本、机器人保护规则集和异地匹配自定义规则支持 application/json 的其他内容类型。
  • RequestUri - 请求的 URI
  • RequestHeaders - 请求的标头
  • RequestBody – 此变量包含整个请求正文。 仅当“Content-Type”标头设置为 application/x-www-form-urlencoded 媒体类型时,才会应用使用此匹配变量的自定义规则。 CRS 版本 3.2 或更高版本、机器人保护规则集和异地匹配自定义规则支持 application/soap+xml, application/xml, text/xml 的其他内容类型。
  • RequestCookies - 请求的 Cookie

Selector [可选]

描述 matchVariable 集合的字段。 例如,如果 matchVariable 为 RequestHeaders,则选择器可以位于 User-Agent 标头中。

Operator [必需]

必须是以下运算符之一:

  • IPMatch - 仅当匹配变量为 RemoteAddr 时才使用,且仅支持 IPv4
  • Equal - 输入与 MatchValue 相同
  • Any - 它不应该有 MatchValue。 建议用于包含有效 Selector 的 Match 变量。
  • Contains
  • LessThan
  • GreaterThan
  • LessThanOrEqual
  • GreaterThanOrEqual
  • BeginsWith
  • EndsWith
  • 正则表达式
  • Geomatch

Negate condition [可选]

对当前条件求反。

Transform [可选]

一个字符串列表,其中包含尝试匹配之前执行的转换的名称。 这些转换可以是:

  • 小写
  • 大写
  • Trim
  • UrlDecode
  • UrlEncode
  • RemoveNulls
  • HtmlEntityDecode

Match values [必需]

要匹配的值列表,可被视为采用 OR 运算符。 例如,它可以是 IP 地址或其他字符串。 值的格式取决于上一个运算符。

支持的 HTTP 请求方法值包括:

  • GET
  • HEAD
  • POST
  • OPTIONS
  • PUT
  • 删除
  • PATCH

Action [必需]

在 WAF 策略检测模式下,如果触发自定义规则,始终记录该操作,而不考虑在自定义规则上设置的操作值。

  • Allow - 授权事务,跳过所有其他规则。 指定的请求将添加到允许列表,并且一旦匹配,该请求将停止进一步的评估,并会被发送到后端池。 不会根据允许列表中的规则评估任何其他自定义规则或托管规则。
  • Block - 基于 SecDefaultAction(检测/阻止模式)阻止或记录事务。
    • 阻止模式 - 基于 SecDefaultAction 阻止事务。 与 Allow 操作一样,评估请求并将其添加到阻止列表后,将会停止评估并阻止请求。 然后,将不会评估满足相同条件的任何请求,而只会将其阻止。
    • 检测模式 - 根据 SecDefaultAction 记录事务,之后停止评估。 然后,将不会评估满足相同条件的任何请求,而只会将其记录。
  • Log - 允许该规则写入日志,但允许其他规则运行以进行评估。 其他自定义规则按优先顺序进行评估,后跟托管规则。

复制和重复自定义规则

自定义规则可以在给定的策略中重复。 复制规则时,需要指定规则的唯一名称和唯一的优先级值。 此外,只要策略位于同一订阅中,就可以将自定义规则从一个应用程序网关 WAF 策略复制到另一个应用程序网关 WAF 策略。 将规则从一个策略复制到另一个策略时,需要选择要将规则复制到的应用程序网关 WAF 策略。 选择 WAF 策略后,需要为规则指定唯一名称,并分配优先级排名。

Geomatch 自定义规则

自定义规则允许创建定制的规则,以满足应用程序和安全策略的确切需要。 可以按国家/地区限制对 Web 应用程序的访问。 有关详细信息,请参阅 Geomatch 自定义规则

后续步骤