Überwachung und Protokollierung von Azure Web Application Firewall

Überwachung und Protokollierung von Azure Web Application Firewall (WAF) werden mittels Protokollierung und Integration in Azure Monitor und Azure Monitor-Protokolle ermöglicht.

Azure Monitor

Das WAF-Protokoll von Front Door ist in Azure Monitor integriert. Mit Azure Monitor können Sie Diagnoseinformationen wie WAF-Warnungen und -Protokolle nachverfolgen. Sie können die WAF-Protokollierung in der Front Door-Ressource im Portal auf der Registerkarte Diagnose, mit einem Infrastructure-as-Code-Ansatz oder durch direkten Einsatz des Azure Monitor-Diensts konfigurieren.

Navigieren Sie im Azure-Portal zum Front Door-Ressourcentyp. Auf der Registerkarte Metriken unter Überwachung können Sie WebApplicationFirewallRequestCount hinzufügen, um die Anzahl der mit WAF-Regeln übereinstimmenden Anforderungen nachzuverfolgen. Benutzerdefinierte Filter können basierend auf Aktionstypen und Regelnamen erstellt werden.

WAFMetrics

Protokolle und Diagnose

WAF mit Front Door bietet detaillierte Berichterstellung für jede Anforderung und jede ermittelte Bedrohung. Die Protokollierung ist in die Diagnoseprotokolle und -Warnungen von Azure integriert. Diese Protokolle können in Azure Monitor-Protokolle integriert werden.

WAFDiag

Front Door bietet zwei Arten von Protokollen: Zugriffsprotokolle und WAF-Protokolle.

Zugriffsprotokolle

Das FrontDoorAccessLog enthält alle Anforderungen, die durch Front Door geleitet werden. Weitere Informationen zum Front Door-Zugriffsprotokoll, einschließlich des Protokollschemas, finden Sie unter Azure Front Door-Protokolle.

Das FrontdoorAccessLog enthält alle Anforderungen, die durch Front Door geleitet werden. Weitere Informationen zum Front Door-Zugriffsprotokoll, einschließlich des Protokollschemas, finden Sie unter Überwachen von Metriken und Protokollen in Azure Front Door (klassisch).

Die folgende Beispielabfrage gibt die Zugriffsprotokolleinträge zurück:

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

Im Folgenden sehen Sie ein Beispiel für einen Protokolleintrag:

{
  "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-Protokolle

Das FrontDoorWebApplicationFirewallLog enthält Anforderungen, die einer WAF-Regel entsprechen.

Das FrontdoorWebApplicationFirewallLog enthält alle Anforderungen, die einer WAF-Regel entsprechen.

Die folgende Tabelle zeigt die für jede Anforderung protokollierten Werte:

Eigenschaft BESCHREIBUNG
Aktion Aktion, die für die Anforderung durchgeführt wird. Protokolle enthalten Anforderungen mit allen Aktionen. Metriken enthalten Anforderungen mit allen Aktionen außer Protokollieren.
ClientIP Die IP-Adresse des Clients, der die Anforderung gestellt hat. Wenn die Anforderung einen X-Forwarded-For-Header enthielt, wird die Client-IP-Adresse stattdessen aus diesem Headerfeld übernommen.
ClientPort Der IP-Port des Clients, der die Anforderung gestellt hat.
Details Weitere Details zur Anforderung, einschließlich aller erkannten Bedrohungen.
matchVariableName: HTTP-Parametername der übereinstimmenden Anforderung, z. B. Headernamen (maximal 100 Zeichen).
matchVariableValue: Werte, die die Übereinstimmung ausgelöst haben (maximal 100 Zeichen).
Host Der Host-Header der Anforderung.
Richtlinie Der Name der WAF-Richtlinie, die diese Anforderung verarbeitet hat.
PolicyMode Der Betriebsmodus der WAF-Richtlinie. Mögliche Werte sind Prevention und Detection.
RequestUri Der vollständige URI der Anforderung.
RuleName Der Name der WAF-Regel, mit der die Anforderung übereinstimmt
SocketIP Die für WAF angegebene IP-Quelladresse. Diese IP-Adresse basiert auf der TCP-Sitzung und ignoriert Anforderungsheader.
TrackingReference Die eindeutige Referenzzeichenfolge, die eine von Front Door verarbeitete Anforderung identifiziert. Dieser Wert wird im X-Azure-Ref-Antwortheader an den Client gesendet. Verwenden Sie dieses Feld, wenn Sie im Protokoll nach einer bestimmten Anforderung suchen.

Die folgende Beispielabfrage zeigt die Anforderungen, die von der Front Door-WAF blockiert wurden:

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

Das folgende Beispiel zeigt einen Protokolleintrag sowie den Grund, aus dem die Anforderung blockiert wurde:

{
  "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"
        }
      ]
    }
  }
}

Nächste Schritte