Solucionar problemas do Firewall de Aplicativo Web (WAF) para o Gateway de Aplicativo do Azure
Tem algumas coisas que você pode fazer caso as solicitações que devam passar pelo WAF (Firewall de Aplicativo Web) estejam bloqueadas.
Primeiro, verifique se você leu a Visão geral do WAF e os documentos de Configuração do WAF. Além disso, verifique se você habilitou o Monitoramento do WAF. Esses 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 fácil utilização, com ajustes para atender às necessidades específicas do aplicativo ou da organização que está usando o WAF. É totalmente normal, e esperado em muitos casos, criar exclusões, personalizar regras e, inclusive, 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, nenhuma alteração deve afetar outros sites que podem não estar enfrentando os mesmos problemas.
Noções básicas sobre os logs do WAF
A finalidade dos logs do WAF é mostrar todas as solicitações que tenham correspondência WAF ou sejam bloqueadas por ele. É um razão de todas as solicitações avaliadas que são correspondidas ou bloqueadas. Caso note que o WAF bloqueia uma solicitação que não deveria (um falso positivo), tem algumas coisas que você pode fazer. Primeiro, restrinja e localize a solicitação específica. Examine os logs para encontrar o URI específico, o carimbo de data/hora ou a ID de transação da solicitação. Ao encontrar as entradas de log relacionadas, é possível começar a tratar dos falsos positivos.
Por exemplo, digamos que você tenha um tráfego legítimo contendo a cadeia de caracteres 1=1
que você deseja que passe pelo WAF. Se você testar a solicitação, o WAF bloqueará o tráfego que contém a cadeia de caracteres 1=1
em qualquer parâmetro ou campo. Essa cadeia de caracteres é frequentemente associada a um ataque de injeção de SQL. É possível analisar os logs e ver o carimbo de data/hora da solicitação, além das regras que foram bloqueadas/correspondidas.
No exemplo a seguir, é possível ver que quatro regras são disparadas durante a mesma solicitação (usando o campo TransactionId). A primeira diz que correspondeu porque o usuário usou uma URL numérica/IP para a solicitação, o que aumenta a pontuação da anomalia em três, pois é um aviso. A próxima regra correspondente é 942130, que é a correta. Você pode ver a 1=1
no campo details.data
. Isso aumenta ainda mais a pontuação de anomalias, novamente em três, é também consiste em um aviso. Em geral, cada regra que tem a ação Correspondente aumenta a pontuação de anomalias e, agora, a pontuação de anomalias seria seis. Para obter mais informações, consulte Modo de pontuação de anomalias.
As duas entradas de log finais mostram que a solicitação foi bloqueada porque a pontuação de anomalias foi alta o suficiente. Essas entradas têm uma ação diferente das outras duas. Elas mostram que realmente bloquearam a solicitação. Essas regras são obrigatórias e não podem ser desabilitadas. Elas não devem ser consideradas regras, mas a infraestrutura principal dos internos do WAF.
{
"resourceId": "/SUBSCRIPTIONS/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
"operationName": "ApplicationGatewayFirewall",
"category": "ApplicationGatewayFirewallLog",
"properties": {
"instanceId": "appgw_3",
"clientIp": "203.0.113.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/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
"operationName": "ApplicationGatewayFirewall",
"category": "ApplicationGatewayFirewallLog",
"properties": {
"instanceId": "appgw_3",
"clientIp": "203.0.113.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/66667777-aaaa-8888-bbbb-9999cccc0000/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/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
"operationName": "ApplicationGatewayFirewall",
"category": "ApplicationGatewayFirewallLog",
"properties": {
"instanceId": "appgw_3",
"clientIp": "203.0.113.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"
}
}
Resolver falsos positivos
Com essas informações e o conhecimento de que a regra 942130 é a que correspondeu à cadeia de caracteres 1=1
, você pode fazer algumas coisas para impedir que isso bloqueie o tráfego:
Usar uma lista de exclusões
Para obter mais informações sobre as listas de exclusão, confira a Configuração do WAF.
Desabilite a regra.
Usar uma lista de exclusões
Para tomar uma decisão embasada sobre a manipulação de um falso positivo, é importante se familiarizar com as tecnologias usadas pelo aplicativo. Por exemplo, digamos que não haja um SQL Server em sua pilha de tecnologia e que você esteja obtendo falsos positivos relacionados a essas regras. Desabilitar essas regras não necessariamente reduz a segurança.
Um benefício de usar uma lista de exclusão é que somente uma parte específica de uma solicitação está sendo desabilitada. No entanto, isso significa que uma exclusão específica é aplicável a todo o tráfego que passa pelo WAF, pois ela é uma configuração global. Por exemplo, isso pode gerar um problema caso 1=1 seja uma solicitação válida no corpo de um determinado aplicativo, mas não no de outros. Outro benefício é poder escolher entre a exclusão do corpo, dos cabeçalhos e dos cookies quando uma determinada condição é atendida, em vez de excluir a solicitação inteira.
Ocasionalmente, há casos em que parâmetros específicos podem ser passados ao WAF de maneira não intuitiva. Por exemplo, há um token que é passado ao autenticar usando a ID do Microsoft Entra. Esse token, __RequestVerificationToken, geralmente é passado como um cookie de solicitação. Porém, em alguns casos em que os cookies estão desabilitados, esse token também é passado como um atributo de solicitação ou arg
. Se isso acontecer, será necessário garantir que __RequestVerificationToken também seja adicionado à lista de exclusões como um Nome de atributo de solicitação.
Neste exemplo, você deseja excluir o Nome do atributo de solicitação igual a text1. Isso é aparente porque você pode ver o nome do atributo nos logs de firewall: dados: dados correspondidos: 1=1 encontrado em ARGS:text1: 1=1. O atributo é text1. Você também pode encontrar esse nome de atributo de outras maneiras. Para isso, confira Localizar nomes de atributo de solicitação.
Você pode criar exclusões para o WAF no Gateway de Aplicativo em diferentes níveis de escopo. Para obter mais informações, confira Listas de exclusão do Firewall de Aplicativo Web.
Desabilitar regras
Outra forma de contornar um falso positivo é desabilitar a regra que teve correspondência na entrada que o WAF pensou ser mal-intencionada. Como os logs do WAF foram analisados e a regra foi restringida para 942130, agora é possível desabilitá-la no portal do Azure. Consulte Personalizar regras de firewall de aplicativo Web com o portal do Azure.
Um benefício de desabilitar uma regra é que, se você souber que todo o tráfego que contiver uma determinada condição normalmente bloqueada for o tráfego válido, você pode desabilitar essa regra para todo o WAF. No entanto, se o tráfego for válido somente em um caso de uso específico, uma vulnerabilidade será aberta ao desabilitar essa regra para todo o WAF, pois ela é uma configuração global.
Para usar o Azure PowerShell, consulte Personalizar regras de firewall de aplicativo Web com o PowerShell. Para usar a CLI do Azure, consulte Personalizar regras de firewall de aplicativo Web com a CLI do Azure.
Localizar nomes de atributo de solicitação
Ao usar o Fiddler, é possível inspecionar solicitações individuais e determinar 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, veja que o campo em que a cadeia de caracteres 1=1 foi inserida é nomeado text1.
Esse é um campo que pode ser excluído. Para saber mais sobre listas de exclusões, confira Listas de exclusões do Firewall do Aplicativo Web. É possível excluir a avaliação nesse caso configurando a seguinte exclusão:
Também é possível examinar os logs do firewall para obter as informações e ver o que precisa ser adicionado à lista de exclusões. Para habilitar o log, consulteIntegridade de back-end, logs de recursos e métricas para o Gateway de Aplicativo.
Examine o log do firewall e visualize o arquivo PT1H.json com relação à hora em que a solicitação que você deseja inspecionar ocorreu.
Neste exemplo, há quatro regras com a mesma TransactionID e todas elas ocorreram exatamente ao mesmo tempo:
- {
- "resourceId": "/SUBSCRIPTIONS/66667777-aaaa-8888-bbbb-9999cccc0000/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/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
- "operationName": "ApplicationGatewayFirewall",
- "category": "ApplicationGatewayFirewallLog",
- "properties": {
- "instanceId": "appgw_3",
- "clientIp": "203.0.113.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/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
- "operationName": "ApplicationGatewayFirewall",
- "category": "ApplicationGatewayFirewallLog",
- "properties": {
- "instanceId": "appgw_3",
- "clientIp": "203.0.113.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/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
- "operationName": "ApplicationGatewayFirewall",
- "category": "ApplicationGatewayFirewallLog",
- "properties": {
- "instanceId": "appgw_3",
- "clientIp": "203.0.113.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"
- }
- }
Como você compreende o funcionamento dos conjuntos de regras do CRS e sabe que o conjunto de regras do CRS 3.0 funciona com um sistema de pontuação de anomalias (consulte Firewall de Aplicativo Web para o Gateway de Aplicativo do Azure), você sabe que as duas regras inferiores com a propriedade ação: Bloqueada são bloqueadas com base na pontuação total de anomalia. As regras em foco são as duas superiores.
A primeira entrada é registrada porque o usuário usou um endereço IP numérico para navegar para o Gateway de Aplicativo, e ela pode ser ignorada nesse caso.
A segunda (regra 942130) é a importante. Você pode ver nos detalhes que ele correspondeu a um padrão (1=1)
e o campo é nomeado texto1. Siga as mesmas etapas anteriores para excluir o Nome do Atributo de Solicitação que é igual a 1=1
.
Localizar nomes de cabeçalho de solicitação
O Fiddler também é uma ferramenta útil para localizar nomes de cabeçalho de solicitação. Na captura de tela a seguir, é possível ver os cabeçalhos dessa solicitação GET, que incluem Content-Type, User-Agent e assim por diante.
Outra maneira de exibir cabeçalhos de solicitação e de resposta é examinando as ferramentas de desenvolvedor do Chrome. É possível pressionar F12 ou clicar com o botão direito do mouse em ->Inspecionar ->Ferramentas para Desenvolvedores e selecionar a guia Rede. Carregue a página da Web e clique na solicitação a ser inspecionada.
Localizar nomes de cookie de solicitação
Se a solicitação contiver cookies, a guia Cookies poderá ser selecionada para exibi-los no Fiddler.
Restringir os parâmetros globais para eliminar falsos positivos
Desabilitar inspeção do corpo de solicitação
Ao configurar Inspecionar o corpo da solicitação como desativado, os corpos de solicitação do tráfego não são avaliados pelo WAF. Isso pode ser útil quando os corpos de solicitação não são mal-intencionados com relação ao seu aplicativo.
Quando você desabilitar 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 sejam excluídos com a funcionalidade da lista de exclusão.
Desabilitar o limite máximo do corpo da solicitação
Ao desabilitar o limite máximo do corpo da solicitação, grandes corpos da solicitação podem ser processados pelo WAF sem serem rejeitados por serem muito grandes. Isso pode ser útil se você tiver solicitações grandes regularmente.
Quando você desabilitar essa opção, o corpo da solicitação só será inspecionado até o limite máximo de inspeção do corpo da solicitação. Se houver conteúdo mal-intencionado na solicitação além do limite máximo de inspeção do corpo da solicitação, o WAF não o detectará.
Desabilitar limites máximos de tamanho de arquivo
Ao desabilitar os limites de tamanho do arquivo para o WAF, arquivos grandes podem ser carregados sem que o WAF rejeite esses carregamentos de arquivo. Ao permitir que arquivos grandes sejam carregados, o risco de seu back-end ser sobrecarregado aumenta. Se você souber o tamanho máximo que um carregamento de arquivo pode ter, poderá definir um limite de tamanho para carregamentos de arquivo 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 carregamentos de arquivo estiverem regularmente além do limite máximo de tamanho de carregamento de arquivo aplicável, talvez seja necessário desabilitar totalmente os limites de tamanho de carregamento de arquivo para evitar falsos positivos.
Observação
Se você sabe que seu aplicativo nunca precisará de nenhum upload de arquivo acima de um determinado tamanho, você pode restringi-lo definindo um limite.
Aviso
Ao atribuir um novo conjunto de regras gerenciado a uma política de WAF, todas as personalizações anteriores dos conjuntos de regras gerenciados existentes, como estado de regra, ações de regra e exclusões de nível de regra, serão redefinidas para os padrões do novo conjunto de regras gerenciado. No entanto, quaisquer regras personalizadas, configurações de política e exclusões globais permanecerão inalteradas durante a nova atribuição do conjunto de regras.
Métricas de firewall (somente para WAF_v1)
Para os Firewalls de Aplicativo Web v1, as seguintes métricas agora estão disponíveis no portal:
- Contagem de solicitações bloqueadas do Firewall de Aplicativo Web O número de solicitações que foram bloqueadas
- Contagem de regras bloqueadas do Firewall de Aplicativo Web Todas as regras que corresponderam e bloquearam a solicitação
- Distribuição total de regras do Firewall de Aplicativo Web Todas as regras que corresponderam durante a avaliação
Para habilitar métricas, selecione a guia Métricas no portal e selecione uma das três métricas.
Próximas etapas
Consulte Como configurar o Firewall de Aplicativo Web no Gateway de Aplicativo.