Listas de exclusões do Firewall do Aplicativo Web
O WAF (firewall de aplicativo Web) do Gateway de Aplicativo do Azure fornece proteção para aplicativos Web. Este artigo descreve a configuração para listas de exclusões do WAF. Essas configurações estão na política do WAF associada ao Gateway de Aplicativo. Para saber mais sobre as políticas do WAF, confira Firewall de Aplicativo Web do Azure no Gateway de Aplicativo do Azure e Criar políticas do Firewall de Aplicativo Web para o Gateway de Aplicativo.
Às vezes, o WAF pode bloquear uma solicitação que você deseja permitir para o aplicativo. As listas de exclusões do WAF permitem a você omitir certos atributos de solicitação de uma avaliação do WAF. O restante da solicitação é avaliado como normal.
Um exemplo comum são os tokens inseridos pelo Active Directory que são usados para autenticação. Quando usados em um cabeçalho de solicitação, esses tokens podem conter caracteres especiais que podem disparar uma detecção de falso positivo nas regras do WAF. Ao adicionar o cabeçalho a uma lista de exclusões, você pode configurar o WAF para ignorar o cabeçalho, mas ele ainda avaliará o restante da solicitação.
É possível configurar exclusões a serem aplicadas durante a avaliação de regras específicas do WAF ou globalmente à avaliação de todas as regras do WAF. As regras de exclusão se aplicam a todo o aplicativo Web.
Identificar atributos de solicitação a serem excluídos
Ao configurar uma exclusão do WAF, especifique os atributos da solicitação que devem ser excluídos da avaliação do WAF. É possível configurar uma exclusão do WAF para os seguintes atributos de solicitação:
- Cabeçalhos da solicitação
- Solicitar cookies
- O nome do atributo de solicitação (args) pode ser adicionado como um elemento de exclusão, como:
- Nome do campo de formulário
- Entidade JSON
- Argumentos de cadeia de consulta da URL
Você pode especificar um cabeçalho de solicitação exato, corpo, cookie ou uma correspondência de atributo de cadeia de consulta. Outra opção é especificar correspondências parciais. Use os seguintes operadores para configurar a exclusão:
- Equals: esse operador é usado para uma correspondência exata. Como exemplo, para a seleção de um cabeçalho chamado bearerToken, use o operador equals com seletor definido como bearerToken.
- Começa com: esse operador corresponde com todos os campos que começam com o valor do seletor especificado.
- Termina com: esse operador corresponde todos os campos de solicitação que terminam com o valor do seletor especificado.
- Contém: esse operador corresponde com todos os campos de solicitação que contenham o valor do seletor especificado.
- É igual a qualquer: esse operador corresponde a todos os campos de solicitação. * será o valor do seletor. Por exemplo, esse operador pode ser usado quando você não souber os valores exatos de uma determinada variável de correspondência, mas quiser garantir que o tráfego de solicitação ainda seja excluído da avaliação de regras.
Ao processar exclusões, o mecanismo WAF executará uma correspondência que diferencia maiúsculas de minúsculas/não diferencia maiúsculas de minúsculas com base na tabela abaixo. Além disso, expressões regulares não são permitidas, pois não há suporte para seletores e corpos de solicitação XML.
Parte do corpo da solicitação | CRS 3.1 e versões anteriores | CRS 3.2 e versões posteriores. |
---|---|---|
Cabeçalho | Não diferencia maiúsculas de minúsculas | Não diferencia maiúsculas de minúsculas |
Cookie* | Não diferencia maiúsculas de minúsculas | Diferenciar maiúsculas de minúsculas |
Cadeia de caracteres de consulta* | Não diferencia maiúsculas de minúsculas | Diferenciar maiúsculas de minúsculas |
Corpo do URL-Encoded | Não diferencia maiúsculas de minúsculas | Diferenciar maiúsculas de minúsculas |
Corpo do JSON | Não diferencia maiúsculas de minúsculas | Diferenciar maiúsculas de minúsculas |
Corpo XML | Sem suporte | Sem suporte |
Corpo de várias partes | Não diferencia maiúsculas de minúsculas | Diferenciar maiúsculas de minúsculas |
*Dependendo do aplicativo, os nomes e os valores dos cabeçalhos, cookies e argumentos de consulta podem diferenciar maiúsculas de minúsculas ou não.
Observação
Para obter mais informações e ajuda para solução de problemas, confira Solução de problemas do WAF.
Solicitar atributos por chaves e valores
Ao configurar uma exclusão, você precisa determinar se deseja excluir a chave ou o valor da avaliação do WAF.
Por exemplo, suponha que suas solicitações incluam este cabeçalho:
My-Header: 1=1
O valor do cabeçalho (1=1
) pode ser detectado como um ataque pelo WAF. Se você souber que esse é um valor legítimo para o seu cenário, configure uma exclusão para o valor do cabeçalho. Para fazer isso, use a variável de correspondência RequestHeaderValues, o operador contains e o seletor (My-Header
). Essa configuração interrompe a avaliação de todos os valores do cabeçalho My-Header
.
Observação
Os atributos de solicitação por chave e valor só estão disponíveis a partir do CRS 3.2 ou mais recente e do Gerenciador de Bot 1.0 ou mais recente.
Os atributos de solicitação por nome funcionam da mesma maneira que os atributos de solicitação por valor e são incluídos para compatibilidade com o CRS 3.1 e versões anteriores. Recomenda-se usar atributos de solicitação por valor em vez de atributos por nome. Por exemplo, use RequestHeaderValues em vez de RequestHeaderNames.
Por outro lado, se o WAF detectar o nome do cabeçalho (My-Header
) como um ataque, será possível configurar uma exclusão para a chave do cabeçalho usando o atributo de solicitação RequestHeaderKeys. O atributo RequestHeaderKeys só está disponível no CRS 3.2 ou mais recente e no Gerenciador de Bot 1.0 ou mais recente.
Exemplos de atributo de solicitação
A tabela abaixo mostra alguns exemplos de como você pode estruturar sua exclusão para uma determinada variável de correspondência.
Atributo a excluir | matchVariable | selectorMatchOperator | Seletor de exemplo | Solicitação de exemplo | O que é excluído |
---|---|---|---|---|---|
Cadeia de consulta | RequestArgKeys | É igual a | /etc/passwd |
Uri: http://localhost:8080/?/etc/passwd=test |
/etc/passwd |
Cadeia de consulta | RequestArgKeys | EqualsAny | N/D | Uri: http://localhost:8080/?/etc/passwd=test&.htaccess=test2 |
/etc/passwd e .htaccess |
Cadeia de consulta | RequestArgNames | É igual a | text |
Uri: http://localhost:8080/?text=/etc/passwd |
/etc/passwd |
Cadeia de consulta | RequestArgNames | EqualsAny | N/D | Uri: http://localhost:8080/?text=/etc/passwd&text2=.cshrc |
/etc/passwd e .cshrc |
Cadeia de consulta | RequestArgValues | É igual a | text |
Uri: http://localhost:8080/?text=/etc/passwd |
/etc/passwd |
Cadeia de consulta | RequestArgValues | EqualsAny | N/D | Uri: http://localhost:8080/?text=/etc/passwd&text2=.cshrc |
/etc/passwd e .cshrc |
Corpo da solicitação | RequestArgKeys | Contém | sleep |
Corpo da solicitação: {"sleep(5)": "test"} |
sleep(5) |
Corpo da solicitação | RequestArgKeys | EqualsAny | N/D | Corpo da solicitação: {".zshrc": "value", "sleep(5)":"value2"} |
.zshrc e sleep(5) |
Corpo da solicitação | RequestArgNames | É igual a | test |
Corpo da solicitação: {"test": ".zshrc"} |
.zshrc |
Corpo da solicitação | RequestArgNames | EqualsAny | N/D | Corpo da solicitação: {"key1": ".zshrc", "key2":"sleep(5)"} |
.zshrc e sleep(5) |
Corpo da solicitação | RequestArgValues | É igual a | test |
Corpo da solicitação: {"test": ".zshrc"} |
.zshrc |
Corpo da solicitação | RequestArgValues | EqualsAny | N/D | Corpo da solicitação: {"key1": ".zshrc", "key2":"sleep(5)"} |
.zshrc e sleep(5) |
Cabeçalho | RequestHeaderKeys | É igual a | X-Scanner |
Cabeçalho: {"X-Scanner": "test"} |
X-scanner |
Cabeçalho | RequestHeaderKeys | EqualsAny | N/D | Cabeçalho: {"X-Scanner": "test", "x-ratproxy-loop": "value"} |
X-Scanner e x-ratproxy-loop |
Cabeçalho | RequestHeaderNames | É igual a | head1 |
Cabeçalho: {"head1": "X-Scanner"} |
X-scanner |
Cabeçalho | RequestHeaderNames | EqualsAny | N/D | Cabeçalho: {"head1": "myvar=1234", "User-Agent": "(hydra)"} |
myvar=1234 e (hydra) |
Cabeçalho | RequestHeaderValues | É igual a | head1 |
Cabeçalho: {"head1": "X-Scanner"} |
X-scanner |
Cabeçalho | RequestHeaderValues | EqualsAny | N/D | Cabeçalho: {"head1": "myvar=1234", "User-Agent": "(hydra)"} |
myvar=1234 e (hydra) |
Cookie | RequestCookieKeys | Contém | /etc/passwd |
Cabeçalho: {"Cookie": "/etc/passwdtest=hello1"} |
/etc/passwdtest |
Cookie | RequestCookieKeys | EqualsAny | N/D | Cabeçalho: {"Cookie": "/etc/passwdtest=hello1", "Cookie": ".htaccess=test1"} |
/etc/passwdtest e .htaccess |
Cookie | RequestCookieNames | É igual a | arg1 |
Cabeçalho: {"Cookie": "arg1=/etc/passwd"} |
/etc/passwd |
Cookie | RequestCookieNames | EqualsAny | N/D | Cabeçalho: {"Cookie": "arg1=/etc/passwd", "Cookie": "arg1=.cshrc"} |
/etc/passwd e .cshrc |
Cookie | RequestCookieValues | É igual a | arg1 |
Cabeçalho: {"Cookie": "arg1=/etc/passwd"} |
/etc/passwd |
Cookie | RequestCookieValues | EqualsAny | N/D | Cabeçalho: {"Cookie": "arg1=/etc/passwd", "Cookie": "arg1=.cshrc"} |
/etc/passwd e .cshrc |
Observação
Se você criar uma exclusão usando o seletorMatchOperator EqualsAny
, qualquer coisa que colocar no campo seletor será convertida em "*" pelo back-end quando a exclusão for criada.
Escopos de exclusão
As exclusões podem ser configuradas para se aplicar a um conjunto específico de regras do WAF, a conjuntos de regras ou globalmente em todas as regras.
Dica
É uma boa prática tornar as exclusões o mais limitadas e específicas possível, para evitar acidentalmente deixar espaço para os invasores explorarem seu sistema. Quando precisar adicionar uma regra de exclusão, use exclusões por regra sempre que possível.
Exclusões por regra
É possível configurar uma exclusão para uma regra específica, um grupo de regras ou um conjunto de regras. Especifique a regra ou as regras às quais a exclusão se aplica. Também é necessário especificar o atributo de solicitação que deve ser excluído da avaliação do WAF. Para excluir um grupo completo de regras, forneça apenas o parâmetro ruleGroupName
, o parâmetro rules
só é útil quando você deseja limitar a exclusão a regras específicas de um grupo.
As exclusões por regra estão disponíveis quando você usa o conjunto de regras OWASP (CRS) versão 3.2 ou posterior ou o conjunto de regras do Gerenciador de Bot versão 1.0 ou posterior.
Exemplo
Suponha que você queira que o WAF ignore o valor do cabeçalho de solicitação User-Agent
. O cabeçalho User-Agent
contém uma cadeia de caracteres característica que permite que os pares de protocolo de rede identifiquem o tipo de aplicativo, o sistema operacional, o fornecedor de software ou a versão de software do agente do usuário de software solicitante. Para obter mais informações, confira User-Agent.
Pode haver vários motivos para desabilitar a avaliação desse cabeçalho. Pode haver uma cadeia de caracteres que o WAF vê e supõe que seja mal-intencionada. Por exemplo, o cabeçalho User-Agent
pode incluir o ataque de injeção de SQL clássico x=x
em uma cadeia de caracteres. Em alguns casos, isso pode ser um tráfego legítimo. Portanto, talvez seja necessário excluir esse cabeçalho da avaliação do WAF.
É possível usar as seguintes abordagens para excluir o cabeçalho User-Agent
da avaliação por todas as regras de injeção de SQL:
Para configurar uma exclusão por regra usando o portal do Azure, siga estas etapas:
Navegue até a política de WAF e selecione Regras gerenciadas.
Selecione Adicionar exclusões.
Em Aplica-se a, selecione o conjunto de regras do CRS para aplicar a exclusão, como OWASP_3.2.
Selecione Adicionar regras e escolha as regras às quais você deseja aplicar as exclusões.
Configure a variável, o operador e o seletor de correspondência. Em seguida, selecione Salvar.
Você pode configurar várias exclusões.
Também é possível excluir o cabeçalho User-Agent
da avaliação apenas com a regra 942270:
Siga as etapas descritas no exemplo anterior e selecione a regra 942270 na etapa 4.
Exclusões globais
É possível configurar uma exclusão para se aplicar a todas as regras do WAF.
Exemplo
Suponha que você queira excluir o valor no parâmetro user que é transmitido na solicitação por meio da URL. Por exemplo, digamos que seja comum em seu ambiente o argumento de cadeia de caracteres user
conter uma cadeia de caracteres que o WAF vê como conteúdo mal-intencionado e bloqueia. É possível excluir todos os argumentos de cadeia de caracteres da consulta com um nome que começa com a palavra user
, para que o WAF não avalie o valor do campo.
O exemplo a seguir mostra como excluir da avaliação o argumento de cadeia de caracteres user
da consulta:
Para configurar uma exclusão global usando o portal do Azure, siga estas etapas:
Navegue até a política de WAF e selecione Regras gerenciadas.
Selecione Adicionar exclusões.
Em Aplica-se a, selecione Global
Configure a variável, o operador e o seletor de correspondência. Em seguida, selecione Salvar.
Você pode configurar várias exclusões.
Portanto, se a URL http://www.contoso.com/?user%3c%3e=joe
for examinada pelo WAF, ele não avaliará a cadeia de caracteres joe, mas ainda avaliará o nome de parâmetro user%3c%3e.
Próximas etapas
- Depois de configurar as configurações de WAF, você pode aprender como exibir os logs de WAF. Para obter mais informações, consulte Diagnósticos do Gateway de Aplicativo.
- Saiba mais sobre segurança de rede do Azure