Como proteger o SSH com Fail2Ban no Ubuntu 20.04

Introdução

O SSH é o método padrão de conexão com um servidor na nuvem. É durável e extensível — à medida que novos padrões de criptografia são desenvolvidos, eles podem ser usados para gerar novas chaves SSH, garantindo que o protocolo principal permaneça seguro. No entanto, nenhum protocolo ou pilha de software é totalmente infalível, e o fato de o SSH estar tão amplamente implantado pela internet significa que representa uma superfície de ataque muito previsível ou vetor de ataque através do qual as pessoas podem tentar obter acesso.

Qualquer serviço exposto à rede é um alvo potencial dessa forma. Se você revisar os logs do seu serviço SSH em qualquer servidor com muito tráfego, muitas vezes verá tentativas de login sistemáticas e repetidas que representam ataques de força bruta por parte de usuários e bots. Embora você possa fazer algumas otimizações em seu serviço SSH para reduzir a chance de esses ataques terem sucesso praticamente a zero, como desativar a autenticação por senha em favor das chaves SSH, eles ainda podem representar uma responsabilidade menor e contínua.

Implantações de produção em larga escala para as quais essa responsabilidade é completamente inaceitável geralmente implementarão uma VPN, como o WireGuard, na frente de seu serviço SSH, para que seja impossível se conectar diretamente à porta SSH padrão 22 a partir da internet externa sem abstrações de software adicionais ou gateways. Essas soluções de VPN são amplamente confiáveis, mas adicionam complexidade e podem quebrar algumas automações ou outros pequenos ganchos de software.

Antes ou além de se comprometer com uma configuração completa de VPN, você pode implementar uma ferramenta chamada Fail2ban. O Fail2ban pode mitigar significativamente os ataques de força bruta criando regras que alteram automaticamente a configuração do seu firewall para banir IPs específicos após um certo número de tentativas de login malsucedidas. Isso permitirá que seu servidor se proteja contra essas tentativas de acesso sem intervenção sua.

Neste guia, você verá como instalar e usar o Fail2ban em um servidor Ubuntu 20.04.

Pré-requisitos

Para concluir este guia, você precisará de:

  • Um servidor Ubuntu 20.04 e um usuário não root com privilégios sudo. Você pode aprender mais sobre como configurar um usuário com esses privilégios em nosso guia Configuração Inicial do Servidor com Ubuntu 20.04.

  • Opcionalmente, um segundo servidor ao qual você pode se conectar a partir do seu primeiro servidor, que será usado para testar ser deliberadamente banido.

Passo 1 — Instalando o Fail2ban

O Fail2ban está disponível nos repositórios de software do Ubuntu. Comece executando os seguintes comandos como um usuário não-root para atualizar suas listas de pacotes e instalar o Fail2ban:

  1. sudo apt update
  2. sudo apt install fail2ban

O Fail2ban configurará automaticamente um serviço em segundo plano após ser instalado. No entanto, ele está desativado por padrão, porque algumas de suas configurações padrão podem causar efeitos indesejados. Você pode verificar isso usando o comando systemctl:

  1. systemctl status fail2ban.service
Output
○ fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled Active: inactive (dead) Docs: man:fail2ban(1)

Você poderia habilitar o Fail2ban imediatamente, mas primeiro revisará algumas de suas características.

Passo 2 – Configurando o Fail2ban

O serviço fail2ban mantém seus arquivos de configuração no diretório /etc/fail2ban. Há um arquivo com padrões chamado jail.conf. Vá para esse diretório e imprima as primeiras 20 linhas desse arquivo usando head -20:

  1. cd /etc/fail2ban
  2. head -20 jail.conf
Output
# # AVISO: extensivamente refatorado na versão 0.9.0. Por favor, reveja e # personalize as configurações para sua instalação. # # Alterações: na maioria dos casos, você não deve modificar este # arquivo, mas fornecer personalizações no arquivo jail.local, # ou em arquivos .conf separados no diretório jail.d/, por exemplo: # # COMO ATIVAR JAILS: # # VOCÊ NÃO DEVE MODIFICAR ESTE ARQUIVO. # # Provavelmente será sobrescrito ou melhorado em uma atualização de distribuição. # # Fornecer personalizações em um arquivo jail.local ou em um jail.d/customization.local. # Por exemplo, para alterar o bantime padrão para todos os jails e para habilitar o # jail ssh-iptables, o seguinte (não comentado) apareceria no arquivo .local. # Veja o manual 5 jail.conf para detalhes. # # [DEFAULT]

Como você verá, as primeiras várias linhas deste arquivo estão comentadas – elas começam com caracteres # indicando que devem ser lidas como documentação em vez de como configurações. Como você também verá, esses comentários estão instruindo você a não modificar este arquivo diretamente. Em vez disso, você tem duas opções: criar perfis individuais para o Fail2ban em vários arquivos dentro do diretório jail.d/, ou criar e coletar todas as suas configurações locais em um arquivo jail.local. O arquivo jail.conf será periodicamente atualizado conforme o próprio Fail2ban é atualizado, e será usado como fonte de configurações padrão para as quais você não criou substituições.

Neste tutorial, você criará jail.local. Você pode fazer isso copiando jail.conf:

  1. sudo cp jail.conf jail.local

Agora você pode começar a fazer alterações de configuração. Abra o arquivo no nano ou no seu editor de texto favorito:

  1. sudo nano jail.local

Enquanto você está rolando pelo arquivo, este tutorial revisará algumas opções que você pode querer atualizar. As configurações localizadas sob a seção [DEFAULT] perto do topo do arquivo serão aplicadas a todos os serviços suportados pelo Fail2ban. Em outros lugares no arquivo, há cabeçalhos para [sshd] e para outros serviços, que contêm configurações específicas do serviço que se aplicarão sobre as configurações padrão.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
bantime = 10m
. . .

O parâmetro bantime define o período de tempo que um cliente será banido quando falhar na autenticação correta. Isso é medido em segundos. Por padrão, isso é configurado para 10 minutos.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .

Os próximos dois parâmetros são findtime e maxretry. Eles trabalham juntos para estabelecer as condições sob as quais um cliente é considerado um usuário ilegítimo que deve ser banido.

A variável maxretry define o número de tentativas que um cliente tem para autenticar-se dentro de uma janela de tempo definida por findtime, antes de ser banido. Com as configurações padrão, o serviço fail2ban irá banir um cliente que tentar sem sucesso fazer login 5 vezes dentro de uma janela de 10 minutos.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .

Se você precisa receber alertas por e-mail quando o Fail2ban toma uma ação, você deve avaliar as configurações destemail, sendername e mta. O parâmetro destemail define o endereço de e-mail que deve receber mensagens de banimento. O sendername define o valor do campo “De” no e-mail. O parâmetro mta configura qual serviço de correio será usado para enviar e-mails. Por padrão, isso é sendmail, mas você pode querer usar Postfix ou outra solução de correio.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
action = $(action_)s
. . .

Este parâmetro configura a ação que o Fail2ban toma quando deseja instituir um banimento. O valor action_ é definido no arquivo pouco antes deste parâmetro. A ação padrão é atualizar a configuração do seu firewall para rejeitar o tráfego do host infrator até que o tempo de banimento termine.

Existem outros scripts de action_ fornecidos por padrão que você pode substituir $(action_) por acima:

/etc/fail2ban/jail.local
…
# banir e enviar um e-mail com o relatório whois para o destemail.
action_mw = %(action_)s
            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

# banir e enviar um e-mail com o relatório whois e linhas de log relevantes
# para o destemail.
action_mwl = %(action_)s
             %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]

# Veja a nota IMPORTANTE em action.d/xarf-login-attack para quando usar esta ação
#
# banir e enviar um e-mail xarf para o contato de abuso do endereço IP e incluir linhas de log relevantes
# para o destemail.
action_xarf = %(action_)s
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

# banir IP no CloudFlare e enviar um e-mail com relatório whois e linhas de log relevantes
# para o destemail.
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
                %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
…

Por exemplo, action_mw executa ação e envia um e-mail, action_mwl executa ação, envia um e-mail e inclui registro, e action_cf_mwl faz tudo isso além de enviar uma atualização para a API do Cloudflare associada à sua conta para banir o infrator lá também.

Configurações Individuais da Prisão

A seguir está a parte do arquivo de configuração que lida com serviços individuais. Estes são especificados por cabeçalhos de seção, como [sshd].

Cada uma dessas seções precisa ser ativada individualmente adicionando uma linha enabled = true sob o cabeçalho, com suas outras configurações.

/etc/fail2ban/jail.local
[jail_to_enable]
. . .
enabled = true
. . .

Por padrão, o serviço SSH está habilitado e todos os outros estão desabilitados.
.
Algumas outras configurações que são definidas aqui são o filter que será usado para decidir se uma linha em um log indica uma autenticação falhada e o logpath que informa ao fail2ban onde os logs para esse serviço específico estão localizados.

O valor do filter é na verdade uma referência a um arquivo localizado no diretório /etc/fail2ban/filter.d, com sua extensão .conf removida. Esses arquivos contêm expressões regulares (um formato comum para análise de texto) que determinam se uma linha no log é uma tentativa de autenticação falhada. Não iremos cobrir esses arquivos em detalhes neste guia, porque eles são bastante complexos e as configurações predefinidas correspondem bem às linhas apropriadas.

No entanto, você pode ver que tipo de filtros estão disponíveis olhando para esse diretório:

  1. ls /etc/fail2ban/filter.d

Se você vir um arquivo que parece relacionado a um serviço que você está usando, você deve abri-lo com um editor de texto. A maioria dos arquivos está bem comentada e você deverá ser capaz de pelo menos entender que tipo de condição o script foi projetado para proteger. A maioria desses filtros têm seções apropriadas (desabilitadas) no arquivo jail.conf que podemos habilitar no arquivo jail.local se desejado.

Por exemplo, imagine que você esteja servindo um site usando o Nginx e perceba que uma parte protegida por senha do seu site está sendo bombardeada com tentativas de login. Você pode dizer ao fail2ban para usar o arquivo nginx-http-auth.conf para verificar essa condição dentro do arquivo /var/log/nginx/error.log.

Isso na verdade já está configurado em uma seção chamada [nginx-http-auth] no seu arquivo /etc/fail2ban/jail.conf. Você só precisaria adicionar o parâmetro enabled:

/etc/fail2ban/jail.local
. . .
[nginx-http-auth]

enabled = true
. . .

Quando terminar de editar, salve e feche o arquivo. Neste ponto, você pode habilitar o seu serviço Fail2ban para que ele seja executado automaticamente a partir de agora. Primeiro, execute systemctl enable:

  1. sudo systemctl enable fail2ban

Depois, inicie-o manualmente pela primeira vez com systemctl start:

  1. sudo systemctl start fail2ban

Você pode verificar se está em execução com systemctl status:

  1. sudo systemctl status fail2ban
Output
● fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enab> Active: active (running) since Tue 2022-06-28 19:29:15 UTC; 3s ago Docs: man:fail2ban(1) Main PID: 39396 (fail2ban-server) Tasks: 5 (limit: 1119) Memory: 12.9M CPU: 278ms CGroup: /system.slice/fail2ban.service └─39396 /usr/bin/python3 /usr/bin/fail2ban-server -xf start Jun 28 19:29:15 fail2ban20 systemd[1]: Started Fail2Ban Service. Jun 28 19:29:15 fail2ban20 fail2ban-server[39396]: Server ready

Na próxima etapa, você demonstrará o Fail2ban em ação.

Passo 3 — Testando as Políticas de Banimento (Opcional)

De outro servidor, um que não precisará fazer login no seu servidor Fail2ban no futuro, você pode testar as regras fazendo com que esse segundo servidor seja banido. Após fazer login no seu segundo servidor, tente conectar-se via SSH ao servidor Fail2ban. Você pode tentar se conectar usando um nome inexistente:

  1. ssh blah@your_server

Digite caracteres aleatórios na solicitação de senha. Repita isso algumas vezes. Em algum momento, o erro que você está recebendo deve mudar de Permissão negada para Conexão recusada. Isso indica que seu segundo servidor foi banido do servidor Fail2ban.

No seu servidor Fail2ban, você pode ver a nova regra verificando a saída do seu iptables. iptables é um comando para interagir com regras de porta e firewall em nível baixo no seu servidor. Se você seguiu o guia da DigitalOcean para configuração inicial do servidor, estará usando ufw para gerenciar regras de firewall em um nível mais alto. Executar iptables -S mostrará todas as regras de firewall que o ufw já criou:

  1. sudo iptables -S
Output
-P INPUT DROP -P FORWARD DROP -P OUTPUT ACCEPT -N f2b-sshd -N ufw-after-forward -N ufw-after-input -N ufw-after-logging-forward -N ufw-after-logging-input -N ufw-after-logging-output -N ufw-after-output -N ufw-before-forward -N ufw-before-input -N ufw-before-logging-forward -N ufw-before-logging-input -N ufw-before-logging-output …

Se você redirecionar a saída de iptables -S para grep para pesquisar dentro dessas regras pela string f2b, poderá ver as regras que foram adicionadas pelo fail2ban:

  1. sudo iptables -S | grep f2b
Output
-N f2b-sshd -A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd -A f2b-sshd -s 134.209.165.184/32 -j REJECT --reject-with icmp-port-unreachable -A f2b-sshd -j RETURN

A linha contendo REJECT --reject-with icmp-port-unreachable será adicionada pelo Fail2ban e deve refletir o endereço IP do seu segundo servidor.

Conclusão

Agora você deve ser capaz de configurar algumas políticas de proibição para seus serviços. Fail2ban é uma maneira útil de proteger qualquer tipo de serviço que utilize autenticação. Se você deseja aprender mais sobre como o fail2ban funciona, pode conferir nosso tutorial sobre como as regras e arquivos do fail2ban funcionam.

Para informações sobre como usar o fail2ban para proteger outros serviços, você pode ler sobre Como Proteger um Servidor Nginx com Fail2Ban no Ubuntu 14.04 e Como Proteger um Servidor Apache com Fail2Ban no Ubuntu 14.04.

Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-ubuntu-20-04