Como configurar fail2ban para proteger servidores SSH

1. Introdução ao fail2ban e sua importância para segurança SSH

O fail2ban é um sistema de prevenção de intrusão baseado em logs que protege servidores contra ataques automatizados. Sua função principal é monitorar arquivos de log em busca de padrões suspeitos, como múltiplas tentativas de autenticação SSH falhas, e então bloquear temporariamente o endereço IP ofensor através de regras de firewall (iptables ou nftables).

A proteção do serviço SSH é crítica porque este é um dos principais vetores de ataque em servidores Linux. Ataques de força bruta e dicionário são constantes na internet, onde bots varrem redes inteiras tentando combinações comuns de usuário/senha. Sem proteção adequada, um servidor SSH pode ser comprometido em minutos.

O fail2ban funciona através de três componentes principais:
- Filtros: expressões regulares que identificam tentativas de autenticação falhas nos logs
- Jails: configurações que associam um filtro a uma ação específica
- Ações: comandos executados quando um limite de tentativas é atingido (como adicionar regra ao firewall)

2. Instalação do fail2ban no servidor Linux

A instalação varia conforme a distribuição. Exemplos para os principais gerenciadores de pacotes:

# Ubuntu/Debian (apt)
sudo apt update
sudo apt install fail2ban -y

# CentOS/RHEL 7 (yum)
sudo yum install epel-release -y
sudo yum install fail2ban -y

# Fedora/RHEL 8+ (dnf)
sudo dnf install fail2ban -y

Após a instalação, verifique a versão e as dependências:

fail2ban-server --version
python3 --version
which iptables || which nft

A estrutura de diretórios do fail2ban inclui:
- /etc/fail2ban/ — diretório principal de configuração
- /etc/fail2ban/jail.conf — configuração padrão (não modificar diretamente)
- /etc/fail2ban/jail.d/ — diretório para configurações personalizadas
- /etc/fail2ban/filter.d/ — filtros pré-definidos
- /var/log/fail2ban.log — logs do serviço

3. Configuração básica do jail para SSH

Nunca edite o arquivo jail.conf diretamente, pois ele pode ser sobrescrito em atualizações. Crie um arquivo jail.local ou um arquivo em /etc/fail2ban/jail.d/:

sudo nano /etc/fail2ban/jail.local

Configuração mínima para proteger SSH:

[DEFAULT]
# Ignorar IPs confiáveis (separados por espaço)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24

# Tempo de banimento em segundos (1 hora = 3600)
bantime = 3600

# Janela de análise em segundos (10 minutos = 600)
findtime = 600

# Número máximo de tentativas antes do ban
maxretry = 5

# Ação padrão (ban por iptables)
banaction = iptables-multiport

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400

Para distribuições que usam systemd-journald, o logpath pode ser diferente:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 3

Após configurar, inicie e habilite o serviço:

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

4. Ajustes avançados de parâmetros de bloqueio

Parâmetros importantes para ajuste fino da proteção:

[DEFAULT]
# Banimento permanente (valor negativo)
bantime = -1

# Banimento progressivo (aumenta a cada reincidência)
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 2592000  # 30 dias

# Ignorar IPs específicos
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 10.0.0.0/8

# Notificação por e-mail
action = %(action_mw)s  # envia e-mail com whois
mta = sendmail
destemail = admin@seudominio.com
sender = fail2ban@seudominio.com

Configuração de jail específico com parâmetros próprios:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 2
findtime = 300
bantime = 604800  # 7 dias
ignoreip = 192.168.1.100

5. Criação e personalização de filtros (filters)

O filtro padrão para SSH está em /etc/fail2ban/filter.d/sshd.conf e usa expressões regulares para capturar tentativas de autenticação falhas. Para criar um filtro personalizado:

sudo nano /etc/fail2ban/filter.d/ssh-custom.conf

Exemplo de filtro personalizado:

[Definition]
failregex = ^%(__prefix_line)sFailed password for .* from <HOST> port \d+ ssh2$
            ^%(__prefix_line)sConnection closed by authenticating user .* <HOST> port \d+ \[preauth\]$
ignoreregex =

Para testar se o filtro funciona corretamente:

sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

6. Gerenciamento e monitoramento do fail2ban

Comandos essenciais para administração diária:

# Status geral do fail2ban
sudo fail2ban-client status

# Status de um jail específico
sudo fail2ban-client status sshd

# Desbanir um IP manualmente
sudo fail2ban-client set sshd unbanip 192.168.1.200

# Banir um IP manualmente
sudo fail2ban-client set sshd banip 192.168.1.200

# Recarregar configurações
sudo fail2ban-client reload

# Verificar logs
sudo tail -f /var/log/fail2ban.log

Exemplo de saída do comando status:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 3
|  |- Total failed: 145
|  `- File list: /var/log/auth.log
`- Actions
   |- Currently banned: 2
   |- Total banned: 12
   `- Banned IP list: 203.0.113.5 198.51.100.20

7. Boas práticas e integração com outras ferramentas

Whitelist para IPs confiáveis:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16

Configuração de múltiplos jails:

[sshd]
enabled = true

[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 5

[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5

Integração com sistemas de monitoramento:

Exporte métricas do fail2ban para Prometheus usando o fail2ban_exporter:

# Instalar o exporter
wget https://github.com/.../fail2ban_exporter
./fail2ban_exporter --port=9191

8. Solução de problemas comuns

Verificar se o serviço está rodando:

sudo systemctl status fail2ban

Logs não sendo lidos corretamente:

Verifique permissões do arquivo de log:

sudo ls -la /var/log/auth.log
sudo usermod -a -G adm fail2ban  # para acesso a logs

Conflitos com firewalls existentes:

Se usar UFW, desabilite o gerenciamento de iptables pelo fail2ban:

[DEFAULT]
banaction = ufw

Erros de sintaxe em arquivos de configuração:

Valide a configuração antes de recarregar:

sudo fail2ban-client -d | grep -i error
sudo fail2ban-client reload

Referências