Ir diretamente para o conteúdo

Definições de cookies

Escolha que tipos de cookies permite. Pode alterar a sua escolha a qualquer momento em Definições de cookies, no fundo de cada página. Política de privacidade

Necessários

Sempre ativos

Necessários para iniciar sessão, manter o seu carrinho e memorizar as suas escolhas. Estão sempre ativos.

Que cookies?
  • weboke_sessie, weboke_klant, weboke_remember: a sua sessão e manter a sessão iniciada
  • weboke_basket: o seu carrinho
  • wkBtwIncl: mostrar preços com ou sem IVA
  • wok_cookies: a sua escolha de cookies, 12 meses

Mede que anúncio leva a uma visita ou encomenda, para não pagarmos por anúncios que não dão resultado.

Que cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), até 90 dias
  • OpenAI Ads, anúncios no ChatGPT
  • wok_aff: através de que parceiro chegou até nós (programa de afiliados), 60 dias

4,6

País e idioma

Cada país tem o seu próprio site, com os preços e o IVA desse país.

Ver

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 fail2ban

No 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 = systemd

O 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 pacote python3-systemd tem 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:   sshd

Ler 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.20

O 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.77

Reincidentes: 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 = true

O 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.local ou jail.d/*.local, nunca em jail.conf; utilize backend = systemd (necessário no Debian 12).
  • fail2ban-client status sshd mostra os endereços banidos, set sshd unbanip desbloqueia; recidive e bantime.increment tratam 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

1. Instalou o fail2ban no Debian 12 e ele não arranca, com a mensagem de que não existe ficheiro de registo para a jail sshd. Qual é a causa?



2. Porque deve colocar as suas definições em jail.local e não em jail.conf?



3. As definições predefinidas são maxretry = 5, findtime = 10m, bantime = 10m. Um endereço faz uma tentativa falhada às 14:00, 14:03, 14:05, 14:08 e 14:09. O que acontece?



4. O seu servidor recebe todos os dias milhares de tentativas de início de sessão, distribuídas por dezenas de milhares de endereços, cada um com uma tentativa. O que faz o fail2ban contra isso?



5. Bloqueou-se a si próprio ao escrever várias vezes o nome de utilizador errado. Qual é a solução correta?



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.

Exercício Z5.3: Ler um registo de intrusão

Ficheiro deste exercício: ssh-journal-1.txt








O que preenche e o que encontramos não ficam guardados. O seu navegador memoriza as suas respostas e se concluiu o exercício com sucesso. Se tiver sessão iniciada, guardamos apenas que concluiu o exercício (quase) com sucesso em Os meus cursos; aí também o pode eliminar.

Para saber mais

Um momento…

Configurar os seus domínios

Para cada domínio, defina os servidores de nomes, a ligação ao seu alojamento e quem fica como titular.

A carregar os seus domínios…