Usando chaves de autenticação no SSH

Mascote do LinuxPro enfiando a chave na fechadura do servidor, com o túnel SSH cifrado levando as chaves do notebook até o rack

Nota (2026): O howto de 2017 gerava RSA (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.