Como proteger o SSH no Debian, Ubuntu e Proxmox: chaves ed25519, sem login por senha, root restrito e bloqueio de força bruta com fail2ban ou CrowdSec.
Para que serve
O SSH é o alvo número um de ataques de força bruta em servidores Linux. Este artigo mostra como proteger o SSH: trocar senhas por chaves ed25519, desligar o login por senha, restringir o root e bloquear automaticamente IPs abusivos com fail2ban ou CrowdSec. Os comandos valem para Debian 12/13, Ubuntu 24.04 e Proxmox VE 8.x/9.x.
Pré-requisitos
- Acesso ao servidor com um usuário que tenha
sudo(ou root). Para criar esse usuário, veja também o artigo «Como criar usuário com sudo no Debian, Ubuntu e Proxmox VE». - OpenSSH 8.x ou mais novo no seu computador (Linux, macOS e Windows 10/11 já trazem).
- Acesso ao console IPMI/iLO para recuperação.
Como proteger o SSH passo a passo
1. Gere uma chave ed25519 no seu computador
ssh-keygen -t ed25519 -a 100 -C "joao@empresa"
Defina uma passphrase. A chave privada (~/.ssh/id_ed25519) nunca sai do seu computador; o servidor recebe só a pública (.pub).
2. Copie a chave pública para o servidor
ssh-copy-id -i ~/.ssh/id_ed25519.pub joao@SEU_IP
No Windows, sem ssh-copy-id, cole o conteúdo do .pub numa linha do arquivo ~/.ssh/authorized_keys do usuário no servidor e ajuste as permissões:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Teste em outra janela: ssh joao@SEU_IP. Ele deve pedir a passphrase da chave, não a senha do usuário.
3. Crie um arquivo de configuração próprio
Em vez de editar o sshd_config principal, use um arquivo em /etc/ssh/sshd_config.d/. O nome começando com 00- é proposital: no sshd vale o primeiro valor lido, e algumas imagens trazem arquivos como 50-cloud-init.conf que reativam a senha.
sudo nano /etc/ssh/sshd_config.d/00-hardening.conf
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
PermitEmptyPasswords no
MaxAuthTries 3
LoginGraceTime 30
X11Forwarding no
AllowUsers joao
No host Proxmox VE, use PermitRootLogin prohibit-password em vez de no: os nós de um cluster se comunicam por SSH como root usando chaves, e bloquear o root quebra migração e replicação. Ajuste também o AllowUsers para incluir root nesse caso, ou omita a linha.
4. Valide e aplique
sudo sshd -t
sudo systemctl reload ssh
O sshd -t não mostra nada se a sintaxe estiver correta. Teste o login numa nova janela antes de fechar a sessão atual.
5. (Opcional) Mudar a porta
Trocar a porta 22 não é proteção real, mas reduz muito o ruído de robôs nos logs. Se fizer, libere a nova porta no firewall antes. Adicione ao seu arquivo:
Port 2222
No Ubuntu 24.04 o SSH usa ativação por socket do systemd; a troca de porta só vale depois de:
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
No Debian e no Proxmox, um sudo systemctl restart ssh basta. A opção mais eficaz, porém, é limitar a porta do SSH no firewall aos IPs da sua equipe ou acessar só via VPN (WireGuard). Veja também o artigo «Como liberar o acesso ao Proxmox (porta 8006), SSH e RDP só pela VPN».
6a. Bloqueio automático com fail2ban
sudo apt install fail2ban python3-systemd
Crie /etc/fail2ban/jail.local (nunca edite o jail.conf):
[DEFAULT]
backend = systemd
bantime = 1h
findtime = 10m
maxretry = 5
bantime.increment = true
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
[sshd]
enabled = true
port = ssh
Troque 203.0.113.10 pelo IP fixo do seu escritório e, se mudou a porta, informe-a em port. O backend = systemd é necessário no Debian 12/13, que não grava mais /var/log/auth.log por padrão.
sudo systemctl enable --now fail2ban
sudo systemctl restart fail2ban
6b. Alternativa: CrowdSec
O CrowdSec analisa os logs localmente e também usa uma lista colaborativa de IPs maliciosos. Ele detecta, mas quem bloqueia é o bouncer, que precisa ser instalado à parte. Use ou fail2ban ou CrowdSec, não os dois no mesmo serviço.
curl -s https://install.crowdsec.net | sudo sh
sudo apt install crowdsec
sudo apt install crowdsec-firewall-bouncer-iptables
A coleção de SSH é instalada automaticamente quando o CrowdSec detecta o serviço. Se preferir, revise o script de instalação antes de rodá-lo ou configure o repositório manualmente conforme a documentação oficial.
Como saber se funcionou
- Forçar senha deve falhar:
ssh -o PubkeyAuthentication=no joao@SEU_IPretornaPermission denied (publickey). - Confira a configuração efetiva:
sudo sshd -T | grep -Ei 'passwordauth|permitroot|kbdinter'. - fail2ban:
sudo fail2ban-client status sshdmostra IPs banidos e falhas detectadas. - CrowdSec:
sudo cscli decisions listesudo cscli metricsmostram bloqueios e logs lidos.
Para uma camada a mais, veja também o artigo «Como ativar autenticação em dois fatores (2FA) no SSH, Proxmox, Windows e painéis».
Problemas comuns
Ainda aceita senha depois da mudança
Outro arquivo em /etc/ssh/sshd_config.d/ está definindo PasswordAuthentication yes antes do seu. Rode grep -ri passwordauth /etc/ssh/, corrija ou renomeie o seu arquivo para ser lido primeiro e recarregue o serviço.
"Permission denied (publickey)" com a chave correta
Quase sempre é permissão: o diretório home, ~/.ssh e authorized_keys não podem ter escrita para grupo ou outros. Veja o motivo exato com sudo journalctl -u ssh -n 50.
Fiquei trancado fora
Acesse pelo console IPMI/iLO, faça login local, remova ou corrija /etc/ssh/sshd_config.d/00-hardening.conf e rode systemctl restart ssh. Se o fail2ban baniu seu IP: fail2ban-client set sshd unbanip SEU_IP; no CrowdSec: cscli decisions delete --ip SEU_IP.
fail2ban não inicia
Geralmente falta o backend = systemd ou o pacote python3-systemd. Veja o erro com sudo fail2ban-client -d ou journalctl -u fail2ban.
Perguntas frequentes
Como desativar o login por senha no SSH?
Crie /etc/ssh/sshd_config.d/00-hardening.conf com PasswordAuthentication no e KbdInteractiveAuthentication no, valide com sshd -t e recarregue o serviço.
Por que usar chave ed25519?
É um algoritmo moderno, rápido e com chaves curtas. Combinada com uma passphrase, a chave substitui a senha e torna a força bruta inútil.
Trocar a porta 22 deixa o SSH seguro?
Não. Só reduz o ruído de robôs nos logs. Proteção real é login por chave, root restrito e a porta liberada só para IPs conhecidos ou pela VPN.
Posso bloquear o root no SSH do Proxmox?
No host Proxmox use PermitRootLogin prohibit-password em vez de no, porque os nós de um cluster se comunicam por SSH como root com chaves.
Fail2ban ou CrowdSec?
Os dois bloqueiam IPs abusivos. O fail2ban é simples e local; o CrowdSec soma uma lista colaborativa de IPs maliciosos. Use um ou outro no mesmo serviço, não os dois.
Precisa de ajuda?
Se perdeu o acesso ao servidor e também não consegue usar o console IPMI/iLO, abra um ticket pela área do cliente.
