Como proteger o servidor Linux contra ataques usando o Fail2Ban?

Neste guia, vamos apresentar as principais funcionalidades do Fail2Ban e mostrar como configurá-lo para proteger servidores web (Apache e NGINX), limitar tentativas de login via SSH e configurar notificações por e-mail para alertar quando um IP for bloqueado.

Principais funcionalidades

  • Monitoramento de logs – Analisa arquivos de log de serviços como Apache, SSH, NGINX e outros para identificar comportamentos suspeitos.
  • Bloqueio automático de IPs – Bane automaticamente endereços IP que apresentarem tentativas repetidas de acesso não autorizado.
  • Alta flexibilidade – Permite personalizar regras e filtros de acordo com as necessidades do servidor.
  • Notificações por e-mail – Pode enviar alertas quando um IP for bloqueado, informando detalhes da ocorrência.

1. Instalando o Fail2Ban

Use o gerenciador de pacotes da sua distribuição para instalar o Fail2Ban:

# Para Debian/Ubuntu
sudo apt-get install fail2ban

# Para CentOS/RHEL/Fedora
sudo yum install fail2ban

Após a instalação, crie um arquivo de configuração personalizado copiando o modelo original:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Abra o arquivo jail.local para editar as configurações padrão:

# Tempo que o IP ficará banido
bantime = 10m

# Quantidade máxima de tentativas antes do bloqueio
maxretry = 5

# Intervalo de tempo para contar as tentativas
findtime = 10m

2. Protegendo servidores Apache

No arquivo /etc/fail2ban/jail.local, adicione ou habilite a seção:

[apache-auth]
enabled  = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 3
findtime = 1m

Essa configuração bloqueia um IP após 3 tentativas falhas de autenticação em 1 minuto, mantendo o bloqueio por 10 minutos.

Nota: Você também pode habilitar outras proteções como [apache-badbots], [apache-overflows] e [apache-botsearch] para ampliar a segurança.

3. Protegendo servidores NGINX

No arquivo /etc/fail2ban/jail.local, habilite:

[nginx-http-auth]
enabled  = true
port     = http,https
logpath  = %(nginx_error_log)s

[nginx-limit-req]
enabled  = true
port     = http,https
logpath  = %(nginx_error_log)s

No nginx.conf adicione:

http {
...
# Limitar requisições para PHP
limit_req_zone $binary_remote_addr zone=limit:20m rate=10r/s;
}

No arquivo de configuração do site (ex.: /etc/nginx/sites-enabled/www.seudominio.com.br), inclua:

server {
...
location ~ \.php$ {
...
limit_req zone=limit burst=20 nodelay;
}
}

Essa configuração bloqueia IPs que excedam 10 requisições por segundo ou ultrapassem o limite de processamento definido.

4. Protegendo o acesso SSH

No arquivo /etc/fail2ban/jail.local:

[sshd]
enabled  = true
mode     = normal
port     = ssh
logpath  = %(sshd_log)s
backend  = %(sshd_backend)s

Isso ajuda a prevenir ataques de força bruta contra logins SSH.

5. Configurando notificações por e-mail

Ainda no jail.local, configure o envio de alertas:

# Destinatário dos alertas
destemail = alerta@seudominio.com.br

# Remetente dos alertas
sender = fail2ban@seudominio.com.br

# Método de envio (ajuste conforme seu servidor)
mta = sendmail

# Tipo de ação
action = %(action_mwl)s  # Banir, enviar relatório WHOIS e logs relevantes

6. Aplicando as configurações

Reinicie ou recarregue o Fail2Ban:

# Reiniciar
sudo systemctl restart fail2ban

# Recarregar sem interromper
sudo systemctl reload fail2ban

7. Verificando IPs banidos

Use o comando:

fail2ban-client banned

Assim, você poderá confirmar quais IPs estão atualmente bloqueados.

AVISO LEGAL: Os procedimentos descritos neste documento devem ser executados de acordo com o contexto de cada sistema, de forma a evitar impactos negativos à segurança, disponibilidade, integridade e privacidade de dados. A CentralServer se reserva o direito de modificar a qualquer tempo e sem aviso prévio as informações aqui apresentadas a fim de refletir o lançamento de novos serviços, atualizações físicas e operacionais, e evolução do estado-da-arte da tecnologia.