Usando claves de autenticación en 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): El howto de 2017 generaba RSA (ssh-keygen -t rsa) y desactivaba la contraseña con UsePAM no + /etc/init.d/ssh restart. Hoy el default es Ed25519; PAM sigue activado; el drop-in va en sshd_config.d; solo se corta la contraseña después de probar la clave en una segunda sesión.

La contraseña en SSH sigue cayendo ante fuerza bruta. El par de claves —pública en el servidor, privada en tu máquina, protegida por passphrase— es el inicio de sesión de 2026. El OpenSSH de Ubuntu 24.04/26.04 ya genera Ed25519 si llamas a ssh-keygen sin flags (desde el 9.5). El resto son permisos, ssh-copy-id y no quedarse fuera.

Genera la clave en el cliente

Como su usuario, nunca como root:

ssh-keygen -t ed25519 -a 64 -C "$(whoami)@$(hostname)-2026"

Acepte ~/.ssh/id_ed25519. Ponga una passphrase de verdad — la clave privada sin frase es un inicio de sesión en un archivo. -a 64 aumenta las rondas KDF. Servidor antiguo que no habla Ed25519 (raro): ssh-keygen -t rsa -b 4096. DSA está muerto en OpenSSH 7+.

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub

Instala la pública en el servidor

ssh-copy-id crea ~/.ssh, ajusta los permisos y añade la línea en 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

Sin 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'

Prueba antes de tocar el sshd:

ssh -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes usuario@servidor

Tiene que entrar sin la contraseña de la cuenta (la passphrase de la clave, si la tiene, el agente la pregunta). Deje esa sesión abierta. Abra otra terminal para el endurecimiento.

Desactive contraseña — sin UsePAM no

En Ubuntu, UsePAM no (el consejo de 2017) rompe otras rutas de PAM. Mantenga PAM. Use drop-in, no edite el sshd_config entero:

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

En RHEL/Rocky el servicio es sshd: sudo systemctl reload sshd. Confirme en la sesión que quedó abierta, y en una nueva:

ssh usuario@servidor

Si la nueva falla, la sesión anterior aún salva. No cierre la consola hasta que la clave funcione dos veces.

Agente, config, clave física

ssh-agent (o gnome-keyring) guarda la privada desbloqueada en la sesión gráfica:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

Un ~/.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+). La privada no sale del token. ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub usuario@servidor.

Cierre

Ed25519, ssh-copy-id, probar, solo entonces quitar la contraseña. El diagrama de 2017 (cliente, sesión, claves) sigue siendo válido; el algoritmo y el init.d no. Página de manual: man ssh-keygen, man sshd_config.