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
- Documentação Oficial do fail2ban — Guia completo de instalação, configuração e uso do fail2ban
- Guia de Configuração SSH no Ubuntu — Tutorial oficial da Canonical sobre proteção SSH com fail2ban
- How To Protect SSH with Fail2Ban on CentOS 8 — Tutorial prático da DigitalOcean para configuração em distribuições RHEL
- fail2ban-regex Manual — Página de manual para teste e depuração de expressões regulares no fail2ban
- Guia Avançado de Filtros e Ações — Tutorial da Linode sobre personalização de filtros e criação de ações customizadas
- Integração fail2ban com Prometheus — Repositório oficial do exporter para monitoramento de métricas do fail2ban