ModSecurity e Fail2ban

De wiki.franca.unesp.br
Revisão de 16h58min de 31 de agosto de 2026 por Guilherme (Discussão | contribs) (Created page with "== Implementação de WAF com ModSecurity (OWASP CRS v4) e Fail2Ban no Debian Linux == Este guia fornece o passo a passo completo para instalar, configurar e hardening de um...")
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para: navegação, pesquisa

Implementação de WAF com ModSecurity (OWASP CRS v4) e Fail2Ban no Debian Linux

Este guia fornece o passo a passo completo para instalar, configurar e hardening de um servidor web Apache rodando WordPress utilizando o ModSecurity v2 (WAF), o OWASP Core Rule Set (CRS) v4 com o plugin oficial de exclusões para WordPress, e a integração com o Fail2Ban para bloqueio automático de atacantes a nível de firewall.

Passo 1: Atualização do Sistema e Instalação dos Pacotes

Primeiramente, atualize os repositórios do sistema operacional Debian e instale os módulos necessários do Apache e o Fail2Ban.

sudo apt update && sudo apt upgrade -y
sudo apt install libapache2-mod-security2 fail2ban unzip -y

Passo 2: Configuração e Ativação do ModSecurity

Por padrão, o ModSecurity é instalado no modo de simulação (DetectionOnly). É necessário criar o arquivo de configuração de produção e ativar o motor de regras.

1. Duplique o arquivo de configuração recomendado:

sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

2. Edite o arquivo principal:

sudo nano /etc/modsecurity/modsecurity.conf

3. Altere a seguinte diretiva no início do arquivo para ativar o bloqueio (mude de DetectionOnly para On):

SecRuleEngine On

Passo 3: Instalação do OWASP Core Rule Set (v4)

O Debian traz por padrão regras antigas. Para garantir a segurança moderna e suporte a plugins isolados, instalamos a versão estável atualizada do OWASP CRS v4 direto da fonte.

1. Crie o diretório de destino e acesse-o:

sudo mkdir -p /etc/modsecurity/owasp-crs
cd /etc/modsecurity/owasp-crs

2. Faça o download da última release estável do repositório oficial da OWASP:

sudo wget https://github.com

3. Extraia o conteúdo baixado e limpe os arquivos temporários:

sudo tar -xvf v4.9.0.tar.gz
sudo mv coreruleset-4.9.0/* ./
sudo rm -rf coreruleset-4.9.0 v4.9.0.tar.gz

4. Crie o arquivo base de parametrização do CRS:

sudo cp crs-setup.conf.example crs-setup.conf

Passo 4: Instalação do Plugin de Exclusão do WordPress

Para evitar falsos positivos no WordPress (erros como o Gutenberg falhar ao salvar posts ou problemas na API REST), deve-se usar o plugin oficial da OWASP para CRS v4.

1. Acesse o diretório de plugins do WAF:

cd /etc/modsecurity/owasp-crs/plugins

2. Baixe o código fonte estável diretamente do repositório específico da OWASP:

sudo wget https://github.com

3. Extraia os arquivos e posicione-os na pasta raiz de plugins:

sudo unzip master.zip
sudo cp wordpress-rule-exclusions-plugin-master/plugins/wordpress-rule-exclusions-config.conf ./
sudo cp wordpress-rule-exclusions-plugin-master/plugins/wordpress-rule-exclusions-before.conf ./
sudo rm -rf wordpress-rule-exclusions-plugin-master master.zip

Passo 5: Vinculação das Regras no Apache

Configure o Apache para carregar todos os módulos e os arquivos criados rigorosamente na ordem correta exigida pela arquitetura de plugins do CRS v4.

1. Abra o arquivo de configuração do módulo de segurança do Apache:

sudo nano /etc/apache2/mods-enabled/security2.conf

2. Substitua integralmente o bloco interno da tag <IfModule security2_module> pelo código abaixo:

<IfModule security2_module>
    # Diretório de dados e arquivo base do ModSecurity
    SecDataDir /var/cache/modsecurity
    Include /etc/modsecurity/modsecurity.conf

    # 1. Configuração base do OWASP CRS
    Include /etc/modsecurity/owasp-crs/crs-setup.conf

    # 2. Configurações dos Plugins (Carregados ANTES das regras gerais)
    Include /etc/modsecurity/owasp-crs/plugins/*-config.conf
    Include /etc/modsecurity/owasp-crs/plugins/*-before.conf

    # 3. Regras de Ataque Gerais do OWASP CRS
    Include /etc/modsecurity/owasp-crs/rules/*.conf
    
    # 4. Plugins que rodam DEPOIS das regras básicas
    Include /etc/modsecurity/owasp-crs/plugins/*-after.conf
</IfModule>

3. Valide se a sintaxe estrutural do Apache não possui erros:

sudo apache2ctl configtest
  • Certifique-se de que o comando retorne apenas a mensagem: Syntax OK.*

4. Reinicie o serviço do Apache se o teste passar com sucesso:

sudo systemctl restart apache2

Passo 6: Integração Automatizada com o Fail2Ban

O ModSecurity enviará os alertas de segurança para o arquivo de erros do Apache. O Fail2Ban lerá esse arquivo e bloqueará o IP do atacante diretamente no firewall do Linux após seguidas tentativas de ataque.

1. Abra o arquivo de configuração global do Fail2Ban para definir uma Whitelist e evitar o seu próprio banimento:

sudo nano /etc/fail2ban/jail.local

2. Localize a seção [DEFAULT] e certifique-se de que a linha ignoreip contenha o IP da sua rede administrativa:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 SEU_IP_DE_CASA_OU_ESCRITORIO

3. Crie um arquivo isolado para a "Jail" (jaula) do ModSecurity:

sudo nano /etc/fail2ban/jail.d/apache-modsecurity.conf

4. Insira a seguinte regra:

[apache-modsecurity]
enabled  = true
port     = http,https
filter   = apache-modsecurity
logpath  = /var/log/apache2/error.log
maxretry = 3
findtime = 600
bantime  = 3600

5. Reinicie o serviço do Fail2Ban para aplicar a nova jaula:

sudo systemctl enable fail2ban
sudo systemctl restart fail2ban

Passo 7: Comandos de Auditoria, Testes e Operação

  • Simular um ataque (WAF e Fail2Ban): Execute o comando abaixo a partir de uma máquina externa para validar se o servidor retorna erro 403. Se executado 3 vezes seguidas dentro de 10 minutos, seu IP externo será completamente banido do servidor.
curl -I "http://seu-dominio-wordpress.com"
  • Monitorar logs do ModSecurity em tempo real:
sudo tail -f /var/log/apache2/error.log
  • Verificar os IPs banidos atualmente pelo Fail2Ban:
sudo fail2ban-client status apache-modsecurity
  • Remover o banimento (Unban) de um IP legítimo pego por engano:
sudo fail2ban-client set apache-modsecurity unbanip IP_DO_USUARIO