Surveillance et journalisation du pare-feu d’applications web Azure

La surveillance et la journalisation du pare-feu d’applications web (WAF) Azure sont fournies via la journalisation et l’intégration avec Azure Monitor et les journaux Azure Monitor.

Azure Monitor

Le journal WAF de Front Door est intégré à Azure Monitor. Azure Monitor vous permet d’effectuer le suivi des informations de diagnostic, y compris des alertes et des journaux WAF. Vous pouvez configurer la supervision WAF dans la ressource Front Door sur le portail sous l’onglet Diagnostics, via les approches d’infrastructure en tant que code, ou directement via le service Azure Monitor.

À partir du portail Azure, accédez au type de ressource Front Door. Sous l’onglet Supervision/Métriques sur la gauche, ajoutez WebApplicationFirewallRequestCount pour suivre le nombre de requêtes qui correspondent à des règles WAF. Vous pouvez créer des filtres personnalisés sur la base des types d’action et des noms de règle.

WAFMetrics

Journaux et diagnostics

WAF avec Front Door fournit des rapports détaillés sur chaque demande et chaque menace détectée. La journalisation est intégrée aux journaux et alertes de diagnostic Azure. Ces journaux d’activité peuvent être intégrés aux journaux d’activité Azure Monitor.

WAFDiag

Si la journalisation est activée et qu’une règle WAF est déclenchée, tous les modèles correspondants sont enregistrés en texte brut pour vous aider à analyser et à déboguer le comportement de la stratégie WAF. Vous pouvez utiliser des exclusions pour affiner les règles et exclure toutes les données que vous souhaitez exclure des journaux. Pour plus d’informations, consultez Listes d'exclusions du pare-feu d’applications web dans Azure Front Door.

Front Door fournit deux types de journaux : journaux d’accès et journaux WAF.

Accéder aux journaux

FrontDoorAccessLog inclut toutes les demandes qui passent par Front Door. Pour plus d’informations sur le journal d’accès Front Door, y compris le schéma de journal, consultez les journaux Azure Front Door.

FrontDoorAccessLog inclut toutes les demandes qui passent par Front Door. Pour plus d’informations sur le journal d’accès Front Door, notamment le schéma de journal, consultez Supervision des journaux et des métriques dans Azure Front Door (classique).

L’exemple de requête suivant retourne les entrées du journal d’accès :

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

Voici un exemple d’entrée de journal :

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

Journaux WAF

FrontDoorWebApplicationFirewallLog inclut des requêtes qui correspondent à une règle WAF.

FrontdoorWebApplicationFirewallLog inclut toutes les requêtes qui correspondent à une règle WAF.

Le tableau suivant indique les valeurs consignées pour chaque requête :

Propriété Description
Action Action effectuée sur la requête. Les journaux incluent des demandes avec toutes les actions. Les métriques incluent les requêtes avec toutes les actions, sauf le journal.
ClientIP Adresse IP du client à l’origine de la demande. S’il existait un en-tête X-Forwarded-For dans la requête, l’adresse IP du client est plutôt reprise dans ce champ d’en-tête.
ClientPort Adresse IP du port du client qui a effectué la requête.
Détails Détails supplémentaires sur la demande, y compris les menaces détectées.
matchVariableName : nom du paramètre HTTP de la requête correspondant, par exemple, noms d’en-tête (caractères max 100)
matchVariableValue : Valeurs qui ont déclenché la correspondance (jusqu’à 100 caractères maximum).
Host En-tête Host de la requête.
Policy Nom de la stratégie WAF correspondant à la requête.
PolicyMode Mode d’opération de la stratégie WAF. Les valeurs possibles sont Prevention et Detection.
RequestUri URI complet de la requête.
RuleName Nom de la règle WAF correspondant à la requête.
SocketIP Adresse IP source vue par WAF. Cette adresse IP est basée sur la session TCP et ne prend pas en compte les en-têtes de requête.
TrackingReference Chaîne de référence unique qui identifie une requête prise en charge par Front Door. Cette valeur est envoyée au client dans l’en-tête de réponse X-Azure-Ref. Utilisez ce champ lors de la recherche d’une requête spécifique dans le journal.

L’exemple de requête suivant montre les requêtes qui ont été bloquées par le WAF Front Door :

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

Voici un exemple d’entrée de journal, y compris la raison pour laquelle la requête a été bloquée :

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

Étapes suivantes