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

Arquitetura do Fail2ban

⬆ 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:

ComponenteO que fazOnde se define
JailConfiguração que junta um filter + action + parâmetros (findtime, maxretry, bantime)/etc/fail2ban/jail.conf ou jail.local
FilterFicheiro com expressões regulares (failregex) que extraem IPs dos logs/etc/fail2ban/filter.d/
ActionO que fazer quando um IP excede o limite (banir, enviar email, webhook)/etc/fail2ban/action.d/
BanactionComando 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.

# Estrutura típica de um jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8 10.0.0.0/8 192.168.0.0/16
bantime  = 1h
findtime = 10m
maxretry = 5

[sshd]
enabled  = true
port     = ssh
logpath  = %(sshd_log)s

[apache-auth]
enabled  = true
port     = http,https
logpath  = %(apache_error_log)s
Copy

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):

# /etc/fail2ban/jail.local — jail personalizado para WordPress
[wordpress-auth]
enabled  = true
port     = http,https
filter   = wordpress-auth
logpath  = /var/log/apache2/access.log
maxretry = 10
findtime = 300    # 5 minutos
bantime  = 3600   # 1 hora
Copy

E o filter correspondente:

# /etc/fail2ban/filter.d/wordpress-auth.conf
[Definition]
failregex = ^<HOST> .* POST /wp-login\.php HTTP/\d\.\d" 200
            ^<HOST> .* POST /xmlrpc\.php HTTP/\d\.\d" 200

ignoreregex =
Copy

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çoPadrão a detetarfailregex
SSHFalha de autenticação^<HOST>.*Failed password for.*from <HOST>
Apache 401Acesso não autorizado^<HOST>.* 401 \d+
Nginx 404Scan de diretórios^<HOST>.* 404 \d+ ".*"
PostfixAutenticação SMTP falhada^<HOST>.*SASL LOGIN authentication failed
DovecotLogin falhado^<HOST>.*dovecot.*Auth failed
ProFTPDFTP 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]:

[DEFAULT]
# IPs que nunca são banidos
ignoreip = 127.0.0.1/8
            ::1
            10.0.0.0/8
            172.16.0.0/12
            192.168.0.0/16
            xxx.xxx.xxx.xxx  # o teu IP fixo de casa/escritório

# Não banir o próprio servidor (útil se ele faz pedidos a si mesmo)
ignoreself = true
Copy

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:

# /etc/fail2ban/action.d/slack.conf
[Definition]
actionban = curl -s -o /dev/null -X POST -H 'Content-type: application/json' \
    --data '{"text":"🚫 Fail2ban baniu <ip> para <jail> (<failures> falhas)"}' \
    https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXX
Copy

Depois, ativa a ação no jail:

[sshd]
enabled  = true
action   = %(action_)s
           slack
Copy

Ou para enviar email com o sendmail:

[DEFAULT]
destemail = [email protected]
sender   = [email protected]
action   = %(action_mwl)s  # envia email com whois e lines relacionadas
Copy

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:

[recidive]
enabled  = true
logpath  = /var/log/fail2ban.log
bantime  = 1w      # 1 semana para reincidentes
findtime = 1d      # num período de 1 dia
maxretry = 3       # se foi banido 3 vezes
Copy

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:

# Ver status de todos os jails
fail2ban-client status

# Ver detalhes de um jail específico
fail2ban-client status sshd

# Desbanir um IP manualmente
fail2ban-client set sshd unbanip 1.2.3.4

# Banir manualmente (útil para scripts)
fail2ban-client set sshd banip 1.2.3.4

# Ver log em tempo real
journalctl -fu fail2ban

# Recarregar configuração sem reiniciar
fail2ban-client reload
Copy

fail2ban-client status

⬆ Output do fail2ban-client status sshd: IPs banidos e estatísticas


Boas práticas de produção

PráticaPorquê
Usa jail.local, não jail.confAs atualizações do Fail2ban substituem o jail.conf. O jail.local faz merge seguro
Testa o failregexUsa fail2ban-regex /var/log/auth.log "<HOST>.*Failed" para testar antes de aplicar
Define bantime progressivoUsa o jail recidive para aumentar o tempo de ban para reincidentes
Não uses bantime = -1Ban permanente? Só se sabes que o IP é malicioso para sempre. Usa 1w ou 1m
Monitoriza com fail2ban-clientCria 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.

Recursos adicionais

Comentários (0)

Nenhum comentário ainda. Seja o primeiro!

Deixar comentário