Introdução
O SSH é o método de facto para 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 central permaneça seguro. No entanto, nenhum protocolo ou conjunto de software é totalmente infalível, e o fato do SSH ser tão amplamente implantado pela 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 potencial dessa maneira. Se você revisar os registros do seu serviço SSH em qualquer servidor com muito tráfego, frequentemente verá tentativas de login repetidas e sistemáticas que representam ataques de força bruta por usuários e bots. Embora você possa fazer algumas otimizações em seu serviço SSH para reduzir a chance desses ataques terem sucesso para próximo de zero, como desabilitar a autenticação por senha em favor das chaves SSH, eles ainda podem representar uma pequena responsabilidade 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 conectar diretamente à porta SSH padrão 22 da internet externa sem abstração ou gateways de software adicionais. Essas soluções 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 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 completar este guia, você precisará:
-
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 do qual você pode se conectar ao seu primeiro servidor, que você usará 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 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, porque 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ê pode 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
:
Output#
# ATENÇÃO: fortemente refatorado na versão 0.9.0. Por favor, revise e
# personalize as configurações para a sua instalação.
#
# Mudanças: 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 AS CELAS:
#
# VOCÊ NÃO DEVE MODIFICAR ESTE ARQUIVO.
#
# Provavelmente será sobrescrito ou melhorado em uma atualização da distribuição.
#
# Forneça personalizações em um arquivo jail.local ou em um jail.d/customisation.local.
# Por exemplo, para alterar o bantime padrão para todas as celas e para habilitar a
# cela ssh-iptables, o seguinte (descomentado) apareceria no arquivo .local.
# Consulte o manual 5 jail.conf para obter 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 indicando que você não deve 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 seja atualizado, e será usado como fonte de configurações padrão para as quais você não criou substituições.
Neste tutorial, você criará o arquivo jail.local
. Você pode fazer isso copiando o 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 padrões.
[DEFAULT]
. . .
bantime = 10m
. . .
O parâmetro bantime
define o tempo em que um cliente será 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
. Estes trabalham juntos para estabelecer as condições nas 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 um intervalo de tempo definido 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.
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .
Se você precisar receber alertas por e-mail quando o Fail2ban tomar medidas, 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.
[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 logo antes deste parâmetro. A ação padrão é atualizar a configuração do seu firewall para rejeitar o tráfego do host ofensivo até que o tempo de banimento termine.
Há outros scripts action_
fornecidos por padrão que você pode substituir $(action_)
acima:
…
# 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 saber 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
realiza a ação e envia um e-mail, action_mwl
realiza a 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 de 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 destas seções precisa ser habilitada 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 diz ao fail2ban onde os logs 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 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 abordar 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:
Se você encontrar um arquivo que parece relacionado a um serviço que está usando, você deve abri-lo com um editor de texto. A maioria dos arquivos está bastante comentada e você deve ser capaz de pelo menos identificar que tipo de condição o script foi projetado para proteger contra. A maioria desses filtros tem 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
:
. . .
[nginx-http-auth]
enabled = true
. . .
Ao 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 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
No próximo passo, você demonstrará o Fail2ban em ação.
Passo 3 — Testando as Políticas de Banimento (Opcional)
De outro servidor, um que não precisará se conectar ao 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 fazer SSH no servidor Fail2ban. Você pode tentar se conectar usando um nome inexistente:
Digite 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 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 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:
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ê encaminhar 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:
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 proibição para seus serviços. O 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 verificar 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 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