
ssh-keygen -t rsa) e desligava senha com UsePAM no + /etc/init.d/ssh restart. Hoje o default é Ed25519; PAM permanece ligado; o drop-in vai em sshd_config.d; só se corta senha depois de testar a chave numa segunda sessão.Senha no SSH ainda cai em brute-force. O par de chaves — pública no servidor, privada na sua máquina, protegida por passphrase — é o login de 2026. O OpenSSH do Ubuntu 24.04/26.04 já gera Ed25519 se você chamar ssh-keygen sem flags (desde o 9.5). O resto é permissão, ssh-copy-id e não se trancar do lado de fora.
Gere a chave no cliente
Como o seu usuário, nunca como root:
ssh-keygen -t ed25519 -a 64 -C "$(whoami)@$(hostname)-2026"
Aceite ~/.ssh/id_ed25519. Coloque uma passphrase de verdade — a chave privada sem frase é um login em arquivo. -a 64 aumenta as rodadas KDF. Servidor velho que não fala Ed25519 (raro): ssh-keygen -t rsa -b 4096. DSA está morto no OpenSSH 7+.
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
Instale a pública no servidor
ssh-copy-id cria ~/.ssh, acerta permissão e anexa a linha em authorized_keys:
ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@servidor
# porta não padrão:
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 usuario@servidor
Sem ssh-copy-id:
ssh usuario@servidor 'mkdir -p ~/.ssh && chmod 700 ~/.ssh'
cat ~/.ssh/id_ed25519.pub | ssh usuario@servidor 'cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'
Teste antes de mexer no sshd:
ssh -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes usuario@servidor
Tem que entrar sem a senha da conta (a passphrase da chave, se tiver, o agent pergunta). Deixe essa sessão aberta. Abra outro terminal para o endurecimento.
Desligue senha — sem UsePAM no
No Ubuntu, UsePAM no (o conselho de 2017) quebra outros caminhos do PAM. Mantenha PAM. Use drop-in, não edite o sshd_config inteiro:
sudo tee /etc/ssh/sshd_config.d/99-keys-only.conf <<'EOF'
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
PermitRootLogin prohibit-password
EOF
sudo sshd -t && sudo systemctl reload ssh
No RHEL/Rocky o serviço é sshd: sudo systemctl reload sshd. Confirme na sessão que ficou aberta, e numa nova:
ssh usuario@servidor
Se a nova falhar, a sessão antiga ainda salva. Não feche o console até a chave funcionar duas vezes.
Agent, config, chave física
ssh-agent (ou o gnome-keyring) segura a privada destrancada na sessão gráfica:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
Um ~/.ssh/config evita flag:
Host lab
HostName 192.0.2.10
User nilton
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
YubiKey / FIDO2: ssh-keygen -t ed25519-sk (OpenSSH 8.2+). A privada não sai do token. ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub usuario@servidor.
O que ficou
Ed25519, ssh-copy-id, testar, só então cortar senha. O diagrama de 2017 (cliente, sessão, chaves) continua válido; o algoritmo e o init.d não. Man page: man ssh-keygen, man sshd_config.