Por qué pasar a claves

Con el acceso por contraseña activado, cualquiera que llegue al puerto SSH del servidor puede seguir probando contraseñas. OpenSSH viene así por defecto: el manual indica que el valor por defecto de PasswordAuthentication es yes. Las claves son mucho más difíciles de adivinar, y desactivar la contraseña también bloquea fallos en la propia comprobación de la contraseña. El fallo de OpenSSH en Alpine Linux de esta semana es un ejemplo: el aviso de Alpine dice que los servidores con el acceso por contraseña desactivado no están afectados.

Necesitas un usuario en el servidor al que ya puedas acceder, con permiso para usar sudo o doas.

1. Crea una clave en tu ordenador

Ejecuta esto en tu propio ordenador, no en el servidor:

ssh-keygen -t ed25519

Pulsa Intro para aceptar la ubicación habitual y escribe una frase de contraseñauna contraseña que protege el propio archivo de la clave, para que una copia robada del archivo no baste para entrar. Obtendrás dos archivos en la carpeta .ssh de tu directorio personal: id_ed25519, la clave privada, que nunca sale de tu ordenador, y id_ed25519.pub, la clave pública, que va al servidor.

2. Copia la clave pública al servidor

En Linux y macOS:

ssh-copy-id usuario@servidor

Te pide la contraseña una última vez y añade la clave a ~/.ssh/authorized_keys en el servidor. Si no tienes ssh-copy-id, por ejemplo en Windows, abre id_ed25519.pub, copia su única línea y pégala en ~/.ssh/authorized_keys en el servidor. La carpeta .ssh solo debe poder leerla tu usuario (chmod 700 ~/.ssh y chmod 600 ~/.ssh/authorized_keys).

3. Prueba la clave antes de cambiar nada

Deja abierta la sesión actual. En una ventana nueva del terminal, ejecuta ssh usuario@servidor. Si te pide la frase de contraseña de la clave, o entra directamente, la clave funciona. Si te pide la contraseña de la cuenta, para y arregla la clave primero, o te quedarás fuera en el siguiente paso.

4. Desactiva el acceso con contraseña

En el servidor, añade estas dos líneas a la configuración del servidor SSH, en /etc/ssh/sshd_config o en un archivo nuevo dentro de /etc/ssh/sshd_config.d/ si tu sistema usa esa carpeta:

PasswordAuthentication no

KbdInteractiveAuthentication no

La segunda línea cierra el otro método parecido a la contraseña, el keyboard-interactiveun método de acceso en el que el servidor hace preguntas, normalmente la contraseña, mediante un aviso; el nombre antiguo de la opción es ChallengeResponseAuthentication. Para la cuenta root, el valor por defecto de OpenSSH, PermitRootLogin prohibit-password, ya bloquea el acceso con contraseña.

Hay una trampa. El manual dice que, para cada opción, "se usará el primer valor obtenido". Algunos sistemas, entre ellos algunas imágenes de nube, traen su propio archivo en sshd_config.d con PasswordAuthentication yes, y si ese archivo se lee antes, tu línea no tiene efecto. El paso 6 explica cómo detectarlo.

5. Revisa el archivo y reinicia el servicio

Ejecuta sudo sshd -t. Comprueba la configuración y no muestra nada si es válida. Después reinicia el servicio SSH:

  • Debian y Ubuntu: sudo systemctl restart ssh
  • Fedora, Red Hat y similares: sudo systemctl restart sshd
  • Alpine: rc-service sshd restart

Mantén la sesión antigua abierta hasta terminar el siguiente paso.

6. Comprueba que ha funcionado

En el servidor, ejecuta:

sudo sshd -T | grep -i -E 'passwordauthentication|kbdinteractiveauthentication'

sshd -T muestra la configuración que sshd va a usar de verdad. Las dos líneas deben terminar en no. Si alguna dice yes, busca en /etc/ssh/sshd_config.d/ un archivo que la defina antes.

Desde tu ordenador, intenta forzar un acceso con contraseña:

ssh -o PubkeyAuthentication=no usuario@servidor

El servidor debe rechazarlo con "Permission denied (publickey)". Tu ssh usuario@servidor normal debe seguir funcionando con la clave.

Si algo sale mal

Si pierdes el acceso, usa la consola que ofrece tu proveedor de alojamiento o el programa de la máquina virtual, deshaz el cambio y reinicia el servicio SSH. Por eso la sesión antigua se queda abierta hasta el final. Guarda una copia de tu clave privada en un lugar seguro: si pierdes la única copia, necesitarás esa consola para añadir una clave pública nueva.

Fuentes

Fuentes primarias que consultamos para este artículo: