Módulo 5 · 5.3
fail2ban contra tentativas de adivinhação
Módulo 5: Proteger a rede · Tempo de leitura: 10 minutos
Objetivo de aprendizagem: Depois desta lição, será capaz de configurar o fail2ban para SSH, ler o seu estado e o seu registo, desbloquear novamente um endereço e explicar o que o fail2ban protege e o que não protege.
Conceitos-chave: força bruta (brute force), jail, filtro, ação (banaction), maxretry, findtime, bantime, bantime.increment, ignoreip, backend systemd, jail.conf, jail.local e jail.d, fail2ban-client, recidive
Quem anda a experimentar as portas da internet
Consulte o registo do SSH um dia após a instalação e verá: centenas de tentativas de início de sessão, com nomes como root, admin, test, ubuntu e oracle, a partir de endereços de todo o mundo.
anna@web1:~$ sudo journalctl -u ssh --since today | grep -c "Invalid user"
412
anna@web1:~$ sudo journalctl -u ssh --since today | grep "Invalid user" | tail -n 3
nov 09 14:02:11 web1 sshd-session[20311]: Invalid user admin from 203.0.113.77 port 51522
nov 09 14:02:13 web1 sshd-session[20313]: Invalid user oracle from 203.0.113.77 port 51544
nov 09 14:02:16 web1 sshd-session[20315]: Invalid user test from 203.0.113.77 port 51560(No Ubuntu, o serviço chama-se ssh; no AlmaLinux e no Rocky, sshd. O nome do processo pode ser sshd ou sshd-session, consoante a versão do OpenSSH.) Trata-se de um ataque de força bruta: bots que simplesmente experimentam todos os nomes e palavras-passe comuns. Com o início de sessão por chaves e o início de sessão por palavra-passe desativado (lição 2.2), nunca conseguem entrar, por mais vezes que tentem. Mas enchem o seu registo, consomem algum poder de processamento e, em serviços onde é necessária uma palavra-passe (um webmail, um painel de gestão), podem ser realmente perigosos.
O fail2ban lê registos, reconhece tentativas falhadas e bloqueia temporariamente na firewall um endereço que falhe demasiadas vezes.
Como o fail2ban funciona: jails
O fail2ban trabalha com jails (celas). Uma jail combina três elementos:
- um filtro: expressões regulares que reconhecem tentativas falhadas num registo (por exemplo, a linha "Invalid user ... from <endereço>");
- uma ação: o que acontece quando há demasiadas tentativas, normalmente uma regra de firewall que bloqueia o endereço (
banaction, no Debian 13 por predefinição através do nftables); - limiares: quantas tentativas falhadas (
maxretry) dentro de que intervalo de tempo (findtime) levam a um bloqueio de que duração (bantime).
Os valores predefinidos em jail.conf são: maxretry = 5, findtime = 10m, bantime = 10m. Ou seja: cinco tentativas falhadas em dez minutos resultam em dez minutos de bloqueio.
Instalação e a armadilha do Debian 12
anna@web1:~$ sudo apt install fail2ban
anna@web1:~$ sudo systemctl status fail2banNo Debian e no Ubuntu, a jail para SSH ([sshd]) já fica ativa após a instalação, através do ficheiro /etc/fail2ban/jail.d/defaults-debian.conf.
Existe uma armadilha conhecida. O fail2ban tem de saber onde se encontra o registo. Antigamente, era o ficheiro de texto /var/log/auth.log. Desde o Debian 12, o rsyslog deixou de ser instalado por predefinição e as mensagens ficam apenas no journal do systemd (lição 6.2). O pacote fail2ban do Debian 12 ainda procurava /var/log/auth.log, não o encontrava e não arrancava. O Debian 13 resolveu isto definindo backend = systemd para o SSH em defaults-debian.conf. No Debian 12, resolve o problema fazendo o mesmo (ver abaixo). O Ubuntu ainda tem o rsyslog por predefinição, mas backend = systemd também funciona aí.
As suas próprias definições: jail.local
Nunca altere jail.conf: esse ficheiro é substituído numa atualização. Coloque as suas definições em /etc/fail2ban/jail.local ou num ficheiro em /etc/fail2ban/jail.d/ com a extensão .local:
# /etc/fail2ban/jail.d/eigen.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
bantime.increment = true
ignoreip = 127.0.0.1/8 ::1 198.51.100.20
[sshd]
enabled = true
backend = systemdO que as linhas fazem:
bantime = 1h: uma hora de bloqueio em vez de dez minutos.bantime.increment = true: quem regressa depois de um bloqueio recebe sempre um bloqueio mais longo.ignoreip: endereços que nunca são bloqueados. Coloque aqui o endereço IP fixo do seu escritório, se o tiver. Não coloque aqui grandes intervalos de endereços "por precaução".backend = systemd: ler o journal em vez de um ficheiro de texto (necessário no Debian 12, recomendável em todo o lado). Para isso, o pacotepython3-systemdtem de estar instalado; normalmente já está, como dependência.
Recarregar e verificar:
anna@web1:~$ sudo fail2ban-client -t # testar a configuração
OK: configuration test is successful
anna@web1:~$ sudo systemctl reload fail2ban
anna@web1:~$ sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshdLer o estado, banir e desbloquear
anna@web1:~$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 3
| |- Total failed: 1288
| `- Journal matches: _SYSTEMD_UNIT=ssh.service + _COMM=sshd
`- Actions
|- Currently banned: 2
|- Total banned: 117
`- Banned IP list: 203.0.113.77 198.51.100.140"Currently failed" são os endereços que já fizeram tentativas, mas que ainda não ultrapassaram o limiar. "Currently banned" são os endereços que estão bloqueados neste momento.
Se se bloqueou a si próprio (por exemplo, ao tentar algumas vezes com a chave ou o nome de utilizador errados), inicie sessão a partir de outra rede ou através da consola e desbloqueie o seu endereço:
anna@web1:~$ sudo fail2ban-client set sshd unbanip 198.51.100.20O registo do próprio fail2ban encontra-se em /var/log/fail2ban.log e mostra quando cada endereço foi bloqueado e desbloqueado:
2026-11-09 14:02:16,903 fail2ban.actions [811]: NOTICE [sshd] Ban 203.0.113.77
2026-11-09 15:02:17,120 fail2ban.actions [811]: NOTICE [sshd] Unban 203.0.113.77Reincidentes: recidive
Alguns bots simplesmente regressam após cada bloqueio. Para isso existem dois meios. bantime.increment (acima) torna o bloqueio cada vez mais longo. Além disso, existe a jail recidive: lê o registo do próprio fail2ban e bloqueia durante uma semana, em todas as portas, um endereço que tenha sido bloqueado muitas vezes no espaço de um dia. Ativá-la no seu ficheiro .local:
[recidive]
enabled = trueO que o fail2ban faz e o que não faz
O fail2ban é útil, mas não é a fechadura da porta. A fechadura é o início de sessão com chave, com as palavras-passe desativadas (lição 2.2). Por isso, saiba também o que o fail2ban não consegue fazer:
- Um ataque distribuído a partir de milhares de endereços, cada um com uma ou duas tentativas, nunca ultrapassa
maxretry. - Uma palavra-passe fraca continua fraca. O fail2ban atrasa a adivinhação, nada mais.
- Apenas o que está num registo: um serviço que não regista tentativas falhadas, ou um registo que o fail2ban não lê, passa-lhe despercebido.
- Docker: os bloqueios na cadeia normal da firewall não se aplicam às portas publicadas dos contentores (lição 9.3). Para serviços em contentores, é necessária uma configuração à parte (ação na cadeia
DOCKER-USER).
O que o fail2ban faz bem: manter o registo tranquilo, reduzir a carga dos bots e proteger serviços onde (ainda) utiliza palavras-passe, como um webmail ou um painel de gestão. Para esses serviços existem filtros para nginx, Postfix, Dovecot e muitos outros.
No AlmaLinux e no Rocky Linux
Nestes sistemas, o fail2ban vem do EPEL: dnf install epel-release e depois dnf install fail2ban. O pacote fail2ban instala também a ligação ao firewalld. O serviço SSH chama-se sshd. Ative a jail num ficheiro .local; ao contrário do Debian, não fica ativa automaticamente.
Resumo
- Os bots tentam iniciar sessão durante todo o dia; com chaves e o início de sessão por palavra-passe desativado não conseguem entrar, e o fail2ban mantém-nos, além disso, à distância.
- Uma jail é filtro + ação + limiares (
maxretry,findtime,bantime); por predefinição, 5 tentativas em 10 minutos dão 10 minutos de bloqueio. - Definições próprias em
jail.localoujail.d/*.local, nunca emjail.conf; utilizebackend = systemd(necessário no Debian 12). fail2ban-client status sshdmostra os endereços banidos,set sshd unbanipdesbloqueia; recidive ebantime.incrementtratam dos reincidentes.- O fail2ban não trava ataques distribuídos nem palavras-passe fracas e não vê automaticamente as portas do Docker.
Questionário
Exercício
Exercício Z5.3: Ler um registo de intrusão. O ficheiro de exemplo ssh-journal-1.txt contém um excerto do journal de um servidor SSH com fail2ban, bem como o resultado de fail2ban-client status sshd. Responda: que endereço experimentou mais nomes de utilizador, que endereço conseguiu iniciar sessão com uma chave e com que utilizador, que endereço foi banido e a que horas, e esse endereço também teria sido banido com as definições predefinidas (maxretry = 5, findtime = 10m)? O programa compara as suas respostas com a chave de respostas fixa. Se tiver um servidor próprio com fail2ban, consulte também aí fail2ban-client status sshd.
Para saber mais
- Proteger o seu VPS: os primeiros cinco minutos
- Estou bloqueado? O seu endereço IP e a nossa firewall
- fail2ban, configuração predefinida
jail.conf: https://github.com/fail2ban/fail2ban/blob/master/config/jail.conf - Manual de
jail.conf(5): https://manpages.debian.org/trixie/fail2ban/jail.conf.5.en.html - VPS: do primeiro início de sessão a um servidor seguro 3.5: fail2ban contra tentativas de adivinhação
