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

配置 Web 应用程序防火墙排除列表

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

可以使用 Azure PowerShellAzure CLIREST API、Bicep、Azure 资源管理器模板和 Azure 门户配置排除列表。

方案

假设 API 已创建。 客户端将请求发送到 API,其中包含名称为 useriduser-id 等的标头。

优化 WAF 时,你已注意到某些合法请求被阻止,因为用户标头包含 WAF 检测为 SQL 注入攻击的字符序列。 具体而言,规则 ID 942230 会检测请求标头并阻止请求。 规则 942230 属于 SQLI 规则组。

你决定创建排除项,以允许这些合法请求通过而不被 WAF 阻止。

创建排除项

  1. 打开 Azure Front Door WAF 策略。

  2. 选择“托管规则”>“管理排除项”。

    Azure 门户的屏幕截图,其中显示了 WAF 策略的托管规则页面,并突出显示了“管理排除项”按钮。

  3. 选择 添加

    Azure 门户的屏幕截图,其中显示了排除列表“添加”按钮。

  4. 配置排除项的“适用对象”部分:

    字段
    规则集 Microsoft_DefaultRuleSet_2.0
    规则组 SQLI
    规则 942230 检测到条件 SQL 注入企图
  5. 配置排除匹配条件:

    字段
    匹配变量 请求标头名称
    运算符 开头为
    选择器 User
  6. 查看排除项,其显示效果应该与以下屏幕截图类似:

    Azure 门户的屏幕截图,其中显示了排除项配置。

    此排除项适用于任何以 user 一词开头的请求头。 匹配条件不区分大小写,因此排除项也包括以 User 开头的标头。 如果 WAF 规则 942230 在这些标头值中检测到风险,它将忽略该标头并继续检测。

  7. 选择“保存”。

定义排除项选择器

使用 New-AzFrontDoorWafManagedRuleExclusionObject cmdlet 定义新的排除项选择器。

以下示例标识以 user 一词开头的请求头。 匹配条件不区分大小写,因此排除项也包括以 User 开头的标头。

$exclusionSelector = New-AzFrontDoorWafManagedRuleExclusionObject `
  -Variable RequestHeaderNames `
  -Operator StartsWith `
  -Selector 'user'

定义基于规则的排除

使用 New-AzFrontDoorWafManagedRuleOverrideObject cmdlet 定义新的基于规则的排除,其中包括在上一步中创建的选择器。

下面的示例为规则 ID 942230 创建了排除项。

$exclusion = New-AzFrontDoorWafManagedRuleOverrideObject `
  -RuleId '942230' `
  -Exclusion $exclusionSelector

将该排除项应用于规则组

使用 New-AzFrontDoorWafRuleGroupOverrideObject cmdlet 创建规则组替代,该替代会将排除项应用于相应的规则组。

下面的示例使用 SQLI 规则组,因为该组包含规则 ID 942230。

$ruleGroupOverride = New-AzFrontDoorWafRuleGroupOverrideObject `
  -RuleGroupName 'SQLI' `
  -ManagedRuleOverride $exclusion

配置托管规则集

使用 New-AzFrontDoorWafManagedRuleObject cmdlet 配置托管规则集,其中包括上一步中创建的规则组替代。

以下示例使用规则组替代及其排除项来配置 DRS 2.0 规则集。

$managedRuleSet = New-AzFrontDoorWafManagedRuleObject `
  -Type 'Microsoft_DefaultRuleSet' `
  -Version '2.0' `
  -Action Block `
  -RuleGroupOverride $ruleGroupOverride

将托管规则集配置应用于 WAF 配置文件

使用 Update-AzFrontDoorWafPolicy cmdlet 更新 WAF 策略以包含创建的配置。 确保为自己的环境使用正确的资源组名称和 WAF 策略名称。

Update-AzFrontDoorWafPolicy `
  -ResourceGroupName 'FrontDoorWafPolicy' `
  -Name 'WafPolicy'
  -ManagedRule $managedRuleSet

创建排除项

使用 az network front-door waf-policy managed-rules exclusion add 命令更新 WAF 策略来添加新的排除项。

排除项会标识以 user 一词开头的请求头。 匹配条件不区分大小写,因此排除项也包括以 User 开头的标头。

确保为自己的环境使用正确的资源组名称和 WAF 策略名称。

az network front-door waf-policy managed-rules exclusion add \
  --resource-group FrontDoorWafPolicy \
  --policy-name WafPolicy \
  --type Microsoft_DefaultRuleSet \
  --rule-group-id SQLI \
  --rule-id 942230 \
  --match-variable RequestHeaderNames \
  --operator StartsWith \
  --value user

示例 Bicep 文件

以下示例 Bicep 文件展示了如何:

  • 创建 Azure Front Door WAF 策略。
  • 启用 DRS 2.0 规则集。
  • 为 SQLI 规则组中存在的规则 942230 配置排除项。 此排除项适用于任何以 user 一词开头的请求头。 匹配条件不区分大小写,因此排除项也包括以 User 开头的标头。 如果 WAF 规则 942230 在这些标头值中检测到风险,它将忽略该标头并继续检测。
param wafPolicyName string = 'WafPolicy'

@description('The mode that the WAF should be deployed using. In "Prevention" mode, the WAF will block requests it detects as malicious. In "Detection" mode, the WAF will not block requests and will simply log the request.')
@allowed([
  'Detection'
  'Prevention'
])
param wafMode string = 'Prevention'

resource wafPolicy 'Microsoft.Network/frontDoorWebApplicationFirewallPolicies@2022-05-01' = {
  name: wafPolicyName
  location: 'Global'
  sku: {
    name: 'Premium_AzureFrontDoor'
  }
  properties: {
    policySettings: {
      enabledState: 'Enabled'
      mode: wafMode
    }
    managedRules: {
      managedRuleSets: [
        {
          ruleSetType: 'Microsoft_DefaultRuleSet'
          ruleSetVersion: '2.0'
          ruleSetAction: 'Block'
          ruleGroupOverrides: [
            {
              ruleGroupName: 'SQLI'
              rules: [
                {
                  ruleId: '942230'
                  enabledState: 'Enabled'
                  action: 'AnomalyScoring'
                  exclusions: [
                    {
                      matchVariable: 'RequestHeaderNames'
                      selectorMatchOperator: 'StartsWith'
                      selector: 'user'
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  }
}

后续步骤

了解 Azure Front Door