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 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 logs do seu serviço SSH em qualquer servidor de alto tráfego, muitas vezes verá tentativas de login sistemáticas e repetidas que representam ataques de força bruta por usuários e bots. Embora seja possível fazer algumas otimizações em seu serviço SSH para reduzir a chance desses ataques terem sucesso quase a zero, como desabilitar a autenticação por senha em favor de 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 WireGuard à frente de seu serviço SSH, para que seja impossível conectar diretamente à porta padrão SSH 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 pequenos ganchos de software.
Antes de ou além de se comprometer com uma configuração completa de VPN, você pode implementar uma ferramenta chamada Fail2ban. 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 sem sucesso. 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 concluir 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 Pacotes Aprimorados para Linux Corporativo, 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:
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:
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: disabled
Active: inactive (dead)
Docs: man:fail2ban(1)
Você poderia habilitar o Fail2ban imediatamente, mas primeiro, você 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 valores padrão chamado jail.conf
. Vá para esse diretório e imprima as primeiras 20 linhas desse arquivo usando head -20
:
Output#
# AVISO: intensamente refatorado na versão 0.9.0. Por favor, revise e
# personalize as configurações para sua configuração.
#
# Alterações: 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 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 ativar o
# jail ssh-iptables, o seguinte (descomentado) apareceria no arquivo .local.
# Consulte 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 como configurações. Como você 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á 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 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 de configuração. Abra o arquivo no vi
ou no seu editor de texto favorito:
Enquanto você estiver percorrendo o 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.
[DEFAULT]
. . .
bantime = 10m
. . .
O parâmetro bantime
define o tempo que um cliente será banido quando falhar na autenticação correta. Isso é medido em segundos. Por padrão, isso está definido para 10 minutos.
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .
Os dois próximos 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 se 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.
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .
Se você precisa receber alertas por e-mail quando o Fail2ban toma medidas, 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 proibição. 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 o correio. Por padrão, isso é sendmail
, mas você pode querer usar o 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 uma proibição. 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 proibição termine.
Há outros scripts action_
fornecidos por padrão que você pode substituir $(action_)
acima:
…
# banir & enviar um e-mail com 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 & enviar um e-mail com 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 & 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 & 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 ação e envia um e-mail, action_mwl
executa 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 da Prisão
Em seguida, vem 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.
[jail_to_enable]
. . .
enabled = true
. . .
Para este tutorial, você irá ativar a prisão SSH. Ela deve estar no topo das configurações individuais da prisão. Os parâmetros padrão funcionarão caso contrário, mas você precisará adicionar uma linha de configuração que diga enabled = true
sob o cabeçalho [sshd]
.
#
# JAILS
#
#
# Servidores SSH
#
[sshd]
# Para usar modos sshd mais agressivos, defina o parâmetro de filtro "mode" em 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 estão definidas aqui são o filter
que será usado para decidir se uma linha em um registro indica uma autenticação falha 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 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 registro é uma tentativa de autenticação falha. Não iremos cobrir esses arquivos em detalhes neste guia, porque eles são bastante complexos e as configurações predefinidas combinam bem com as linhas apropriadas.
No entanto, você pode ver que tipos de filtros estão disponíveis ao examinar esse diretório:
Se você encontrar um arquivo que parece relacionado a um serviço que está usando, deve abri-lo com um editor de texto. A maioria dos arquivos está bem comentada e você deve conseguir pelo menos entender que tipo de condição o script foi projetado para proteger. A maioria desses filtros possui seções apropriadas (desativadas) no arquivo jail.conf
que podemos habilitar no arquivo jail.local
se desejado.
Por exemplo, imagine que 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ó precisaria adicionar o parâmetro enabled
:
. . .
[nginx-http-auth]
enabled = true
. . .
Quando terminar de editar, salve e feche o arquivo. Se estiver usando o vi
, use :x
para salvar e sair. Neste ponto, você pode habilitar o seu serviço Fail2ban para que ele execute automaticamente a partir de agora. Primeiro, execute systemctl enable
:
Em seguida, inicie 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: 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
Na próxima etapa, você demonstrará o Fail2ban em ação.
Etapa 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 obtendo aquele segundo servidor banido. Depois de fazer login no seu segundo servidor, tente fazer SSH para o servidor Fail2ban. Você pode tentar conectar usando um nome inexistente:
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 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 fail2ban-client
. fail2ban-client
é um comando adicional fornecido pelo Fail2ban para verificar sua configuração em execução.
OutputStatus
|- Number of jail: 1
`- Jail list: sshd
Se você executar fail2ban-client status sshd
, poderá ver a lista de IPs que foram banidos do SSH:
OutputStatus 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 IPs 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 utilize 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 Fail2Ban e Como proteger um servidor Apache com Fail2Ban.
Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-rocky-linux-8