SSH: pusiste PasswordAuthentication no y sigue activo (el fichero de sshd_config.d)
Con Include al principio de sshd_config, un 50-cloud-init.conf con PasswordAuthentication yes deja la autenticación por contraseña activa aunque sshd_config diga no; con el no en un fichero 00-*.conf gana el no. sshd -T lo muestra.
Contenido
Este artículo no contiene enlaces de afiliado.
Si asegurar SSH para ti es poner PasswordAuthentication no en /etc/ssh/sshd_config y reiniciar, hay un caso en el que el cambio no sirve de nada: otro fichero en sshd_config.d/ dice yes. Se probó con sshd -T, que muestra la configuración efectiva sin arrancar el servicio.
Condiciones: OpenSSH 9.6p1 (Ubuntu 24.04, arm64), un directorio de pruebas con su propia clave de host; no se tocó /etc/ssh ni se arrancó ningún demonio. Script completo al final.
Resultado
| Situación | passwordauthentication efectivo |
|---|---|
sshd_config con no, sin ficheros en sshd_config.d |
no |
Include al principio de sshd_config y 50-cloud-init.conf con yes |
yes |
no en sshd_config antes del Include, mismo 50-cloud-init.conf |
no |
00-hardening.conf con no y 50-cloud-init.conf con yes |
no |
Por qué
sshd usa el primer valor que lee para cada opción. En las instalaciones de Ubuntu la línea Include /etc/ssh/sshd_config.d/*.conf está al principio de sshd_config, así que los ficheros de ese directorio se leen antes que el resto, en orden alfabético. Un yes en 50-cloud-init.conf gana al no que añadiste más abajo.
Qué hacer
- Comprueba siempre la configuración efectiva, no el fichero que editaste:
sudo sshd -T | grep -i passwordauthentication. - Pon tus ajustes en un fichero con nombre que se lea antes (por ejemplo
00-hardening.conf) o revisa y cambia el fichero que los pisa. - Antes de cerrar la sesión actual, abre otra y comprueba que entras con tu clave. Esta prueba no verificó el inicio de sesión real, solo la configuración efectiva.
Script completo
#!/bin/bash
# sshd: does PasswordAuthentication no in sshd_config survive a drop-in in sshd_config.d? Usage: test-sshd-dropin.sh WORKDIR. Only reads the effective config with sshd -T; no daemon is started.
W=$1; rm -rf "$W"; mkdir -p "$W/sshd_config.d"; ssh-keygen -q -t ed25519 -N "" -f "$W/hostkey"
printf 'Include %s/sshd_config.d/*.conf\nHostKey %s/hostkey\nPasswordAuthentication no\n' "$W" "$W" > "$W/sshd_config"
show() { echo "== $1"; /usr/sbin/sshd -T -f "$W/sshd_config" -C user=test,host=x,addr=127.0.0.1 2>&1 | grep -i '^passwordauthentication'; }
show "sshd_config dice no, sin drop-in"
echo "PasswordAuthentication yes" > "$W/sshd_config.d/50-cloud-init.conf"
show "con 50-cloud-init.conf = yes (Include al principio)"
printf 'HostKey %s/hostkey\nPasswordAuthentication no\nInclude %s/sshd_config.d/*.conf\n' "$W" "$W" > "$W/sshd_config"
show "Include al final: el 'no' del fichero principal gana"
echo "PasswordAuthentication no" > "$W/sshd_config.d/00-hardening.conf"
printf 'Include %s/sshd_config.d/*.conf\nHostKey %s/hostkey\n' "$W" "$W" > "$W/sshd_config"
show "00-hardening.conf = no, antes que 50-cloud-init.conf = yes"