Se tens um servidor exposto à internet, o Fail2ban é a primeira linha de defesa depois do firewall. Mas a configuração predefinida é apenas o início: é quando crias jails personalizados que ele se torna realmente poderoso.
Quando comecei a administrar servidores, o Fail2ban era "aquele programa que bloqueia SSH depois de 3 tentativas". Funcionava, mas os logs estavam cheios de "5 failures from 1.2.3.4" e o fail2ban-client status sshd mostrava uma lista interminável de IPs banidos.
Com o tempo, percebi que o Fail2ban é muito mais que isso. Pode analisar logs do Apache, Nginx, Postfix, Dovecot, e virtualmente qualquer serviço que escreva logs. Com failregex personalizados, detetas padrões de ataque que os filtros padrão nem sonham.
Vou mostrar-te:
- Arquitetura do Fail2ban: jails, filters, actions
- Jails personalizados com regex custom
- Whitelist e ações: email, webhook, script
- Receitas de failregex para Apache, SSH, Nginx
- O jail recidive e boas práticas de produção
⬆ Como o Fail2ban processa logs, aplica filtros e executa ações
Arquitetura: jails, filters, actions
O Fail2ban é modular. Cada componente tem uma função específica:
| Componente | O que faz | Onde se define |
|---|---|---|
| Jail | Configuração que junta um filter + action + parâmetros (findtime, maxretry, bantime) | /etc/fail2ban/jail.conf ou jail.local |
| Filter | Ficheiro com expressões regulares (failregex) que extraem IPs dos logs | /etc/fail2ban/filter.d/ |
| Action | O que fazer quando um IP excede o limite (banir, enviar email, webhook) | /etc/fail2ban/action.d/ |
| Banaction | Comando específico para banir (iptables, nftables, firewall-cmd, cloudflare) | Definido na action |
O ficheiro principal de configuração é o /etc/fail2ban/jail.local. Nunca edites o jail.conf diretamente: as actualizações do Fail2ban substituem-no.
Jails personalizados com regex
Os jails pré-definidos são ok, mas o verdadeiro poder está em criar os teus. Aqui está um exemplo para detetar ataques ao WordPress (wp-login.php brute force):
E o filter correspondente:
Dica: O <HOST> no failregex é um placeholder especial que o Fail2ban substitui por um grupo de captura para o IP. Usa sempre <HOST> em vez de \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}: é mais legível e mais rápido.
Exemplos de failregex para o dia-a-dia
| Serviço | Padrão a detetar | failregex |
|---|---|---|
| SSH | Falha de autenticação | ^<HOST>.*Failed password for.*from <HOST> |
| Apache 401 | Acesso não autorizado | ^<HOST>.* 401 \d+ |
| Nginx 404 | Scan de diretórios | ^<HOST>.* 404 \d+ ".*" |
| Postfix | Autenticação SMTP falhada | ^<HOST>.*SASL LOGIN authentication failed |
| Dovecot | Login falhado | ^<HOST>.*dovecot.*Auth failed |
| ProFTPD | FTP brute force | ^<HOST>.*proftpd.*authentication failed |
Whitelist: ignoreip e ignoreself
Não há nada pior que ficares bloqueado do teu próprio servidor. Configura a whitelist no [DEFAULT]:
Ações: email, webhook e scripts
Para além de banir, o Fail2ban pode notificar-te. Aqui fica um exemplo de ação personalizada que envia um alerta para o Slack via webhook:
Depois, ativa a ação no jail:
Ou para enviar email com o sendmail:
O jail recidive: para reincidentes
Este é um dos meus jails favoritos. O recidive monitoriza os bans do próprio Fail2ban. Se um IP for banido várias vezes (reincidente), o recidive bane-o por muito mais tempo:
Isto é fantástico contra botnets que tentam SSH de hora a hora com IPs diferentes (mas que eventualmente reincidem).
Monitorização com fail2ban-client
O fail2ban-client é a ferramenta de admin do dia-a-dia:
⬆ Output do fail2ban-client status sshd: IPs banidos e estatísticas
Boas práticas de produção
| Prática | Porquê |
|---|---|
| Usa jail.local, não jail.conf | As atualizações do Fail2ban substituem o jail.conf. O jail.local faz merge seguro |
| Testa o failregex | Usa fail2ban-regex /var/log/auth.log "<HOST>.*Failed" para testar antes de aplicar |
| Define bantime progressivo | Usa o jail recidive para aumentar o tempo de ban para reincidentes |
| Não uses bantime = -1 | Ban permanente? Só se sabes que o IP é malicioso para sempre. Usa 1w ou 1m |
| Monitoriza com fail2ban-client | Cria um cron ou script que corre fail2ban-client status periodicamente |
Recapitulando
- Arquitetura: jails (config) + filters (regex) + actions (o que fazer)
- Jails personalizados com failregex para qualquer serviço
- Whitelist com ignoreip para nunca bloqueares os teus IPs
- Ações: email, Slack webhook, scripts personalizados
- Jail recidive para banir reincidentes por mais tempo
- fail2ban-client para monitorização e bans manuais
O Fail2ban é uma ferramenta que recompensa quem a configura a fundo. Os jails pré-definidos são um bom começo, mas é quando crias os teus próprios filtros que ele se torna uma arma poderosa contra bots e atacantes.
Experimenta criar um jail para o WordPress hoje mesmo: vais ficar surpreendido com quantos bots tentam o wp-login.php.
Comentários (0)
Nenhum comentário ainda. Seja o primeiro!
Deixar comentário