Autenticación SSH por clave pública: desactivar contraseñas en Ubuntu Server
Etiquetas: ssh,seguridad,ubuntu,autenticaciónPor 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.
Equipamiento recomendado
- YubiKey 5 NFC — Llave de seguridad física para 2FA y acceso SSH seguro
- Raspberry Pi 3 B+ — Servidor ligero de bajo consumo para empezar tu homelab
Enlaces de afiliado. Sin coste extra para ti.