Troubleshooting del tráfico bloqueadopor la política WAF de Azure Application Gateway

Recientemente solucioné un problema con falsos positivos en Azure Application Gateway WAF. Al revisar las reglas que bloqueaban el tráfico, descubrí que el identificador de regla (ruleid_s) no coincidía con ningún ID de reglas en el WAF.

Este artículo explica cómo detectar la regla que está bloqueado el tráfico y cómo realizar excepciones oportunas.

Paso 1: Configurar logs de Application Gateway. Para hacerlo: Ir a Application Gateway > Sección Monitoring > Diagnostic setting > + Add diagnostic setting.

Además, en mi caso, envié estos logs a Log Analytics para una mejor análisis y diagnóstico.

Algunos comandos útiles para ver el tráfico de Application Gateway en Log Analytics incluyen:

  1. AzureDiagnostics: Muestra información detallada sobre los eventos y registros enviados a Log Analytics.
  2. ApplicationGatewayAccessLog: Muestra información detallada sobre el tráfico que pasa a través de Application Gateway.
  3. ApplicationGatewayFirewallLog: Muestra información detallada sobre las reglas de firewall de Application Gateway y cuales se activaron.
  4. union *: Combina todos los registros de Log Analytics para una vista global del tráfico y eventos.
  5. filter ruleid_s: Filtra los registros por el identificador de regla específico para identificar la regla que está causando un bloqueo.

Estos comandos se pueden utilizar en la búsqueda de Log Analytics para analizar y resolver problemas relacionados con el tráfico de Application Gateway.

Application Gateway Firewall

AzureDiagnostics 
| where  Category == "ApplicationGatewayFirewallLog"

Application Gateway Access

AzureDiagnostics 
| where  OperationName contains "ApplicationGatewayAccess"

Comencemos sin más dilación. Identifiquemos las consultas bloqueadas por el WAF. Podemos hacerlo utilizando la siguiente consulta

AzureDiagnostics
| where action_s contains "Block"

Al ejecutar esta consulta, podemos ver que el ID de la regla es 494110, pero al buscar en el Managed Rules del WAF, no encontramos una regla con ese ID

Para identificar la regla asociada con este bloqueo, podemos utilizar el ID transactionId_g. Este identificador es único para cada transacción y nos permite asociar la regla que causó el bloqueo con el registro correspondiente en el firewall

AzureDiagnostics
| where transactionId_g contains "90d76277-bdd4-e7ca-f7b6-67e73f9fbe9e"
and action_s contains "Matched"
| project ruleGroup_s, ruleSetType_s, ruleId_s, details_message_s, transactionId_g

Como se puede ver en la imagen anterior, el ID de la regla que coincidió y bloquear la consulta es 931130. Al buscar este ID en el Managed Rules del WAF, encontramos que está asociado a la regla ‘REQUEST-931-APPLICATION-ATTACK-RFI’.

Una vez identificada la regla causante del problema, vamos a Managed Rules > Exclusiones > Añadir Exclusión y configuramos la exclusión.

Aquí hay algunos comandos útiles para trabajar con ApplicationGatewayFirewallLog en Log Analytics:

  • Consultar los últimos 20 registros:
AzureDiagnostics 
| where  OperationName contains "ApplicationGatewayFirewallLog"
| limit 2
  • Ordenar los registros por hora:
AzureDiagnostics 
|  where  Category == "ApplicationGatewayFirewallLog"
| sort by TimeGenerated desc
  • Filtrar por reglas específicas:
AzureDiagnostics 
|  where  Category == "ApplicationGatewayFirewallLog"
and ruleId_s == "931130"
  • Contar la cantidad de bloqueos por regla:
AzureDiagnostics 
| where  Category == "ApplicationGatewayFirewallLog"
and action_s contains "Block" 
| summarize count() by ruleId_s
  • Ver la cantidad de bloqueos por regla y por día:
AzureDiagnostics 
| where  Category == "ApplicationGatewayFirewallLog"
and action_s contains "Block" 
| summarize count() by ruleId_s, bin(TimeGenerated, 1d)
  • Ver la cantidad de bloqueos por regla y por día:
AzureDiagnostics 
| where  Category == "ApplicationGatewayFirewallLog"
and action_s contains "Block" 
| summarize count() by ruleId_s, bin(TimeGenerated, 1d)
  • Ver la cantidad de bloqueos por IP origen:
AzureDiagnostics 
| where  Category == "ApplicationGatewayFirewallLog"
and action_s contains "Block" 
| summarize count() by clientIp_s
  • Ver la cantidad de bloqueos por regla y por hora del día:
AzureDiagnostics 
| where  Category == "ApplicationGatewayFirewallLog"
and action_s contains "Block" 
|  summarize count() by ruleId_s, bin(TimeGenerated, 1h), datetime_part('hour', TimeGenerated)

:wq!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *