Antes de cambiar nada
Demuestra que una clave funciona. Este comando solo prueba claves, así que una contraseña no puede ocultar un problema:
ssh -o PreferredAuthentications=publickey user@server
¿Aún no tienes clave? Genera una clave SSH Ed25519 y ponla antes en el servidor.
Comprueba que esta cuenta puede usar sudo y mantén una sesión abierta hasta el último paso. En nuestra prueba, las sesiones existentes siguieron tras una recarga, así que esa sesión es tu vía de regreso si los ajustes nuevos te dejan fuera. Si tu proveedor tiene una consola web, localízala ahora.
Mira qué está en vigor hoy
sudo sshd -T | grep -iE '^(passwordauthentication|kbdinteractiveauthentication|usepam|permitrootlogin) '
sshd -T imprime los valores que sshd usa de verdad tras leer todos sus archivos. Fíate de esto, no de lo que leas en sshd_config.
Por qué editar sshd_config muchas veces no hace nada
En la mayoría de los ajustes, sshd usa el primer valor que encuentra. En Debian y Ubuntu actuales, la línea Include /etc/ssh/sshd_config.d/*.conf está cerca del principio de sshd_config, así que los archivos drop-in se leen primero, por orden de nombre. Comprueba el tuyo:
grep -n Include /etc/ssh/sshd_config
ls /etc/ssh/sshd_config.d/
Las imágenes de nube suelen traer un archivo como 50-cloud-init.conf con PasswordAuthentication yes. Probamos ese caso: con ese archivo presente, poner PasswordAuthentication no en sshd_config dejó sshd -T mostrando todavía yes.
Un archivo cuyo nombre se ordena primero gana a todos los demás, por eso el nombre de abajo empieza por 00. Si no hay línea Include, como en servidores anteriores a OpenSSH 8.2 o con un archivo personalizado, pon los ajustes en el propio sshd_config, encima de cualquier bloque Match, y elimina las líneas anteriores que los definan.
Crea el archivo drop-in
sudo tee /etc/ssh/sshd_config.d/00-no-passwords.conf >/dev/null <<'EOF'
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
EOF
KbdInteractiveAuthentication también debe estar desactivado. Con solo PasswordAuthentication no y este ajuste activado, nuestro servidor de prueba aún aceptaba la contraseña de la cuenta, porque PAM la pide mediante keyboard-interactive. Antes de OpenSSH 8.7 la opción se llamaba ChallengeResponseAuthentication, y el nombre antiguo sigue funcionando como alias.
UsePAM puede seguir en yes. PAM también gestiona las comprobaciones de cuenta y la preparación de la sesión, y con las dos líneas de arriba ya no ofrece un aviso de contraseña. Algunas distribuciones desaconsejan desactivarlo, así que déjalo como está.
PermitRootLogin prohibit-password permite que root entre solo con una clave. Usa no si nadie debe entrar como root. Hasta OpenSSH 10.0, sshd -T muestra prohibit-password con su nombre antiguo, without-password.
Prueba el archivo y recarga
sudo sshd -t
sudo sshd -T | grep -iE '^(passwordauthentication|kbdinteractiveauthentication) '
sshd -t no imprime nada cuando la configuración es válida. No te lo saltes: enviamos la señal de recarga a un sshd con una línea no válida en un drop-in, y terminó, sin dejar nada escuchando conexiones nuevas.
sudo systemctl reload ssh # Debian, Ubuntu
sudo systemctl reload sshd # RHEL, Fedora, Arch
Prefiere reload a restart. Un reload solo pide al sshd en marcha que vuelva a leer su configuración, y nuestra sesión abierta lo superó. En Debian 13 el archivo de servicio también ejecuta sshd -t antes de enviar la señal, así que un archivo roto detiene allí la recarga, pero no cuentes con que todas las distribuciones lo hagan.
Confirma desde otra terminal
No toques la sesión abierta y prueba un acceso con contraseña desde tu propio equipo:
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password,keyboard-interactive user@server
El resultado debe ser Permission denied (publickey). sin pedir contraseña. Luego comprueba que tu clave sigue entrando con una conexión nueva. Solo entonces cierra la sesión antigua.
Si sigue apareciendo un aviso de contraseña
- Ejecuta
sudo sshd -Totra vez. Si muestrayes, otro archivo lo define antes: busca consudo grep -ri passwordauthentication /etc/ssh/. - Busca un bloque
Match. Puede volver a activar las contraseñas para algunos usuarios o direcciones, y elsshd -Tsimple no lo muestra. Pasa los datos de la conexión para evaluarlo:sudo sshd -T -C user=user,host=example.com,addr=203.0.113.10 | grep -i ^passwordauthentication - Comprueba que llegas a este servidor y a este puerto, y no a otra máquina detrás del mismo nombre.
- Que te pidan la frase de contraseña de una clave no es un aviso de contraseña. Viene de tu propio equipo y desbloquea tu clave.
Preguntas
¿Basta con PasswordAuthentication no?
No siempre. Con KbdInteractiveAuthentication activo, PAM aún puede pedir la contraseña por keyboard-interactive. Desactiva los dos.
¿Por qué sshd_config dice no pero las contraseñas siguen funcionando?
Un archivo de /etc/ssh/sshd_config.d se lee antes y gana. Comprueba el valor en uso con sudo sshd -T.
¿Debo poner UsePAM no?
No. PAM también se ocupa de las comprobaciones de cuenta y de las sesiones. Con los dos ajustes desactivados, ya no pide contraseña.
Fuentes
- sshd_config(5), manual de OpenBSD
- sshd(8), manual de OpenBSD
- Notas de versión de OpenSSH 8.2, Include en sshd_config
- Notas de versión de OpenSSH 8.7, KbdInteractiveAuthentication