Fail2ban e outras camadas de controle de acesso

· Padrão Infraestrutura
Juan Kalleo
Juan Kalleo
Infraestrutura

O firewall (ver Kernel, netfilter e firewall) resolve "quem pode tentar falar com essa porta" de forma estática — a regra não muda sozinha com base em comportamento. Duas camadas complementares cobrem o que o firewall estático não cobre.

Fail2ban — banimento dinâmico por comportamento

Fail2ban monitora arquivo de log (SSH, servidor web, qualquer serviço que loga tentativa de acesso) procurando um padrão configurável — "muitas tentativas de senha errada vindas do mesmo IP", por exemplo. Quando o padrão bate, ele insere uma regra de firewall na hora (via iptables/nftables) banindo aquele IP por um tempo determinado — depois disso, remove a regra sozinho.

A diferença central pro rate limiting de aplicação (ver Força bruta e bloqueio no Padrão API, que já cobre o mesmo problema na camada HTTP): fail2ban opera na camada de rede/sistema operacional, não dentro da aplicação — cobre qualquer serviço que gere log (SSH incluído, que nenhum rate limit de aplicação alcança), e a punição é bloquear o IP antes do pacote chegar em qualquer processo, não só recusar uma requisição HTTP específica.

Estrutura básica: cada serviço monitorado é uma "jail" (jail.local), com um filtro (o padrão de log que conta como tentativa falha), um maxretry (quantas falhas até banir) e um bantime (por quanto tempo) — configuração comparável ao Rack::Attack do lado da aplicação, só que operando uma camada abaixo.

Lista de acesso por IP (allowlist)

Em vez de abrir uma rota administrativa pro mundo inteiro e confiar só em autenticação, uma lista de acesso restringe por IP de origem antes de a autenticação sequer rodar — só tráfego vindo de um IP/faixa conhecida (a rede da empresa, uma VPN) chega perto do endpoint. No Nginx (ver Nginx), isso é allow/deny num bloco location. É uma camada de defesa em profundidade: mesmo que uma credencial vaze, quem a tem ainda precisa estar numa rede permitida pra usá-la contra aquele endpoint específico.

HTTP Basic Auth como camada de borda

Basic Auth (usuário/senha enviados em todo request, via header Authorization: Basic ...) é simples, sem estado, suportado nativamente por todo servidor web — mas a credencial vai em toda requisição, então exige HTTPS sempre (sem TLS, a credencial trafega em texto legível, só codificada em base64, não criptografada). Usado tipicamente pra proteger uma ferramenta interna inteira (um painel de métrica, um dashboard de fila) atrás de uma segunda camada de autenticação, antes mesmo da aplicação processar a requisição — não como substituto de autenticação de aplicação de verdade (que sabe diferenciar usuário, permissão, sessão), só como uma barreira a mais na borda.

As camadas juntas

Nenhuma sozinha é suficiente — a defesa em profundidade vem de combinar todas: firewall (só as portas necessárias abertas), fail2ban (bane comportamento agressivo automaticamente), allowlist de IP (restringe origem de rota sensível) e autenticação de aplicação (sabe quem é o usuário e o que ele pode fazer). Cada camada cobre um tipo de ataque que as outras não cobrem sozinhas.

Leitura de apoio