Introdução
O SSH é o método de facto para se conectar 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 principal permaneça seguro. No entanto, nenhum protocolo ou pilha de software é totalmente à prova de falhas, e o fato de o SSH estar tão amplamente implantado na Internet significa que ele representa uma superfície de ataque muito previsível, através da qual as pessoas podem tentar obter acesso.Superfície de ataque ou vectores de ataque.
Qualquer serviço exposto à rede é um alvo potencial dessa maneira. Se você revisar os registros do seu serviço SSH em qualquer servidor com grande tráfego, frequentemente verá tentativas de login repetidas e sistemáticas que representam ataques de força bruta tanto por usuários quanto por bots. Embora seja possível fazer algumas otimizações em seu serviço SSH para reduzir a chance de que esses ataques tenham sucesso próximo de zero, como desabilitar a autenticação por senha em favor de chaves SSH, eles ainda podem representar uma responsabilidade menor e contínua.
Implantações de produção em grande escala para as quais essa responsabilidade é completamente inaceitável geralmente implementarão uma VPN como WireGuard à frente de seu serviço SSH, de modo que seja impossível conectar diretamente à porta padrão SSH 22 a partir da internet externa sem abstração de software adicional ou gateways. Essas soluções de VPN são amplamente confiáveis, mas acrescentarão complexidade e podem quebrar algumas automações ou outros ganchos de software pequenos.
Antes de 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 automaticamente alteram 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 22.04.
Pré-requisitos
Para completar este guia, você precisará de:
-
Um servidor Ubuntu 22.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 22.04.
-
Opcionalmente, um segundo servidor ao qual você pode se conectar a partir do seu primeiro servidor, que será usado para testar ser banido deliberadamente.
Passo 1 — Instalando o Fail2ban
O Fail2ban está disponível nos repositórios de software do Ubuntu. Comece executando os seguintes comandos como usuário não-root para atualizar suas listagens de pacotes e instalar o Fail2ban:
O Fail2ban configurará automaticamente um serviço em segundo plano após ser instalado. No entanto, ele está desativado por padrão, pois algumas de suas configurações padrão podem causar efeitos indesejados. Você pode verificar isso usando o comando systemctl
:
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 ativar 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
:
Output#
# AVISO: altamente reformulado na versão 0.9.0. Por favor, revise e
# customize as configurações para sua configuração.
#
# Mudanças: na maioria dos casos, você não deve modificar este
# arquivo, mas fornecer personalizações no arquivo jail.local,
# ou arquivos .conf separados no diretório jail.d/, por exemplo:
#
# COMO ATIVAR AS PRISÕES:
#
# 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 um jail.d/customisation.local.
# Por exemplo, para alterar o bantime padrão para todas as prisões e habilitar o
# jail ssh-iptables, o seguinte (descomentado) apareceria no arquivo .local.
# Consulte o manual 5 jail.conf para mais detalhes.
#
# [DEFAULT]
Como 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 também verá, esses comentários estão orientando 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á atualizado periodicamente conforme o próprio Fail2ban é atualizado, e será usado como fonte de configurações padrão para as quais você não criou nenhuma substituição.
Neste tutorial, você criará jail.local
. Você pode fazer isso copiando jail.conf
:
Agora você pode começar a fazer alterações na configuração. Abra o arquivo no nano
ou no seu editor de texto favorito:
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 do arquivo, existem 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.
[DEFAULT]
. . .
bantime = 10m
. . .
O parâmetro bantime
define o período de tempo que um cliente ficará banido quando falhar na autenticação correta. Isso é medido em segundos. Por padrão, isso está configurado para 10 minutos.
[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 banirá um cliente que tentar fazer login sem sucesso 5 vezes dentro de uma janela de 10 minutos.
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .
Se você precisar receber alertas por email quando o Fail2ban tomar medidas, você deve avaliar as configurações destemail
, sendername
e mta
. O parâmetro destemail
define o endereço de email que deve receber mensagens de banimento. O sendername
define o valor do campo “De” no email. O parâmetro mta
configura qual serviço de email será usado para enviar o email. Por padrão, isso é sendmail
, mas você pode querer usar Postfix ou outra solução de email.
[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 ofensor até que o tempo de banimento expire.
Há outros scripts action_
fornecidos por padrão que você pode substituir $(action_)
por acima:
…
# proibir 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"]
# proibir 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"]
# Consulte a nota IMPORTANTE em action.d/xarf-login-attack para saber quando usar esta ação
#
# proibir 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"]
# proibir o IP no CloudFlare e enviar um e-mail com o 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ção e envia um e-mail, action_mwl
realiza ação, envia um e-mail e inclui logging, e action_cf_mwl
faz tudo isso além de enviar uma atualização para a API do Cloudflare associada à sua conta para proibir o infrator lá também.
Configurações Individuais da Prisão
A seguir está a parte do arquivo de configuração que trata de serviços individuais. Estes são especificados por cabeçalhos de seção, como [sshd]
.
Cada uma destas seções precisa ser ativada individualmente adicionando uma linha enabled = true
sob o cabeçalho, com suas outras configurações.
[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 vamos cobrir esses arquivos em profundidade 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:
Se você ver 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 identificar contra 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ê está servindo um site usando o Nginx e percebe que uma parte protegida por senha do seu site está sendo atacada 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ó precisaria adicionar o parâmetro enabled
:
. . .
[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 daqui para frente. Primeiro, execute systemctl enable
:
Em seguida, inicie-o manualmente pela primeira vez com systemctl start
:
Você pode verificar se está em execução com systemctl status
:
Output● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enab>
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 /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 Bloqueio (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 fazer SSH no servidor Fail2ban. Você pode tentar se conectar usando um nome inexistente:
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 sinaliza 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 um nível mais baixo no seu servidor. Se você seguiu o guia de configuração inicial do servidor da DigitalOcean, estará usando ufw
para gerenciar regras de firewall em um nível mais alto. Executar iptables -S
mostrará todas as regras de firewall que ufw
já criou:
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 a string f2b
, você pode ver as regras que foram adicionadas pelo fail2ban:
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
terá sido 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 banimento para seus serviços. O Fail2ban é uma maneira útil de proteger qualquer tipo de serviço que utilize autenticação. Se deseja saber mais sobre como o fail2ban funciona, pode conferir nosso tutorial sobre como funcionam as regras e arquivos do fail2ban.
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-22-04