Ir al contenido

Autenticación SSH por clave pública: desactivar contraseñas en Ubuntu Server

·3 mins
Rogelio Guerra Riverón
Autor
Rogelio Guerra Riverón
Construyendo mi propia infraestructura web desde cero. Aquí documento cada paso: servidores, redes, contenedores y lo que vaya surgiendo.

Por qué cambiar a autenticación por clave
#

Después de meses manteniendo un servidor doméstico con acceso SSH abierto, me cansé de los intentos de fuerza bruta contra la contraseña. Cambiar a autenticación por clave pública fue la mejor decisión de seguridad que tomé. Las claves son matemáticamente imposibles de craquear por fuerza bruta, mientras que las contraseñas siempre son un objetivo.

Generación de la clave SSH
#

Lo primero es generar un par de claves en tu máquina local (no en el servidor):

ssh-keygen -t ed25519 -C "tu_email@ejemplo.com"

Te pedirá dónde guardar la clave. Presiona Enter para usar la ubicación por defecto (~/.ssh/id_ed25519). Luego te pedirá una frase de paso (passphrase). Yo uso una contraseña fuerte aquí, porque protege tu clave privada localmente.

Después de esto tendrás dos archivos:

  • ~/.ssh/id_ed25519 - Tu clave privada (nunca la compartas)
  • ~/.ssh/id_ed25519.pub - Tu clave pública (esto sí va al servidor)

Copiar la clave al servidor
#

El método más seguro es usar ssh-copy-id. Desde tu máquina local:

ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@servidor

Esto añadirá tu clave pública al archivo ~/.ssh/authorized_keys en el servidor. Aún necesitarás tu contraseña para este paso.

Si ssh-copy-id no funciona, puedes hacerlo manualmente:

cat ~/.ssh/id_ed25519.pub | ssh usuario@servidor "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Verificar que funciona
#

Antes de desactivar las contraseñas, prueba que el acceso por clave funciona:

ssh usuario@servidor

Si todo está bien, deberías entrar sin que te pida contraseña (o solo la passphrase de tu clave local, si la configuraste).

Configuración del servidor SSH
#

Ahora editamos /etc/ssh/sshd_config en el servidor:

sudo nano /etc/ssh/sshd_config

Busca estas líneas y ajústalas (quita el # si está comentado):

PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
PermitRootLogin no

Estas son las líneas críticas:

  • PubkeyAuthentication: Activa la autenticación por clave (debe estar en yes)
  • PasswordAuthentication: La cambias a no para desactivar contraseñas
  • PermitEmptyPasswords: Asegura que no haya acceso sin contraseña vacía
  • PermitRootLogin: Es una buena práctica poner esto en no

Aplicar los cambios
#

Antes de reiniciar el servicio SSH, verifica que la configuración es válida:

sudo sshd -t

Si no devuelve errores, reinicia el servicio:

sudo systemctl restart ssh

Prueba final
#

Aquí viene el momento de la verdad. Abre una nueva sesión SSH sin cerrar la actual:

ssh usuario@servidor

Si entras sin problemas, todo funciona. Si no, mantén la sesión anterior abierta para revertir cambios.

Backup y checklist
#

Antes de hacer esto, guardo un backup de sshd_config:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup

Mi checklist antes de desactivar contraseñas:

  • Clave SSH generada localmente
  • Clave pública copiada al servidor
  • Acceso por clave probado correctamente
  • sshd -t sin errores
  • Backup de sshd_config hecho
  • Sesión de prueba abierta antes de reiniciar

Resultado
#

Desde que implementé esto, los logs del servidor son tranquilos. Cero intentos de fuerza bruta exitosos. Las claves SSH son una de esas mejoras de seguridad que parece complicada al principio pero vale completamente la pena.