Instale um WAF (Web Application Firewall) com ModSecurity e OWASP CRS no Nginx ou Apache, ajuste falsos positivos e combine com o WAF da Cloudflare.
Para que serve
Um WAF (Web Application Firewall) analisa cada requisição HTTP antes de ela chegar ao seu site e bloqueia padrões típicos de ataque: SQL injection, XSS, inclusão de arquivos, varredura de vulnerabilidades e robôs maliciosos. Ele não corrige um sistema vulnerável, mas ganha tempo até a atualização e corta boa parte do ruído automatizado. Este artigo mostra duas formas de ter WAF: no próprio servidor, com ModSecurity + OWASP Core Rule Set (CRS), e na borda, com a Cloudflare.
Pré-requisitos
- VM ou servidor com Debian 12/13 ou Ubuntu 24.04 rodando Nginx ou Apache.
- Acesso root e um ambiente de teste (ou janela de manutenção): o WAF pode bloquear funções legítimas do site até ser ajustado.
- Os logs de erro do servidor web acessíveis (
/var/log/nginx/ou/var/log/apache2/).
WAF local ou WAF na Cloudflare?
| ModSecurity + CRS (local) | Cloudflare (borda) | |
|---|---|---|
| Custo | Gratuito | Regras gerenciadas básicas no plano gratuito; conjunto completo nos planos pagos |
| Consumo do servidor | Usa CPU da VM em cada requisição | Nenhum |
| Controle | Total, com logs detalhados | Pelo painel da Cloudflare |
| Ponto fraco | Exige ajuste de falsos positivos | Se o IP de origem vazar, o atacante contorna a Cloudflare |
As duas camadas podem ser usadas juntas. Lembre que o AntiDDoS da infraestrutura protege contra volume de tráfego; o WAF trata o conteúdo das requisições.
Passo a passo: ModSecurity com OWASP CRS no Apache
- Instale os pacotes:
sudo apt update sudo apt install libapache2-mod-security2 modsecurity-crs - Ative a configuração recomendada:
Ela vem emsudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.confSecRuleEngine DetectionOnly: registra, mas não bloqueia. Deixe assim nos primeiros dias. - Reinicie e confira o módulo:
sudo apache2ctl configtest && sudo systemctl restart apache2 sudo apache2ctl -M | grep security2
Passo a passo: ModSecurity com OWASP CRS no Nginx
- Instale o módulo e as regras:
sudo apt install libnginx-mod-http-modsecurity modsecurity-crs - Copie os arquivos de exemplo do pacote (o próprio pacote do Debian documenta isso no
README.Debian):sudo cp /usr/share/nginx/modsecurity/modsecurity.conf /etc/nginx/ sudo cp /usr/share/nginx/modsecurity/modsecurity_includes.conf /etc/nginx/ sudo cp /usr/share/nginx/modsecurity/unicode.mapping /etc/nginx/ - Carregue o CRS: em
/etc/nginx/modsecurity_includes.conf, descomente a linha que inclui/usr/share/modsecurity-crs/owasp-crs.load. - Ative no site, dentro do bloco
server:modsecurity on; modsecurity_rules_file /etc/nginx/modsecurity_includes.conf; - Teste e recarregue:
sudo nginx -t && sudo systemctl reload nginx
O Debian 13 traz o CRS da série 3.3 nos repositórios. Se você precisar da série 4.x, baixe-a do projeto oficial em coreruleset.org e aponte os includes para a nova pasta.
Ajuste de falsos positivos e ativação do bloqueio
- Observe o log de auditoria por alguns dias navegando pelo site, usando o painel administrativo, enviando formulários e fazendo uploads:
# Apache sudo grep -o 'id "[0-9]*"' /var/log/apache2/modsec_audit.log | sort | uniq -c | sort -rn | head # Nginx sudo grep -o 'id "[0-9]*"' /var/log/nginx/modsec_audit.log | sort | uniq -c | sort -rn | head - Crie exclusões específicas para o que for legítimo, em vez de desligar o WAF. Exemplo: desligar uma regra só na área administrativa de um sistema:
Coloque essas exclusões em um arquivo carregado antes das regras do CRS.SecRule REQUEST_URI "@beginsWith /admin/editor" \ "id:1000,phase:1,pass,nolog,ctl:ruleRemoveById=942100" - Mantenha o nível de paranoia 1 (padrão). Níveis mais altos pegam mais ataques, mas geram muito mais falsos positivos.
- Ative o bloqueio trocando em
modsecurity.conf:
e recarregue o servidor web. Se preferir uma transição mais suave, ative o bloqueio com o limite de pontuação de anomalia alto e vá baixando até o padrão (5).SecRuleEngine On
Passo a passo: WAF da Cloudflare
- Aponte o DNS do domínio para a Cloudflare e deixe o registro do site como Proxied (nuvem laranja).
- Em Security → WAF, ative as regras gerenciadas disponíveis no seu plano.
- Crie regras personalizadas, por exemplo: desafio (Managed Challenge) para
/wp-login.phpou/administratorvindo de fora do Brasil, ou bloqueio de/xmlrpc.php. - Feche a origem: no firewall da VM, aceite 80 e 443 apenas das faixas publicadas em
https://www.cloudflare.com/ips/. Sem isso, quem descobrir o IP do servidor ataca direto, sem passar pelo WAF. - No servidor web, restaure o IP real do visitante (módulo
realipno Nginx ouremoteipno Apache), para que logs e ModSecurity vejam o cliente verdadeiro.
Como saber se funcionou
Faça uma requisição de teste inofensiva que o CRS reconhece como ataque:
curl -s -o /dev/null -w "%{http_code}\n" "https://www.exemplo.com.br/?id=1%20OR%201=1"
Com SecRuleEngine On, o retorno deve ser 403, e o log de auditoria deve registrar a regra disparada. Em DetectionOnly, o retorno é 200, mas o evento aparece no log. Na Cloudflare, o evento aparece em Security → Events.
Problemas comuns
- Painel administrativo ou editor de páginas dá 403: falso positivo. Encontre o ID da regra no log e crie a exclusão para aquela URL.
- Upload de arquivo grande falha: ajuste
SecRequestBodyLimitemmodsecurity.confpara o tamanho máximo que o site aceita. - Site ficou lento: o CRS inspeciona cada requisição. Exclua da análise arquivos estáticos e verifique se a VM tem CPU suficiente.
- Todos os bloqueios mostram IPs da Cloudflare: falta configurar o IP real (
realip/remoteip).
Perguntas frequentes
O WAF substitui atualizar o CMS e os plugins?
Não. O WAF reduz a exposição, mas ataques novos ou específicos passam. Atualização continua sendo a defesa principal.
Posso usar WAF com cPanel ou Plesk?
Sim. Os dois têm integração com ModSecurity e permitem ativar o OWASP CRS pelo próprio painel.
O WAF protege contra DDoS?
Contra ataques de volume, não; isso é papel da proteção AntiDDoS da rede. Contra abuso em camada 7 (muitas requisições ao login, por exemplo), regras de limite de taxa no WAF ou no Nginx ajudam.
Leitura complementar
Precisa de ajuda?
Se o site ficou fora do ar após ativar o WAF ou as regras de firewall e você não consegue acessar a VM, abra um ticket ou chame o suporte 24/7.
