Segurança Linux: Proteja seu servidor com o Fail2ban!

Com o fail2ban, o seu sistema Linux protege-se automaticamente contra tentativas de acesso maliciosas, bloqueando endereços IP que demonstram um elevado número de tentativas de conexão falhadas. É uma forma de segurança proativa e autorregulada! Vamos explorar como implementar esta ferramenta.

Proteção Reforçada para o seu Sistema

Parafraseando uma adaptação moderna da célebre frase da Duquesa de Windsor, a segurança nunca é excessiva. Num mundo digital interligado, a proteção é fundamental.

Se o seu computador recebe solicitações de conexão, seja via SSH ou se funciona como um servidor web ou de email, é imperativo defender-se contra ataques de força bruta e tentativas de adivinhação de senhas.

A solução reside no acompanhamento das tentativas de conexão falhadas. Se um IP acumular um número significativo de falhas de autenticação num curto período, esse IP deve ser impedido de tentar novamente.

A forma mais eficaz de implementar este sistema é através da automatização. Com a configuração apropriada, o fail2ban assume a responsabilidade de monitorizar, banir e desbanir IPs automaticamente.

O fail2ban trabalha em conjunto com o firewall do Linux, iptables. Ele implementa os bloqueios de IPs suspeitos através da adição de regras ao firewall. Para melhor clareza, vamos trabalhar com um conjunto de regras vazio no iptables.

É crucial lembrar que, se a segurança é uma prioridade, é provável que já tenha um firewall em funcionamento com um conjunto de regras definido. O fail2ban apenas adiciona e remove as suas próprias regras, sem interferir com as suas configurações de firewall existentes.

Podemos verificar o nosso conjunto de regras vazio com o seguinte comando:

sudo iptables -L

Instalação do fail2ban

A instalação do fail2ban é simples em todas as distribuições Linux mais comuns. No Ubuntu 20.04, utilize o seguinte comando:

sudo apt-get install fail2ban

No Fedora 32, execute:

sudo dnf install fail2ban

Para o Manjaro 20.0.1, o comando é:

sudo pacman -Sy fail2ban

Configuração do fail2ban

A instalação do fail2ban inclui um arquivo de configuração predefinido chamado `jail.conf`. Este ficheiro é sobrescrito em cada atualização do fail2ban, o que significa que as nossas alterações serão perdidas.

A melhor prática é copiar o arquivo `jail.conf` para um novo arquivo chamado `jail.local`. Ao efetuar as nossas alterações no `jail.local`, elas persistirão nas atualizações. O fail2ban lê ambos os arquivos automaticamente.

Use o seguinte comando para copiar o arquivo:

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

Agora, abra o ficheiro no seu editor de texto preferido. Vamos usar o gedit:

sudo gedit /etc/fail2ban/jail.local

Vamos procurar duas secções no ficheiro: `[DEFAULT]` e `[sshd]`. Certifique-se de que encontra as secções corretas. Estas etiquetas também aparecem perto do início, numa secção que as descreve, mas não é essa a que pretendemos.

A secção `[DEFAULT]` deve encontrar-se perto da linha 40. É uma secção longa com muitos comentários e explicações.

Desça até à linha 90 e encontrará as seguintes quatro configurações principais:

`ignoreip`: Uma lista de IPs que nunca serão banidos. Estes têm um “salvo-conduto” permanente. O IP localhost (127.0.0.1) está na lista por padrão, juntamente com o seu equivalente IPv6 (::1). Se houver outros IPs que não devam ser banidos, adicione-os à lista, separados por um espaço.
`bantime`: A duração em que um IP é banido (“m” para minutos). Se introduzir um valor sem “m” ou “h” (para horas), será tratado como segundos. Um valor de -1 banirá permanentemente um IP. Tenha cuidado para não se banir permanentemente a si próprio.
`findtime`: O período de tempo em que um elevado número de tentativas de conexão falhadas resultará no banimento de um IP.
`maxretry`: O valor que define “demasiadas tentativas falhadas”.

Se um IP fizer `maxretry` tentativas de conexão falhadas dentro do período `findtime`, será banido durante `bantime`. As únicas exceções são os IPs listados em `ignoreip`.

O fail2ban coloca os IPs em quarentena durante um determinado período de tempo. O fail2ban suporta várias “jails” diferentes, e cada uma representa as configurações que se aplicam a um único tipo de conexão. Isto permite ter configurações diferentes para cada tipo de conexão, ou, se preferir, o fail2ban pode monitorizar apenas um conjunto de tipos de conexão selecionados.

Como o nome da secção `[DEFAULT]` sugere, as configurações que vimos são os valores padrão. Vamos agora analisar as configurações da “jail” SSH.

Configuração de uma Jail

As “jails” permitem-lhe ativar ou desativar o monitoramento dos tipos de conexão no fail2ban. Se as configurações padrão não se ajustarem ao que pretende aplicar à jail, pode definir valores específicos para `bantime`, `findtime` e `maxretry`.

Desça até à linha 280 e encontrará a secção `[sshd]`.

É aqui que pode definir valores para a “jail” da conexão SSH. Para incluir esta jail no monitoramento e bloqueio, insira a seguinte linha:

enabled = true

Também vamos adicionar a seguinte linha:

maxretry = 3

A configuração padrão é cinco, mas vamos ser mais cautelosos com as conexões SSH. Reduzimos para três. Agora, vamos guardar o ficheiro e fechá-lo.

Adicionámos esta jail ao monitoramento do fail2ban e alterámos uma das configurações padrão. Uma jail pode usar uma combinação de configurações padrão e configurações específicas da jail.

Ativação do fail2ban

Instalámos e configurámos o fail2ban. Agora, é preciso ativá-lo para funcionar como um serviço de inicialização automática. De seguida, vamos testar para garantir que tudo funciona como esperado.

Para ativar o fail2ban como serviço, usamos o comando systemctl:

sudo systemctl enable fail2ban

Também o usamos para iniciar o serviço:

sudo systemctl start fail2ban

Também podemos verificar o estado do serviço com o systemctl:

sudo systemctl status fail2ban.service

Tudo parece bem – temos a luz verde, está tudo a funcionar.

Vamos ver se o fail2ban concorda:

sudo fail2ban-client status

Isto reflete o que configurámos. Ativámos uma única “jail”, chamada `[sshd]`. Se incluirmos o nome da “jail” no nosso comando, podemos analisar os detalhes:

sudo fail2ban-client status sshd

Isto lista o número de falhas e de IPs banidos. De momento, todas as estatísticas são zero.

Testando a Nossa Jail

Num outro computador, vamos fazer uma solicitação de conexão SSH ao nosso computador de teste e vamos digitar a palavra-passe errada propositadamente. Tem três tentativas para acertar a palavra-passe em cada tentativa de conexão.

O valor `maxretry` será acionado após três tentativas de conexão falhadas, e não três tentativas de palavra-passe falhadas. Portanto, precisamos de introduzir uma palavra-passe errada três vezes para falhar a primeira tentativa de conexão.

Depois, vamos fazer outra tentativa de conexão e digitar a palavra-passe erradamente mais três vezes. A primeira tentativa de palavra-passe errada da terceira solicitação de conexão deverá acionar o fail2ban.

Após a primeira palavra-passe errada na terceira solicitação de conexão, não obtemos resposta do computador remoto. Não recebemos nenhuma explicação. Simplesmente ignorados.

Deve premir Ctrl+C para regressar à linha de comandos. Se tentarmos novamente, vamos obter uma resposta diferente:

ssh [email protected]

Anteriormente, a mensagem de erro era “Permissão negada”. Desta vez, a conexão é totalmente recusada. Somos persona non grata. Fomos banidos.

Vamos ver os detalhes da jail `[sshd]` novamente:

sudo fail2ban-client status sshd

Houve três falhas e um IP (192.168.4.25) foi banido.

Como mencionado anteriormente, o fail2ban implementa os bloqueios ao adicionar regras ao conjunto de regras do firewall. Vamos ver novamente o conjunto de regras (que estava vazio antes):

sudo iptables -L

Foi adicionada uma regra à política INPUT, encaminhando o tráfego SSH para a cadeia f2b-sshd. A regra na cadeia f2b-sshd rejeita conexões SSH de 192.168.4.25. Não alterámos a configuração padrão de `bantime`, portanto, em 10 minutos, este IP será desbanido e poderá efetuar novos pedidos de conexão.

Se definir uma duração de bloqueio mais longa (como várias horas), mas quiser permitir que um IP volte a fazer uma solicitação de conexão mais cedo, pode desbloqueá-lo.

Para isso, vamos usar o seguinte comando:

sudo fail2ban-client set sshd unbanip 192.168.5.25

No nosso computador remoto, se fizermos outra solicitação de conexão SSH e digitarmos a palavra-passe correta, seremos permitidos a conectar:

ssh [email protected]

Simples e Eficaz

Em geral, o mais simples é o melhor, e o fail2ban é uma solução elegante para um problema complexo. Requer pouca configuração e quase não tem sobrecarga operacional – para si ou para o seu computador.