Como Proteger o SSH com Fail2Ban no Rocky Linux 8

Introdução

O SSH é o método padrão de conexão a 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 central permaneça seguro. No entanto, nenhum protocolo ou pilha de software é totalmente infalível, e o fato de o SSH ser tão amplamente implantado na Internet significa que ele 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 em potencial dessa forma. Se você revisar os logs do seu serviço SSH em qualquer servidor com muito tráfego, frequentemente verá tentativas de login sistemáticas e repetidas que representam ataques de força bruta tanto por usuários quanto por bots. Embora você possa fazer algumas otimizações em seu serviço SSH para reduzir a chance desses ataques terem sucesso para quase zero, como desativar a autenticação por senha em favor das chaves SSH, eles ainda podem representar uma responsabilidade mínima 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 WireGuard, na frente de seu serviço SSH, para que seja impossível se conectar diretamente à porta SSH padrão 22 da internet externa sem abstração de software adicional ou gateways. Essas soluções de VPN são amplamente confiáveis, mas adicionam complexidade e podem quebrar algumas automações ou outros ganchos de software pequenos.

Antes ou além de se comprometer com uma configuração de VPN completa, 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 firewall para proibir 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 Rocky Linux 8.

Pré-requisitos

Para completar este guia, você precisará:

  • Um servidor Rocky Linux 8 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 Rocky Linux 8. Você também deve ter o firewalld em execução no servidor, o que é abordado em nosso guia de configuração inicial do servidor.

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

Passo 1 — Instalando o Fail2ban

O Fail2ban não está disponível nos repositórios de software padrão do Rocky. No entanto, está disponível no repositório EPEL, ou Enhanced Packages for Enterprise Linux, que é comumente usado para pacotes de terceiros no Red Hat e no Rocky Linux. Se você ainda não adicionou o EPEL às fontes de pacotes do seu sistema, pode adicionar o repositório usando dnf, como faria para instalar qualquer outro pacote:

  1. sudo dnf install epel-release -y

O gerenciador de pacotes dnf agora verificará o EPEL além de suas fontes de pacotes padrão ao instalar novo software. Prossiga para instalar o Fail2ban:

  1. sudo dnf install fail2ban -y

O Fail2ban configurará automaticamente um serviço em segundo plano após ser instalado. No entanto, ele é desativado por padrão, pois 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: disabled Active: inactive (dead) Docs: man:fail2ban(1)

Você pode habilitar o Fail2ban imediatamente, mas primeiro, você irá revisar algumas de suas funcionalidades.

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: amplamente reestruturado na versão 0.9.0. Por favor, revise e # personalize as configurações para a 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 dentro do 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. # # Forneça personalizações em um arquivo jail.local ou em um jail.d/customizacao.local. # Por exemplo, para alterar o tempo de banimento padrão para todos os jails e para habilitar o # jail ssh-iptables, o seguinte (descomentado) apareceria no arquivo .local. # Consulte o manual man 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 configurações. Como você também verá, esses comentários estão direcionando 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 na configuração. Abra o arquivo no vi ou no seu editor de texto favorito:

  1. sudo vi jail.local

Enquanto você estiver navegando 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 outras partes do arquivo, existem cabeçalhos para [sshd] e para outros serviços, que contêm configurações específicas do serviço que serão aplicadas sobre as configurações padrão.

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

O parâmetro bantime define o tempo pelo qual um cliente será banido quando falhar na autenticação correta. Isso é medido em segundos. Por padrão, isso é definido para 10 minutos.

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

Os próximos dois parâmetros são findtime e maxretry. Estes funcionam 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 dentro de uma janela de tempo definida por findtime, antes de ser banido. Com as configurações padrão, o serviço fail2ban banirá um cliente que tentar fazer login sem sucesso 5 vezes dentro de uma janela de 10 minutos.

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

Se precisar de receber alertas por email quando o Fail2ban tomar medidas, deve avaliar as definições destemail, sendername e mta. O parâmetro destemail define o endereço de email que deve receber as mensagens de bloqueio. O sendername define o valor do campo “De” no email. O parâmetro mta configura qual serviço de correio será usado para enviar o correio. Por padrão, isso é sendmail, mas pode querer usar o 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 bloqueio. O valor action_ é definido no arquivo logo antes deste parâmetro. A ação padrão é atualizar a configuração do firewall para rejeitar o tráfego do host ofensor até que o tempo de bloqueio expire.

Há outros scripts action_ fornecidos por padrão que pode substituir $(action_) acima:

/etc/fail2ban/jail.local
…
# bloquear e enviar um email 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"]

# bloquear e enviar um email 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
#
# bloquear e enviar um email 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"]

# bloquear IP no CloudFlare e enviar um email 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 realiza a ação e envia um e-mail, action_mwl realiza a ação, envia um e-mail e inclui o 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 de Prisão

Em seguida, está a parte do arquivo de configuração que trata dos serviços individuais. Eles são especificados por cabeçalhos de seção, como [sshd].

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

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

Para este tutorial, você habilitará a prisão do SSH. Deve estar no topo das configurações de prisão individuais. Os parâmetros padrão funcionarão de outra forma, mas você precisará adicionar uma linha de configuração que diga enabled = true sob o cabeçalho [sshd].

/etc/fail2ban/jail.local
#
# JAILS
#

#
# Servidores SSH
#

[sshd]

# Para usar modos sshd mais agressivos, defina o parâmetro de filtro "mode" no jail.local:
# normal (padrão), ddos, extra ou aggressive (combina todos).
# Veja "tests/files/logs/sshd" ou "filter.d/sshd.conf" para exemplo de uso e detalhes.
#mode   = normal
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

Algumas outras configurações que são definidas aqui são o filter que será usado para decidir se uma linha em um registro indica uma autenticação falhada e o logpath que informa ao fail2ban onde os registros para aquele 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 a extensão .conf removida. Esses arquivos contêm expressões regulares (uma forma comum de análise de texto) que determinam se uma linha no registro é uma tentativa de autenticação falhada. Não vamos 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ê deve ser capaz de pelo menos dizer que tipo de condição o script foi projetado para proteger contra. A maioria desses filtros tem seções apropriadas (desativadas) 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 já está configurado em uma seção chamada [nginx-http-auth] no seu arquivo /etc/fail2ban/jail.conf. Você só precisa adicionar o parâmetro enabled:

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

enabled = true
. . .

Quando terminar de editar, salve e feche o arquivo. Se estiver usando vi, use :x para salvar e sair. Neste ponto, você pode habilitar o serviço Fail2ban para que ele seja executado automaticamente a partir de agora. Primeiro, execute systemctl enable:

  1. sudo systemctl enable fail2ban

Em seguida, inicie 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: disabled Active: active (running) since Mon 2022-06-27 19:25: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.6 -s /usr/bin/fail2ban-server -xf start Jun 27 19:25:15 fail2ban22 systemd[1]: Started Fail2Ban Service. Jun 27 19:25:15 fail2ban22 fail2ban-server[39396]: Server ready

No próximo passo, você demonstrará o Fail2ban em ação.

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

De outro servidor, 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. Depois de fazer login no seu segundo servidor, tente conectar via SSH no servidor Fail2ban. Você pode tentar se conectar usando um nome inexistente:

  1. ssh blah@your_server

Insira caracteres aleatórios no prompt 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 fail2ban-client. fail2ban-client é um comando adicional fornecido pelo Fail2ban para verificar sua configuração em execução.

  1. sudo fail2ban-client status
Output
Status |- Number of jail: 1 `- Jail list: sshd

Se você executar fail2ban-client status sshd, você pode ver a lista de IPs que foram banidos do SSH:

  1. sudo fail2ban-client status sshd
Output
Status for the jail: sshd |- Filter | |- Currently failed: 2 | |- Total failed: 7 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 134.209.165.184

O conteúdo da lista de IP banidos deve refletir o endereço IP do seu segundo servidor.

Conclusão

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

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-rocky-linux-8