Como configurar o Azure Application Gateway com WAF: passo a passo
Este guia mostra como configurar um Azure Application Gateway com WAF (Web Application Firewall) para proteger uma aplicação web pública. É útil porque o Application Gateway com WAF oferece inspeção ao nível HTTP(S), protege contra vulnerabilidades conhecidas (OWASP) e faz offload TLS.
Pré-requisitos
- Conta Azure com permissões para criar recursos (Network Contributor e Contributor).
- Azure CLI instalada ou acesso ao Portal do Azure.
- Uma Web App ou VM pública de teste (HTTP/HTTPS) — pode usar uma página de teste simples.
Passo 1: Criar um Resource Group
É boa prática criar um Resource Group dedicado. Aqui usamos a Azure CLI; alternativamente faça pelo Portal.
az group create --name rg-appgw-waf --location westeurope
Passo 2: Criar a VNet e subnets necessárias
O Application Gateway precisa de uma subnet própria. Crie também uma subnet para a aplicação se for VM.
az network vnet create \
--resource-group rg-appgw-waf \
--name vnet-app \
--address-prefix 10.0.0.0/16 \
--subnet-name app-subnet --subnet-prefix 10.0.1.0/24
az network vnet subnet create \
--resource-group rg-appgw-waf \
--vnet-name vnet-app \
--name appgw-subnet --address-prefix 10.0.2.0/24
Passo 3: Criar um Public IP para o Application Gateway
O Application Gateway precisa de um Public IP (estático recomendado) para servir tráfego público.
az network public-ip create \
--resource-group rg-appgw-waf \
--name appgw-pip \
--allocation-method Static \
--sku Standard
Passo 4: Criar um Backend Pool apontando para a sua aplicação
O backend pode ser um IP público, FQDN ou recurso interno. Aqui usamos um FQDN de exemplo: mywebapp.example.com.
az network application-gateway create \
--name appgw-waf \
--location westeurope \
--resource-group rg-appgw-waf \
--sku WAF_v2 \
--capacity 2 \
--vnet-name vnet-app \
--subnet appgw-subnet \
--public-ip-address appgw-pip \
--http-settings-cookie-based-affinity Disabled \
--backend-pool-name backendPool \
--backend-port 80 \
--servers mywebapp.example.com
Passo 5: Configurar Listener HTTPS (TLS) — opcional mas recomendado
Para TLS precisa de um certificado PFX armazenado no Key Vault ou carregado. Aqui exemplo com certificado local via Portal/Key Vault; pela CLI é mais complexo. Se usar apenas HTTP, pode omitir este passo.
# Este passo normalmente feito no Portal: criar HTTPS listener e associar certificado PFX
# Ou usar az network application-gateway ssl-cert create para carregar um PFX
az network application-gateway ssl-cert create \
--resource-group rg-appgw-waf \
--gateway-name appgw-waf \
--name sslCert \
--cert-file /path/to/cert.pfx \
--cert-password 'S3nh4!'
az network application-gateway http-listener create \
--resource-group rg-appgw-waf \
--gateway-name appgw-waf \
--name httpsListener \
--frontend-port 443 \
--ssl-cert sslCert
Passo 6: Ativar e configurar a WAF Policy
Crie uma WAF Policy para gerir regras OWASP, modos de deteção/block e exceções. Por defeito use o OWASP 3.2 e bloqueio em produção.
az network application-gateway waf-policy create \
--resource-group rg-appgw-waf \
--name waf-policy-prod \
--mode Prevention \
--policy-settings file-upload-limit-in-mb=100
# Associar a policy ao Application Gateway
az network application-gateway update \
--resource-group rg-appgw-waf \
--name appgw-waf \
--set wafConfiguration.enabled=true wafConfiguration.firewallMode=Prevention
# Ou associar a policy criada
az network application-gateway waf-policy update \
--resource-group rg-appgw-waf \
--name waf-policy-prod \
--set policySettings.requestBodyCheck=true
Passo 7: Testar regras personalizadas e exceções
Pode criar exclusões de regra (por exemplo para campos de upload) ou regras personalizadas se necessário. Utilize testes com payloads OWASP para validar o bloqueio.
az network application-gateway waf-policy managed-rule rule-set add \
--resource-group rg-appgw-waf \
--policy-name waf-policy-prod \
--type OWASP --version 3.2
# Para criar uma exclusion (exemplo: excluir campo JSON 'token')
az network application-gateway waf-policy custom-rule create \
--resource-group rg-appgw-waf \
--policy-name waf-policy-prod \
--name AllowTokenField \
--priority 100 \
--rule-type MatchRule \
--match-conditions "[{'matchVariables':[{'variableName':'RequestBody' }],'operator':'Contains','matchValues':['\"token\"']} ]" \
--action Allow
Verificar o resultado
1) Aceda ao Public IP do Application Gateway e carregue a sua aplicação. 2) Teste com payloads OWASP (ex.: SQLi) para confirmar que o WAF bloqueia quando em Prevention. 3) No Portal, verifique os logs em Diagnostics (ativar diagnostics para enviar para o Log Analytics) e confirme blockedRequests.
Conclusão
Já tem um Azure Application Gateway com WAF básico a proteger a sua aplicação, com TLS opcional e uma WAF Policy em modo Prevention. Próximos passos recomendados: integrar logs com o Log Analytics, automatizar com ARM/Bicep e ajustar regras geridas conforme falsos positivos. Dica: comece em modo Detection antes de passar para Prevention para afinar as regras e evitar bloqueios indesejados.