Solucionar problemas do Firewall de Aplicativo Web (WAF) para o Gateway de Aplicativo do Azure

Há algumas coisas que você pode fazer se as solicitações que deveriam passar pelo WAF (Web Application Firewall) forem bloqueadas.

Primeiro, certifique-se de ter lido a visão geral do WAF e os documentos de configuração do WAF. Além disso, certifique-se de ter ativado o monitoramento do WAF Estes artigos explicam como o WAF funciona, como os conjuntos de regras do WAF funcionam e como acessar os logs do WAF.

Os conjuntos de regras OWASP são projetados para serem rigorosos e ajustados para atender às necessidades específicas do aplicativo ou organização usando WAF. É totalmente normal, e esperado em muitos casos, criar exclusões, regras personalizadas e até mesmo desativar regras que podem estar causando problemas ou falsos positivos. As políticas por site e por URI permitem que essas alterações afetem apenas sites/URIs específicos. Portanto, quaisquer alterações não devem afetar outros sites que podem não estar enfrentando os mesmos problemas.

Noções básicas sobre logs WAF

O objetivo dos logs do WAF é mostrar todas as solicitações que o WAF corresponde ou bloqueia. É um livro razão de todas as solicitações avaliadas que são correspondidas ou bloqueadas. Se você notar que o WAF bloqueia uma solicitação que não deveria (um falso positivo), você pode fazer algumas coisas. Primeiro, restrinja e encontre a solicitação específica. Examine os logs para encontrar o URI, carimbo de data/hora ou ID de transação específico da solicitação. Quando você encontrar as entradas de log associadas, você pode começar a agir sobre os falsos positivos.

Por exemplo, digamos que você tenha um tráfego legítimo contendo a cadeia de caracteres 1=1 que deseja passar pelo WAF. Se você tentar a solicitação, o WAF bloqueará o tráfego que contém sua 1=1 cadeia de caracteres em qualquer parâmetro ou campo. Esta é uma cadeia de caracteres frequentemente associada a um ataque de injeção de SQL. Você pode examinar os logs e ver o carimbo de data/hora da solicitação e as regras que bloquearam/corresponderam.

No exemplo a seguir, você pode ver que quatro regras são acionadas durante a mesma solicitação (usando o campo TransactionId). O primeiro diz que correspondeu porque o usuário usou uma URL numérica/IP para a solicitação, o que aumenta a pontuação de anomalia em três, já que é um aviso. A próxima regra que correspondeu é 942130, que é a que você está procurando. Você pode ver o 1=1details.data no campo. Isso aumenta ainda mais a pontuação de anomalia em três novamente, pois também é um aviso. Geralmente, cada regra que tem a ação Match aumenta a pontuação de anomalia e, neste ponto, a pontuação de anomalia seria seis. Para obter mais informações, consulte Modo de pontuação de anomalias.

As duas últimas entradas de log mostram que a solicitação foi bloqueada porque a pontuação de anomalia era alta o suficiente. Estas entradas têm uma ação diferente das outras duas. Eles mostram que realmente bloquearam o pedido. Estas regras são obrigatórias e não podem ser desativadas. Eles não devem ser pensados como regras, mas mais como infraestrutura central dos internos do WAF.

{ 
    "resourceId": "/SUBSCRIPTIONS/A6F44B25-259E-4AF5-888A-386FED92C11B/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2", 
    "operationName": "ApplicationGatewayFirewall", 
    "category": "ApplicationGatewayFirewallLog", 
    "properties": { 
        "instanceId": "appgw_3", 
        "clientIp": "167.220.2.139", 
        "clientPort": "", 
        "requestUri": "\/", 
        "ruleSetType": "OWASP_CRS", 
        "ruleSetVersion": "3.0.0", 
        "ruleId": "920350", 
        "message": "Host header is a numeric IP address", 
        "action": "Matched", 
        "site": "Global", 
        "details": { 
            "message": "Warning. Pattern match \\\"^[\\\\\\\\d.:]+$\\\" at REQUEST_HEADERS:Host. ", 
            "data": "40.90.218.160", 
            "file": "rules\/REQUEST-920-PROTOCOL-ENFORCEMENT.conf\\\"", 
            "line": "791" 
        }, 
        "hostname": "vm000003", 
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt" 
    } 
} 
{ 
    "resourceId": "/SUBSCRIPTIONS/A6F44B25-259E-4AF5-888A-386FED92C11B/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2", 
    "operationName": "ApplicationGatewayFirewall", 
    "category": "ApplicationGatewayFirewallLog", 
    "properties": { 
        "instanceId": "appgw_3", 
        "clientIp": "167.220.2.139", 
        "clientPort": "", 
        "requestUri": "\/", 
        "ruleSetType": "OWASP_CRS", 
        "ruleSetVersion": "3.0.0", 
        "ruleId": "942130", 
        "message": "SQL Injection Attack: SQL Tautology Detected.", 
        "action": "Matched", 
        "site": "Global", 
        "details": { 
            "message": "Warning. Pattern match \\\"(?i:([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)([\\\\\\\\d\\\\\\\\w]++)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)(?:(?:=|\\u003c=\\u003e|r?like|sounds\\\\\\\\s+like|regexp)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)\\\\\\\\2|(?:!=|\\u003c=|\\u003e=|\\u003c\\u003e|\\u003c|\\u003e|\\\\\\\\^|is\\\\\\\\s+not|not\\\\\\\\s+like|not\\\\\\\\s+regexp)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)(?!\\\\\\\\2)([\\\\\\\\d\\\\\\\\w]+)))\\\" at ARGS:text1. ", 
            "data": "Matched Data: 1=1 found within ARGS:text1: 1=1", 
            "file": "rules\/REQUEST-942-APPLICATION-ATTACK-SQLI.conf\\\"", 
            "line": "554" 
        }, 
        "hostname": "vm000003", 
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt" 
    } 
} 
{ 
    "resourceId": "/SUBSCRIPTIONS/A6F44B25-259E-4AF5-888A-386FED92C11B/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2", 
    "operationName": "ApplicationGatewayFirewall", 
    "category": "ApplicationGatewayFirewallLog", 
    "properties": { 
        "instanceId": "appgw_3", 
        "clientIp": "167.220.2.139", 
        "clientPort": "", 
        "requestUri": "\/", 
        "ruleSetType": "", 
        "ruleSetVersion": "", 
        "ruleId": "0", 
        "message": "Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Score: 8)", 
        "action": "Blocked", 
        "site": "Global", 
        "details": { 
            "message": "Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. ", 
            "data": "", 
            "file": "rules\/REQUEST-949-BLOCKING-EVALUATION.conf\\\"", 
            "line": "57" 
        }, 
        "hostname": "vm000003", 
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt" 
    } 
} 
{ 
    "resourceId": "/SUBSCRIPTIONS/A6F44B25-259E-4AF5-888A-386FED92C11B/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2", 
    "operationName": "ApplicationGatewayFirewall", 
    "category": "ApplicationGatewayFirewallLog", 
    "properties": { 
        "instanceId": "appgw_3", 
        "clientIp": "167.220.2.139", 
        "clientPort": "", 
        "requestUri": "\/", 
        "ruleSetType": "", 
        "ruleSetVersion": "", 
        "ruleId": "0", 
        "message": "Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Inbound Score: 8 - SQLI=5,XSS=0,RFI=0,LFI=0,RCE=0,PHPI=0,HTTP=0,SESS=0): SQL Injection Attack: SQL Tautology Detected.", 
        "action": "Blocked", 
        "site": "Global", 
        "details": { 
            "message": "Warning. Operator GE matched 5 at TX:inbound_anomaly_score. ", 
            "data": "", 
            "file": "rules\/RESPONSE-980-CORRELATION.conf\\\"", 
            "line": "73" 
        }, 
        "hostname": "vm000003", 
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt" 
    }
}

Corrigir falsos positivos

Com essas informações, e sabendo que a regra 942130 é a que corresponde à 1=1 string, você pode fazer algumas coisas para impedir que isso bloqueie seu tráfego:

  • Usar uma lista de exclusão

    Para obter mais informações sobre listas de exclusão, consulte Configuração do WAF.

  • Desative a regra.

Usando uma lista de exclusão

Para tomar uma decisão informada sobre como lidar com um falso positivo, é importante se familiarizar com as tecnologias que seu aplicativo usa. Por exemplo, digamos que não há um servidor SQL em sua pilha de tecnologia e você está recebendo falsos positivos relacionados a essas regras. Desativar essas regras não enfraquece necessariamente a sua segurança.

Um benefício de usar uma lista de exclusão é que apenas uma parte específica de uma solicitação está sendo desativada. No entanto, isso significa que uma exclusão específica é aplicável a todo o tráfego que passa pelo seu WAF porque é uma configuração global. Por exemplo, isso pode levar a um problema se 1=1 for uma solicitação válida no corpo para um determinado aplicativo, mas não para outros. Outro benefício é que você pode escolher entre corpo, cabeçalhos e cookies a serem excluídos se uma determinada condição for atendida, em vez de excluir toda a solicitação.

Ocasionalmente, há casos em que parâmetros específicos são passados para o WAF de uma maneira que pode não ser intuitiva. Por exemplo, há um token que é passado ao autenticar usando o Microsoft Entra ID. Este token, __RequestVerificationToken, geralmente é passado como um cookie de solicitação. No entanto, em alguns casos em que os cookies estão desativados, esse token também é passado como um atributo de solicitação ou arg. Se isso acontecer, você precisará garantir que __RequestVerificationToken seja adicionado à lista de exclusão como um nome de atributo Request também.

Exclusões

Neste exemplo, você deseja excluir o nome do atributo Request que é igual a text1. Isso é aparente porque você pode ver o nome do atributo nos logs do firewall: data: Matched Data: 1=1 encontrado em ARGS:text1: 1=1. O atributo é text1. Você também pode encontrar esse nome de atributo de algumas outras maneiras, consulte Localizando nomes de atributos de solicitação.

Listas de exclusão do WAF

Você pode criar exclusões para WAF no Application Gateway em diferentes níveis de escopo. Para obter mais informações, consulte Listas de exclusão do Web Application Firewall.

Desativando regras

Outra maneira de contornar um falso positivo é desativar a regra que correspondia à entrada que o WAF achava maliciosa. Como você analisou os logs do WAF e reduziu a regra para 942130, você pode desabilitá-la no portal do Azure. Consulte Personalizar regras de firewall de aplicativos Web por meio do portal do Azure.

Um benefício de desativar uma regra é que, se você souber que todo o tráfego que contém uma determinada condição que normalmente é bloqueada é tráfego válido, poderá desativar essa regra para todo o WAF. No entanto, se for apenas tráfego válido em um caso de uso específico, você abre uma vulnerabilidade desativando essa regra para todo o WAF, pois é uma configuração global.

Se você quiser usar o Azure PowerShell, consulte Personalizar regras de firewall de aplicativo Web por meio do PowerShell. Se você quiser usar a CLI do Azure, consulte Personalizar regras de firewall de aplicativo Web por meio da CLI do Azure.

Regras WAF

Localizando nomes de atributos de solicitação

Com a ajuda do Fiddler, você inspeciona solicitações individuais e determina quais campos específicos de uma página da Web são chamados. Isso pode ajudar a excluir determinados campos da inspeção usando Listas de Exclusão.

Neste exemplo, você pode ver que o campo onde a cadeia de caracteres 1=1 foi inserida é chamado text1.

Screenshot do Depurador Web Progress Telerik Fiddler. Na guia Raw, 1 = 1 é visível após o nome text1.

Este é um campo que pode excluir. Para saber mais sobre listas de exclusão, consulte Listas de exclusão de firewall de aplicativos Web. Neste caso, você pode excluir a avaliação configurando a seguinte exclusão:

Exclusão WAF

Você também pode examinar os logs do firewall para obter as informações para ver o que você precisa adicionar à lista de exclusão. Para habilitar o log, consulte Integridade do back-end, logs de recursos e métricas para o Application Gateway.

Examine o log do firewall e exiba o arquivo de PT1H.json para a hora em que a solicitação que você deseja inspecionar ocorreu.

Neste exemplo, você pode ver que tem quatro regras com o mesmo TransactionID e que todas elas ocorreram exatamente ao mesmo tempo:

-	{
-	    "resourceId": "/SUBSCRIPTIONS/A6F44B25-259E-4AF5-888A-386FED92C11B/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
-	    "operationName": "ApplicationGatewayFirewall",
-	    "category": "ApplicationGatewayFirewallLog",
-	    "properties": {
-	        "instanceId": "appgw_3",
-	        "clientIp": "167.220.2.139",
-	        "clientPort": "",
-	        "requestUri": "\/",
-	        "ruleSetType": "OWASP_CRS",
-	        "ruleSetVersion": "3.0.0",
-	        "ruleId": "920350",
-	        "message": "Host header is a numeric IP address",
-	        "action": "Matched",
-	        "site": "Global",
-	        "details": {
-	            "message": "Warning. Pattern match \\\"^[\\\\\\\\d.:]+$\\\" at REQUEST_HEADERS:Host. ",
-	            "data": "40.90.218.160",
-	            "file": "rules\/REQUEST-920-PROTOCOL-ENFORCEMENT.conf\\\"",
-	            "line": "791"
-	        },
-	        "hostname": "vm000003",
-	        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
-	    }
-	}
-	{
-	    "resourceId": "/SUBSCRIPTIONS/A6F44B25-259E-4AF5-888A-386FED92C11B/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
-	    "operationName": "ApplicationGatewayFirewall",
-	    "category": "ApplicationGatewayFirewallLog",
-	    "properties": {
-	        "instanceId": "appgw_3",
-	        "clientIp": "167.220.2.139",
-	        "clientPort": "",
-	        "requestUri": "\/",
-	        "ruleSetType": "OWASP_CRS",
-	        "ruleSetVersion": "3.0.0",
-	        "ruleId": "942130",
-	        "message": "SQL Injection Attack: SQL Tautology Detected.",
-	        "action": "Matched",
-	        "site": "Global",
-	        "details": {
-	            "message": "Warning. Pattern match \\\"(?i:([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)([\\\\\\\\d\\\\\\\\w]++)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)(?:(?:=|\\u003c=\\u003e|r?like|sounds\\\\\\\\s+like|regexp)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)\\\\\\\\2|(?:!=|\\u003c=|\\u003e=|\\u003c\\u003e|\\u003c|\\u003e|\\\\\\\\^|is\\\\\\\\s+not|not\\\\\\\\s+like|not\\\\\\\\s+regexp)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)(?!\\\\\\\\2)([\\\\\\\\d\\\\\\\\w]+)))\\\" at ARGS:text1. ",
-	            "data": "Matched Data: 1=1 found within ARGS:text1: 1=1",
-	            "file": "rules\/REQUEST-942-APPLICATION-ATTACK-SQLI.conf\\\"",
-	            "line": "554"
-	        },
-	        "hostname": "vm000003",
-	        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
-	    }
-	}
-	{
-	    "resourceId": "/SUBSCRIPTIONS/A6F44B25-259E-4AF5-888A-386FED92C11B/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
-	    "operationName": "ApplicationGatewayFirewall",
-	    "category": "ApplicationGatewayFirewallLog",
-	    "properties": {
-	        "instanceId": "appgw_3",
-	        "clientIp": "167.220.2.139",
-	        "clientPort": "",
-	        "requestUri": "\/",
-	        "ruleSetType": "",
-	        "ruleSetVersion": "",
-	        "ruleId": "0",
-	        "message": "Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Score: 8)",
-	        "action": "Blocked",
-	        "site": "Global",
-	        "details": {
-	            "message": "Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. ",
-	            "data": "",
-	            "file": "rules\/REQUEST-949-BLOCKING-EVALUATION.conf\\\"",
-	            "line": "57"
-	        },
-	        "hostname": "vm000003",
-	        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
-	    }
-	}
-	{
-	    "resourceId": "/SUBSCRIPTIONS/A6F44B25-259E-4AF5-888A-386FED92C11B/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
-	    "operationName": "ApplicationGatewayFirewall",
-	    "category": "ApplicationGatewayFirewallLog",
-	    "properties": {
-	        "instanceId": "appgw_3",
-	        "clientIp": "167.220.2.139",
-	        "clientPort": "",
-	        "requestUri": "\/",
-	        "ruleSetType": "",
-	        "ruleSetVersion": "",
-	        "ruleId": "0",
-	        "message": "Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Inbound Score: 8 - SQLI=5,XSS=0,RFI=0,LFI=0,RCE=0,PHPI=0,HTTP=0,SESS=0): SQL Injection Attack: SQL Tautology Detected.",
-	        "action": "Blocked",
-	        "site": "Global",
-	        "details": {
-	            "message": "Warning. Operator GE matched 5 at TX:inbound_anomaly_score. ",
-	            "data": "",
-	            "file": "rules\/RESPONSE-980-CORRELATION.conf\\\"",
-	            "line": "73"
-	        },
-	        "hostname": "vm000003",
-	        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
-	    }
-	}

Com seu conhecimento de como os conjuntos de regras CRS funcionam e que o conjunto de regras CRS 3.0 funciona com um sistema de pontuação de anomalias (consulte Firewall de Aplicativo Web para Gateway de Aplicativo do Azure), você sabe que as duas regras inferiores com a ação: A propriedade bloqueada está sendo bloqueada com base na pontuação total de anomalias. As regras em que se deve concentrar são as duas principais.

A primeira entrada é registrada porque o usuário usou um endereço IP numérico para navegar até o Application Gateway, que pode ser ignorado nesse caso.

A segunda (regra 942130) é a interessante. Você pode ver nos detalhes que ele correspondia a um padrão (1=1)e o campo é chamado text1. Siga as mesmas etapas anteriores para excluir o Nome do Atributo de Solicitação igual 1=1a .

Localizando nomes de cabeçalho de solicitação

O Fiddler é uma ferramenta útil mais uma vez para encontrar nomes de cabeçalhos de pedidos. Na captura de tela a seguir, você pode ver os cabeçalhos dessa solicitação GET, que incluem Content-Type, User-Agent e assim por diante.

Screenshot do Depurador Web Progress Telerik Fiddler. A guia Raw lista os detalhes do cabeçalho da solicitação, como a conexão, o tipo de conteúdo e o agente do usuário.

Outra maneira de visualizar cabeçalhos de solicitação e resposta é olhar para dentro das ferramentas de desenvolvedor do Chrome. Você pode pressionar F12 ou clicar com o botão direito do mouse em ->Inspect ->Developer Tools e selecionar a guia Rede. Carregue uma página da Web e selecione a solicitação que deseja inspecionar.

Cromado F12

Se o pedido contiver cookies, o separador Cookies pode ser selecionado para os visualizar no Fiddler.

Restringir parâmetros globais para eliminar falsos positivos

  • Desativar a inspeção do órgão de solicitação

    Ao definir Inspecionar corpo de solicitação como desativado, os corpos de solicitação do seu tráfego não são avaliados pelo WAF. Isso pode ser útil se você souber que os corpos de solicitação não são mal-intencionados ao seu aplicativo.

    Quando você desabilita essa opção, somente o corpo da solicitação ignora a inspeção. Os cabeçalhos e cookies ainda são inspecionados, a menos que os individuais sejam excluídos usando a funcionalidade de lista de exclusão.

  • Desativar limite máximo de corpo de solicitação

    Ao desativar o limite máximo de corpo de solicitação, grandes corpos de solicitação podem ser processados pelo WAF sem serem rejeitados por serem muito grandes. Isso pode ser útil se você tiver regularmente grandes solicitações.

    Quando você desativar essa opção, o corpo da solicitação só será inspecionado até o limite máximo de inspeção do órgão de solicitação. Se houver conteúdo malicioso na solicitação além do limite máximo de inspeção do corpo de solicitação, o WAF não o detetará.

  • Desativar limites máximos de tamanho de arquivo

    Ao desativar os limites de tamanho de arquivo para seu WAF, arquivos grandes podem ser carregados sem que seu WAF rejeite esses uploads de arquivos. Ao permitir que arquivos grandes sejam carregados, o risco de seu back-end ficar sobrecarregado aumenta. Se souber o tamanho máximo que um carregamento de ficheiro pode ter, pode definir um limite de tamanho para carregamentos de ficheiros ligeiramente acima do tamanho máximo esperado. Limitar o tamanho do arquivo a um caso de uso normal para seu aplicativo é outra maneira de evitar ataques. No entanto, se os uploads de arquivos estiverem regularmente além do limite máximo de tamanho de upload de arquivo aplicável, talvez seja necessário desativar totalmente os limites de tamanho de upload de arquivos para evitar falsos positivos.

    Nota

    Se você sabe que seu aplicativo nunca precisará de nenhum upload de arquivo acima de um determinado tamanho, você pode restringir isso definindo um limite.

Métricas de firewall (somente WAF_v1)

Para firewalls de aplicativos Web v1, as seguintes métricas agora estão disponíveis no portal:

  1. Contagem de solicitações bloqueadas pelo Web Application Firewall O número de solicitações que foram bloqueadas
  2. Contagem de regras bloqueadas pelo Web Application Firewall Todas as regras que foram correspondidas e a solicitação foi bloqueada
  3. Distribuição total de regras do Web Application Firewall Todas as regras que foram correspondidas durante a avaliação

Para habilitar métricas, selecione a guia Métricas no portal e selecione uma das três métricas.

Próximos passos

Consulte Como configurar o firewall de aplicativos Web no Application Gateway.