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

Azure Web 应用程序防火墙监视和日志记录

Azure Front Door 中的 Azure Web 应用程序防火墙提供了广泛的日志记录和遥测,可帮助你了解 Web 应用程序防火墙 (WAF) 的执行情况及其采取的操作。

Azure Front Door WAF 日志与 Azure Monitor 集成。 使用 Azure Monitor,你可以跟踪诊断信息(包括 WAF 警报和日志)。 可以通过 Azure 门户中的“诊断”选项卡、通过基础结构即代码方法或直接通过 Azure Monitor,在 Azure Front Door 资源内配置 WAF 监视。

指标

Azure Front Door 会自动记录指标,以帮助你了解 WAF 的行为。

若要访问 WAF 的指标,请执行以下操作:

  1. 登录到 Azure 门户,再转到你的 Azure Front Door 配置文件。
  2. 在最左侧窗格的“监视”下,选择“指标”选项卡。
  3. 添加“Web 应用程序防火墙请求计数”指标,跟踪与 WAF 规则匹配的请求的数量。

可以基于操作类型和规则名称创建自定义筛选器。 指标包含除 Log 以外的所有操作的请求。

Screenshot that shows the metrics for an Azure Front Door WAF.

日志和诊断

Azure Front Door WAF 提供有关每个请求及其检测到的每个威胁的详细报表。 通过使用 Azure Monitor 日志将日志记录与 Azure 的诊断日志和警报集成在一起。

默认情况下未启用日志。 必须显式启用日志。 可以使用“诊断设置”选项卡在 Azure 门户中配置日志。

Screenshot that shows how to enable the WAF logs.

如果启用日志记录并触发 WAF 规则,则任何匹配模式都会以纯文本形式记录,以帮助你分析和调试 WAF 策略行为。 可以使用排除项来微调规则,并排除要从日志中排除的任何数据。 有关详细信息,请参阅 Azure Front Door 中的 Web 应用程序防火墙排除列表

Azure Front Door 提供两种类型的日志:访问日志和 WAF 日志。

访问日志

FrontDoorAccessLog 日志包含通过 Azure Front Door 的所有请求。 若要详细了解 Azure Front Door 访问日志(包括日志架构),请参阅在 Azure Front Door 中监视指标和日志

FrontdoorAccessLog 日志包含通过 Azure Front Door 的所有请求。 若要详细了解 Azure Front Door 访问日志(包括日志架构),请参阅在 Azure Front Door 中监视指标和日志(经典)

以下示例查询返回访问日志条目:

AzureDiagnostics
| where ResourceProvider == "MICROSOFT.CDN" and Category == "FrontDoorAccessLog"
AzureDiagnostics
| where ResourceType == "FRONTDOORS" and Category == "FrontdoorAccessLog"

以下片段显示一个示例日志条目:

{
  "time": "2020-06-09T22:32:17.8383427Z",
  "category": "FrontDoorAccessLog",
  "operationName": "Microsoft.Cdn/Profiles/AccessLog/Write",
  "properties": {
    "trackingReference": "08Q3gXgAAAAAe0s71BET/QYwmqtpHO7uAU0pDRURHRTA1MDgANjMxNTAwZDAtOTRiNS00YzIwLTljY2YtNjFhNzMyOWQyYTgy",
    "httpMethod": "GET",
    "httpVersion": "2.0",
    "requestUri": "https://wafdemofrontdoorwebapp.azurefd.net:443/?q=%27%20or%201=1",
    "requestBytes": "715",
    "responseBytes": "380",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4157.0 Safari/537.36 Edg/85.0.531.1",
    "clientIp": "xxx.xxx.xxx.xxx",
    "socketIp": "xxx.xxx.xxx.xxx",
    "clientPort": "52097",
    "timeTaken": "0.003",
    "securityProtocol": "TLS 1.2",
    "routingRuleName": "WAFdemoWebAppRouting",
    "rulesEngineMatchNames": [],
    "backendHostname": "wafdemowebappuscentral.azurewebsites.net:443",
    "sentToOriginShield": false,
    "httpStatusCode": "403",
    "httpStatusDetails": "403",
    "pop": "SJC",
    "cacheStatus": "CONFIG_NOCACHE"
  }
}
{
  "time": "2020-06-09T22:32:17.8383427Z",
  "category": "FrontdoorAccessLog",
  "operationName": "Microsoft.Network/FrontDoor/AccessLog/Write",
  "properties": {
    "trackingReference": "08Q3gXgAAAAAe0s71BET/QYwmqtpHO7uAU0pDRURHRTA1MDgANjMxNTAwZDAtOTRiNS00YzIwLTljY2YtNjFhNzMyOWQyYTgy",
    "httpMethod": "GET",
    "httpVersion": "2.0",
    "requestUri": "https://wafdemofrontdoorwebapp.azurefd.net:443/?q=%27%20or%201=1",
    "requestBytes": "715",
    "responseBytes": "380",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4157.0 Safari/537.36 Edg/85.0.531.1",
    "clientIp": "xxx.xxx.xxx.xxx",
    "socketIp": "xxx.xxx.xxx.xxx",
    "clientPort": "52097",
    "timeTaken": "0.003",
    "securityProtocol": "TLS 1.2",
    "routingRuleName": "WAFdemoWebAppRouting",
    "rulesEngineMatchNames": [],
    "backendHostname": "wafdemowebappuscentral.azurewebsites.net:443",
    "sentToOriginShield": false,
    "httpStatusCode": "403",
    "httpStatusDetails": "403",
    "pop": "SJC",
    "cacheStatus": "CONFIG_NOCACHE"
  }
}

WAF 日志

FrontDoorWebApplicationFirewallLog 日志包含与 WAF 规则匹配的请求。

FrontdoorWebApplicationFirewallLog 日志包含与 WAF 规则匹配的任何请求。

下表显示了为每个请求记录的值。

属性 说明
操作 针对请求执行的操作。 日志包含所有操作的请求。 操作包括:
  • Allowallow:允许请求继续处理。
  • Blockblock:请求与配置为阻止请求的 WAF 规则匹配。 或者在达到异常评分阈值后阻止了请求。
  • Loglog:请求与配置为使用 Log 操作的 WAF 规则匹配。
  • AnomalyScoringlogandscore:请求与 WAF 规则匹配。 规则会提高异常分数。 根据在同一请求上运行的其他规则,请求可能会被阻止,也可能不会被阻止。
ClientIP 发出请求的客户端的 IP 地址。 如果请求中有 X-Forwarded-For 标头,则改从该标头字段中获取客户端 IP 地址。
ClientPort 发出请求的客户端的 IP 端口。
详细信息 有关请求的更多详细信息,其中包括检测到的任何威胁。
matchVariableName:匹配的请求的 HTTP 参数名,例如标头名称(不超过 100 个字符)。
matchVariableValue:触发匹配的值(不超过 100 个字符)。
主机 请求的 Host 标头。
策略 处理了此请求的 WAF 策略的名称。
PolicyMode WAF 策略的操作模式。 可能值为 PreventionDetection
RequestUri 请求的完整 URI。
RuleName 请求匹配的 WAF 规则的名称。
SocketIP WAF 发现的源 IP 地址。 此 IP 地址基于 TCP 会话,不考虑任何请求头。
TrackingReference 这是唯一的引用字符串,用于识别 Azure Front Door 处理的请求。 此值发送到 X-Azure-Ref 响应标头中的客户端。 在日志中搜索特定请求时使用此字段。

以下示例查询显示了 Azure Front Door WAF 阻止的请求:

AzureDiagnostics 
| where ResourceProvider == "MICROSOFT.CDN" and Category == "FrontDoorWebApplicationFirewallLog" 
| where action_s == "Block" 
AzureDiagnostics
| where ResourceType == "FRONTDOORS" and Category == "FrontdoorWebApplicationFirewallLog"
| where action_s == "Block"

以下片段显示了一个示例日志条目,其中包括阻止请求的原因:

{
  "time": "2020-06-09T22:32:17.8376810Z",
  "category": "FrontdoorWebApplicationFirewallLog",
  "operationName": "Microsoft.Cdn/Profiles/Write",
  "properties": {
    "clientIP": "xxx.xxx.xxx.xxx",
    "clientPort": "52097",
    "socketIP": "xxx.xxx.xxx.xxx",
    "requestUri": "https://wafdemofrontdoorwebapp.azurefd.net:443/?q=%27%20or%201=1",
    "ruleName": "Microsoft_DefaultRuleSet-1.1-SQLI-942100",
    "policy": "WafDemoCustomPolicy",
    "action": "Block",
    "host": "wafdemofrontdoorwebapp.azurefd.net",
    "trackingReference": "08Q3gXgAAAAAe0s71BET/QYwmqtpHO7uAU0pDRURHRTA1MDgANjMxNTAwZDAtOTRiNS00YzIwLTljY2YtNjFhNzMyOWQyYTgy",
    "policyMode": "prevention",
    "details": {
      "matches": [
        {
          "matchVariableName": "QueryParamValue:q",
          "matchVariableValue": "' or 1=1"
        }
      ]
    }
  }
}
{
  "time": "2020-06-09T22:32:17.8376810Z",
  "category": "FrontdoorWebApplicationFirewallLog",
  "operationName": "Microsoft.Network/FrontDoorWebApplicationFirewallLog/Write",
  "properties": {
    "clientIP": "xxx.xxx.xxx.xxx",
    "clientPort": "52097",
    "socketIP": "xxx.xxx.xxx.xxx",
    "requestUri": "https://wafdemofrontdoorwebapp.azurefd.net:443/?q=%27%20or%201=1",
    "ruleName": "Microsoft_DefaultRuleSet-1.1-SQLI-942100",
    "policy": "WafDemoCustomPolicy",
    "action": "Block",
    "host": "wafdemofrontdoorwebapp.azurefd.net",
    "trackingReference": "08Q3gXgAAAAAe0s71BET/QYwmqtpHO7uAU0pDRURHRTA1MDgANjMxNTAwZDAtOTRiNS00YzIwLTljY2YtNjFhNzMyOWQyYTgy",
    "policyMode": "prevention",
    "details": {
      "matches": [
        {
          "matchVariableName": "QueryParamValue:q",
          "matchVariableValue": "' or 1=1"
        }
      ]
    }
  }
}

后续步骤

了解 Azure Front Door