Como Prender Bots de Força Bruta SSH num Ciclo Infinito: O Endlessh Protege a Porta 22 com Apenas 2MB de Memória RAM

Como Prender Bots de Força Bruta SSH num Ciclo Infinito: O Endlessh Protege a Porta 22 com Apenas 2MB de Memória RAM

O Zumbido Constante na Porta 22: O Flagelo dos Bots de Força Bruta

Qualquer endereço IP público atribuído a um servidor dedicado, VPS ou máquina em Portugal é alvo de varrimentos automáticos contínuos. Poucos minutos após ligares uma máquina à internet com Debian GNU/Linux, dezenas de redes de computadores infetados começam a bater à porta 22 à procura de palavras-passe fracas.

Espreita os registos de autenticação do teu servidor:

journalctl -u ssh -n 50 --no-pager

Vais encontrar uma torrente ininterrupta de tentativas falhadas:

Oct 19 03:12:01 srv sshd[84920]: Failed password for invalid user admin from 185.220.101.5 port 41202 ssh2
Oct 19 03:12:03 srv sshd[84923]: Failed password for invalid user root from 185.220.101.5 port 41204 ssh2
Oct 19 03:12:06 srv sshd[84928]: Failed password for invalid user test from 185.220.101.5 port 41208 ssh2
Oct 19 03:12:09 srv sshd[84931]: Failed password for invalid user oracle from 185.220.101.5 port 41212 ssh2

O CICLO TRADICIONAL DE UM ATAQUE DE FORÇA BRUTA

  • Bot Automatizado de Ataque → Porta 22 (Serviço OpenSSH Real)
    1. O OpenSSH cria um processo filho no Linux (Consome ~6MB de RAM)
    1. Executa a pilha de autenticação PAM e troca chaves criptográficas
    1. Rejeita o utilizador inválido → Grava a falha no disco
    1. O bot desliga-se e tenta a senha seguinte num milissegundo!
  • Resultado: 50.000 tentativas por dia. Disco saturado, logs cheios e CPU gasto!

Mesmo que tenhas desligado a autenticação por palavra-passe e uses apenas chaves SSH, o OpenSSH tem de criar um processo, alocar memória e negociar criptografia para cada ligação. Com milhares de ataques diários, gastas recursos de processamento e ficas com os ficheiros de auditoria entupidos.

Em vez de te limitares a rejeitar as tentativas, porque não invertes o jogo e prendes os computadores dos atacantes numa armadilha sem fim?

É para isto que serve o Endlessh.

No nosso serviço de alojamento gerido e nas intervenções de consultoria técnica, instalamos tarpits na porta 22 para neutralizar bots e poupar recursos no servidor.


Como Funciona o Endlessh: Tirar Partido da Norma RFC 4253

Como é que um programa minúsculo consegue segurar um atacante ligado durante 48 horas seguidas sem dar erro de ligação?

O segredo está no documento oficial da norma do protocolo SSH (RFC 4253, Secção 4.2). A especificação diz expressamente:

“O servidor PODE enviar outras linhas de dados antes de enviar a linha de versão do protocolo. Cada linha DEVE terminar com Carriage Return e Line Feed. Estas linhas NÃO DEVEM começar por ‘SSH-’.”

Esta regra foi criada nos anos 90 para permitir aos servidores exibir avisos legais e termos de utilização antes de iniciar a sessão.

A ARMADILHA INFINITA DO ENDLESSH

  • Bot Atacante TCP SYN Porta 22 → Armadilha Endlessh
  • Bot Atacante → TCP SYN-ACK Armadilha Endlessh
  • Bot Atacante ACK (Socket Aberto com Sucesso!) → Armadilha Endlessh
  • O Bot Fica à Espera da Versão do Protocolo SSH…
  • O Endlessh envia 32 bytes de texto: “Aviso: A aguardar…\r\n” → (Segundo 0)
  • O Endlessh fica em pausa silenciosa durante 10 segundos…
  • O Endlessh envia 32 bytes de texto: “Servidor nó #4…\r\n” → (Segundo 10)
  • O Endlessh fica em pausa silenciosa durante 10 segundos…
  • O Endlessh envia 32 bytes de texto: “A validar chaves…\r\n” → (Segundo 20)
  • O bot fica PRESO neste ciclo durante horas sem conseguir atacar mais nada!

O Endlessh aceita o pedido TCP na hora e começa a cuspir linhas aleatórias com um compasso de espera premeditado de 10 segundos entre cada linha.

Como chegam dados novos a cada dez segundos, o software do atacante não desliga por inatividade. Mas como a identificação do SSH nunca chega ao fim, o bot não consegue experimentar senhas. Fica com a ligação pendurada, a gastar a memória dele enquanto o teu servidor gasta praticamente zero.


A Arquitetura: Mudar o OpenSSH para a Porta 2222 e o Endlessh para a 22

Para montares esta defesa, passas o teu serviço de acesso administrativo para uma porta alta protegida e deixas a porta 22 pública entregue ao Endlessh:

DIVISÃO DE PORTAS DE ENTRADA NO TEU SERVIDOR

  • TRÁFEGO DA INTERNET
  • Porta 22 (PÚBLICA) → Endlessh Tarpit (Prende os Bots!)
  • Consumo: Menos de 2MB de RAM
  • Regista os IPs dos atacantes
  • Porta 2222 (PROTEGIDA) → OpenSSH Real (O Teu Acesso Limpo)
  • Chaves criptográficas Ed25519
  • Zero tráfego de ataques e lixo

1. Muda o OpenSSH para a Porta 2222

Antes de mexeres na porta 22, certifica-te de que não perdes o acesso à máquina. Abre o ficheiro /etc/ssh/sshd_config (ou um ficheiro na diretoria /etc/ssh/sshd_config.d/):

# Muda a porta de escuta do SSH legítimo
Port 2222

# Desliga o acesso direto com senha para root
PermitRootLogin prohibit-password
PasswordAuthentication no

Testa se a configuração está bem escrita antes de recarregares o serviço:

# Valida a sintaxe do ficheiro de configuração
sshd -t

# Reinicia o serviço de SSH seguro
systemctl restart ssh

PASSO OBRIGATÓRIO: Sem fechares a consola atual, abre outro terminal no teu computador e confirma que entras na porta 2222:

ssh -p 2222 admin@oteuservidor.com

Com o acesso confirmado na nova porta, estás pronto para armar a ratoeira.


2. Instalação e Configuração do Endlessh em Debian 12

O Endlessh faz parte dos repositórios oficiais do Debian e do Ubuntu, com código-fonte no GitHub:

# Instala o pacote do Endlessh
apt update && apt install -y endlessh

1. Configura as Opções da Armadilha

Abre o ficheiro de configuração /etc/endlessh/config:

# Porta onde o tarpit vai esperar pelos atacantes
Port 22

# Intervalo entre o envio de cada linha de texto em milissegundos (10s)
Delay 10000

# Tamanho máximo de cada linha de texto aleatório
MaxLineLength 32

# Limite de atacantes mantidos presos em simultâneo
MaxClients 4096

# Nível de detalhe dos registos
LogLevel 1
BindFamily 4

2. Autoriza o Endlessh a Abrir a Porta 22

Como o Endlessh corre sob um utilizador de sistema sem privilégios (nobody), o kernel do Linux não autoriza a abertura de portas abaixo de 1024 por defeito. Concede essa capacidade com o utilitário setcap:

# Dá permissão para escuta em portas privilegiadas
setcap 'cap_net_bind_service=+ep' /usr/bin/endlessh

3. Configuração do Serviço no Systemd

Garante que o ficheiro /lib/systemd/system/endlessh.service está configurado para arrancar de forma segura com o systemd:

[Unit]
Description=Endlessh SSH Tarpit
Documentation=man:endlessh(1)
Requires=network.target

[Service]
Type=simple
Restart=always
RestartSec=30sec
ExecStart=/usr/bin/endlessh -f /etc/endlessh/config
User=nobody
Group=nogroup
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true

[Install]
WantedBy=multi-user.target

Ativa o serviço no sistema:

systemctl daemon-reload
systemctl enable --now endlessh
systemctl status endlessh

A Apanhar os Invasores: Resultados e Telemetria em Produção

Depois de ativado, podes testar a armadilha a partir do teu próprio computador:

ssh -v -p 22 localhost

Vais ver a ligação a entrar e a ficar parada, recebendo uma linha de texto a cada dez segundos.

Agora, espreita os registos reais do Endlessh para veres os bots a cair na armadilha:

journalctl -u endlessh -f

Exemplo real de telemetria:

Oct 19 14:15:22 srv endlessh[40912]: ACCEPT host=194.26.29.112 port=48922 fd=3 n=1/4096
Oct 19 14:15:45 srv endlessh[40912]: ACCEPT host=45.154.255.89 port=51204 fd=4 n=2/4096
Oct 19 14:52:10 srv endlessh[40912]: CLOSE host=194.26.29.112 port=48922 time=2208.140 bytes=7072

Repara na última linha: um bot automático esteve preso durante 2.208 segundos (quase 37 minutos), a gastar a largura de banda e os recursos do atacante antes de desistir!

COMPARATIVO DE CONSUMO DE RECURSOS EM PRODUÇÃO

  • 500 Ligações Concorrentes de Ataque no OpenSSH Tradicional: Memória: ~3.000 MB de RAM (500 processos bifurcados)
  • CPU: Picos de 40% a calcular negociações criptográficas
  • Disco: Milhares de linhas inúteis gravadas nos ficheiros de log
  • 500 Ligações Concorrentes Presas no Endlessh: Memória: Apenas 1.8 MB de memória residente (Zero processos extra)
  • CPU: 0.01% (Um único ciclo de escuta poll)
  • Disco: Zero ruído e zero senhas gravadas

Com esta estratégia inteligente, fazes com que as ferramentas dos atacantes trabalhem contra eles próprios. Fiel ao nosso lema de anti-over-engineering, resolves o problema dos ataques de força bruta com uma ferramenta minúscula em C que corre durante anos sem manutenção nem complicações.

No terreno, em conjunto com a experiência acumulada na Webxtek Studio, aplicamos exatamente estes padrões operacionais em setores exigentes como cibersegurança b2b e inteligência corporativa e cibersegurança. Quando alinhas a tua estrutura através de alojamento gerido para websites e aplicações e consultoria técnica antes de construir, transformas boas práticas técnicas numa vantagem competitiva real e mensurável para o teu negócio.

[+] [ INDEX_DIRECTORY ] 17 tópicos ▼
[ SYSTEM.FAQ ]

Perguntas Frequentes

O que é um SSH tarpit e como funciona o Endlessh na prática?

Um tarpit (ou poço de piche) é um mecanismo de defesa em redes que responde propositadamente o mais devagar possível aos atacantes. Quando um bot tenta ligar-se à porta 22, o `endlessh` responde enviando uma linha de boas-vindas aleatória a cada 10 segundos. Como a norma RFC 4253 permite o envio de texto de aviso antes da negociação de chaves, os clientes automatizados ficam presos à espera durante horas ou dias.

Porque é que usar um tarpit é muito melhor do que ter o Fail2ban na porta 22?

O Fail2ban é reativo: lê os registos após falhas de autenticação e cria regras temporárias no firewall, gastando processador e acumulando centenas de linhas no iptables. Se fechares a porta 22, o bot passa a varrer outras portas. O Endlessh prende os sockets e as threads do atacante, consumindo os recursos do criminoso enquanto o teu servidor gasta apenas 2MB de RAM.

Quanto consome o Endlessh em termos de memória RAM e processador?

O Endlessh foi escrito em C puro com recurso à chamada de sistema `poll()`. Funciona numa única thread sem criar processos filhos para cada ligação, conseguindo manter milhares de atacantes pendurados em simultâneo com um consumo insignificante de menos de 2MB de memória residente e 0% de CPU.

Onde deves colocar o serviço real do OpenSSH se o Endlessh estiver na porta 22?

O serviço OpenSSH verdadeiro (`sshd`) deve ser mudado para uma porta alta não padrão (como a `2222` ou outra porta aleatória acima de 1024) protegida por chave SSH e idealmente atrás de uma VPN WireGuard, deixando a porta 22 pública exclusivamente para a armadilha do Endlessh.

> INICIAR_PROJETO

Precisa de um website que transmita confiança, apareça na pesquisa e dê mais força à sua presença digital? Comece a conversa aqui.