A segurança de um servidor Linux não depende apenas da configuração inicial do sistema operacional, mas sim da capacidade de responder dinamicamente a ameaças emergentes. O Fail2ban é uma ferramenta essencial no arsenal de qualquer administrador de sistemas, atuando como um filtro inteligente que monitora logs e bloqueia endereços IP maliciosos através do firewall do sistema. Enquanto a configuração padrão do Fail2ban oferece proteção robusta para SSH e serviços web básicos, ambientes reais exigem personalizações finas para proteger aplicações específicas, APIs e serviços internos sem gerar falsos positivos.
Neste tutorial, vamos além da instalação básica. Você aprenderá a criar filtros personalizados, definir ações de bloqueio granulares e integrar o Fail2ban com outras ferramentas de segurança como CrowdSec e auditd. O foco aqui é o hardening de VPS e servidores dedicados, garantindo que sua infraestrutura esteja preparada para mitigar ataques de força bruta, scanners de portas e tentativas de exploração de vulnerabilidades em serviços não padrão.
1. Preparação do Ambiente e Instalação
Antes de configurar regras complexas, é fundamental garantir que o ambiente esteja limpo e atualizado. A instalação do Fail2ban varia conforme a distribuição Linux utilizada. Para sistemas baseados em Debian e Ubuntu, o processo é direto através do gerenciador de pacotes apt.
- Atualize a lista de pacotes disponíveis:
sudo apt update && sudo apt upgrade -y
Em seguida, instale o Fail2ban e suas dependências necessárias para manipulação de logs e integração com firewalls:
- Instale os pacotes principais:
sudo apt install fail2ban fail2ban-systemd rsyslog -y
Para sistemas Red Hat, CentOS ou AlmaLinux, utilize o yum ou dnf:
sudo yum install epel-release
sudo yum install fail2ban
Após a instalação, é crucial verificar se o serviço está ativo e configurado para iniciar automaticamente no boot. Isso garante que a proteção esteja sempre ativa, mesmo após reinicializações do servidor.
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo systemctl status fail2ban
2. Entendendo a Arquitetura de Configuração
O Fail2ban opera baseado em três pilares principais: jails, filtros e ações. Um "jail" é uma regra que combina um filtro (que analisa o log) com uma ação (o que fazer ao detectar uma violação). Os filtros utilizam expressões regulares (regex) para identificar padrões nos arquivos de log do sistema. As ações definem como o bloqueio ocorre, geralmente através de comandos iptables, nftables ou UFW.
A estrutura padrão de configuração reside em /etc/fail2ban/. O arquivo jail.local é onde suas configurações personalizadas devem residir. Nunca edite o jail.conf diretamente, pois ele será sobrescrito durante atualizações do pacote. Sempre copie as configurações padrão para o jail.local e modifique apenas o necessário.
3. Hardening de SSH com Fail2ban
O SSH é frequentemente o primeiro vetor de ataque em qualquer servidor exposto à internet. O filtro padrão do Fail2ban para SSH é eficaz, mas pode ser aprimorado para reduzir a latência e aumentar a segurança.
Comece criando ou editando o arquivo /etc/fail2ban/jail.local. Vamos definir uma configuração otimizada para SSH que utiliza chaves SSH como prática recomendada, mas ainda assim protege contra tentativas de login com senha:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
backend = systemd
maxretry = 3
bantime = 3600
findtime = 600
ignoreip = 127.0.0.1/8 ::1
Nesta configuração, explicamos os parâmetros críticos:
- maxretry = 3: Bloqueia o IP após apenas 3 tentativas falhas. Para SSH, ser restritivo é uma boa prática.
- bantime = 3600: O bloqueio dura uma hora (3600 segundos). Em ataques persistentes, aumente este valor para
86400(24 horas). - findtime = 600: A janela de tempo em que as tentativas devem ocorrer para contar como uma violação. Aqui, 10 minutos.
- ignoreip: Lista de IPs permitidos. Adicione aqui o IP do seu administrador ou a VPN corporativa para evitar ser bloqueado acidentalmente.
Se você utiliza SSH keys, certifique-se de desativar login por senha no arquivo /etc/ssh/sshd_config com a opção PasswordAuthentication no. O Fail2ban complementa essa medida bloqueando os scanners que ainda tentam forçar o acesso.
4. Criando Filtros Personalizados para Serviços Específicos
Muitas vezes, você hospeda aplicações web ou serviços internos que não são cobertos pelos filtros padrão. Vamos criar um filtro personalizado para proteger uma aplicação web específica que registra tentativas de login falhas em seu próprio arquivo de log.
Crie um novo arquivo de filtro em /etc/fail2ban/filter.d/myapp-custom.conf:
[Definition]
failregex = ^%(__prefix_line)sAuthentication failure for .* from <HOST>$
^%(__prefix_line)sFailed password for .* from <HOST> port \d+ ssh2$
ignoreregex =
O failregex contém as expressões regulares que o Fail2ban tentará corresponder ao conteúdo do log. O marcador <HOST> é especial; ele diz ao Fail2ban para extrair o endereço IP da linha de log e usá-lo como alvo do bloqueio.
Agora, crie o jail correspondente no jail.local:
[myapp-custom]
enabled = true
port = http,https
filter = myapp-custom
logpath = /var/log/myapp/application.log
maxretry = 5
bantime = 7200
findtime = 300
Reinicie o serviço para aplicar as mudanças:
sudo systemctl restart fail2ban
5. Integração com UFW e Firewalls Modernos
O Fail2ban precisa de permissão para interagir com o firewall do sistema. No Ubuntu, o UFW (Uncomplicated Firewall) é comum. Para que o Fail2ban bloqueie IPs via UFW, você deve ajustar a configuração da ação.
Edite o arquivo /etc/fail2ban/action.d/ufw.conf e verifique se a linha actionban está configurada corretamente. Em versões recentes, o Fail2ban detecta automaticamente o firewall ativo, mas é bom verificar:
[Init]
name = default
port = 0:65535
protocol = tcp
banaction = ufw
banaction_allports = ufw-all
Se você estiver em um ambiente mais moderno, considere migrar para nftables. O Fail2ban suporta nftables nativamente em versões recentes. A vantagem é a melhor performance e gerenciamento de regras complexas.
6. Monitoramento de Invasão e Logs Avançados
A segurança não termina no bloqueio. Você precisa monitorar o que está acontecendo. O Fail2ban gera logs próprios em /var/log/fail2ban.log. Use comandos grep para investigar atividades suspeitas:
sudo grep "Ban" /var/log/fail2ban.log | tail -n 20
Para um monitoramento mais proativo, integre o Fail2ban com auditd. O auditd é um daemon do kernel que registra eventos de segurança detalhados. Embora o Fail2ban não analise logs do auditd diretamente por padrão, você pode configurar scripts personalizados ou usar ferramentas como CrowdSec para correlacionar dados.
O CrowdSec é uma alternativa moderna e colaborativa ao Fail2ban. Ele utiliza uma abordagem de "reputação" baseada em comunidade. Se você optar por usar CrowdSec, ele pode atuar como um layer adicional, bloqueando IPs maliciosos identificados globalmente antes que eles cheguem ao seu sistema local.
Para instalar o CrowdSec e integrá-lo:
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
sudo apt install crowdsec crowdsec-firewall-bouncer-iptables
O bouncer do CrowdSec pode trabalhar em conjunto com o Fail2ban. Configure-o para ler os mesmos logs ou, preferencialmente, deixe o Fail2ban lidar com serviços locais e o CrowdSec com ameaças globais.
7. Mitigação DDoS e Limites de Taxa
O Fail2ban não é uma solução completa para ataques DDoS volumétricos (Layer 7 ou Layer 3/4 massivos). No entanto, ele pode ajudar na mitigação de DDoS de aplicação, como HTTP floods ou scanners de vulnerabilidade.
Crie um jail específico para proteger contra requisições excessivas. O filtro http-auth ou filtros personalizados baseados em status codes 4xx e 5xx são úteis:
[http-attacks]
enabled = true
port = http,https
filter = http-auth
logpath = /var/log/nginx/access.log
maxretry = 10
bantime = 600
Além disso, considere usar módulos de rate limiting no Nginx ou Apache em conjunto com o Fail2ban. O Fail2ban bloqueia após a falha ocorrer; o rate limiting previne que o servidor seja sobrecarregado antes do bloqueio.
8. Boas Práticas e Manutenção Contínua
A configuração de segurança é um processo contínuo, não um evento único. Siga estas práticas para manter seu sistema robusto:
- Teste suas configurações: Use o comando
fail2ban-regexpara testar se seus filtros estão correspondendo corretamente aos logs antes de reiniciar o serviço.
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
- Audite regularmente: Verifique os jails ativos e o tempo de banimento semanalmente.
- Mantenha o sistema atualizado: Atualizações do Fail2ban frequentemente corrigem bugs de regex e melhoram a compatibilidade com novos logs.
- Não ignore os falsos positivos: Se um cliente legítimo for bloqueado, adicione seu IP ao
ignoreipou ajuste omaxretry. Use ferramentas comofail2ban-clientpara desbloquear IPs manualmente se necessário:
sudo fail2ban-client set sshd unbanip 192.168.1.100
A integração de múltiplas camadas de defesa, desde o hardening do SSH até o uso de mitigação DDoS em nível de aplicação e monitoramento contínuo via auditd, cria um ambiente resiliente. O Fail2ban, quando customizado corretamente, deixa de ser uma ferramenta genérica e torna-se um guardião inteligente da sua infraestrutura.
Lembre-se: a segurança é uma jornada. Configure, monitore, ajuste e repita. Seu servidor será mais seguro graças à disciplina na manutenção dessas configurações.