Guía paso a paso para la autenticación segura mediante clave SSH
Configura la autenticación segura mediante clave SSH con claves ED25519, authorized_keys, ssh-agent y ajustes más seguros de sshd.
Guía paso a paso para la autenticación segura mediante clave SSH
La autenticación mediante clave SSH protege tu servidor de muchos ataques basados en contraseñas, pero solo si generas la clave cuidadosamente, instalas la clave pública correctamente y pruebas el acceso antes de cambiar la configuración del servidor.
Esta guía te explica la generación de claves ED25519, la instalación de la clave pública, las pruebas de inicio de sesión y la configuración más segura del demonio SSH.
Comprendiendo la autenticación mediante clave SSH
La autenticación mediante clave SSH se basa en un par de claves criptográficamente vinculadas: una clave privada y una clave pública.
- Clave privada: Esta clave debe permanecer secreta y protegida en tu máquina local. Es como una contraseña muy compleja que solo tú posees.
- Clave pública: Esta clave se puede compartir libremente y se coloca en el servidor remoto al que deseas acceder. El servidor la utiliza para verificar tu identidad.
Cuando intentas conectarte, el servidor usa tu clave pública para desafiar a tu máquina local. Tu máquina local usa su clave privada para responder a este desafío, demostrando tu identidad sin enviar nunca la clave privada a través de la red. Este método no solo es más seguro, sino también más conveniente, ya que elimina la necesidad de escribir una contraseña para cada conexión una vez configurado correctamente.
Paso 1: Generar tu par de claves SSH
La utilidad ssh-keygen se utiliza para crear nuevos pares de claves SSH. Se recomienda usar algoritmos modernos y robustos como ED25519.
Elegir un tipo de clave y fortaleza
Aunque las claves RSA todavía se usan ampliamente, ED25519 ofrece una excelente seguridad con longitudes de clave más cortas y operaciones más rápidas. Para nuevas configuraciones, generalmente se prefiere ED25519.
Generar el par de claves
En tu máquina local (cliente), abre tu terminal y ejecuta el siguiente comando:
ssh-keygen -t ed25519 -C "[email protected]"
-t ed25519: Especifica el tipo de clave como ED25519.-C "[email protected]": Añade un comentario a la clave pública, a menudo usado para identificación. Reemplázalo con tu correo real o una etiqueta descriptiva.
El comando te pedirá una ubicación para guardar la clave y una frase de contraseña opcional.
Generando par de claves pública/privada ed25519.
Introduce el archivo en el que guardar la clave (/home/tuusuario/.ssh/id_ed25519):
Introduce frase de contraseña (vacía para sin frase de contraseña):
Introduce la misma frase de contraseña de nuevo:
Tu identificación se ha guardado en /home/tuusuario/.ssh/id_ed25519
Tu clave pública se ha guardado en /home/tuusuario/.ssh/id_ed25519.pub
La huella digital de la clave es: SHA256:...
La imagen aleatoria de la clave es: ...
Establecer una frase de contraseña fuerte (muy recomendado)
Cuando se te solicite, siempre establece una frase de contraseña fuerte para tu clave privada. Esta frase de contraseña cifra tu clave privada en tu máquina local, proporcionando una capa adicional de seguridad. Si tu clave privada alguna vez cae en manos equivocadas, será inútil sin la frase de contraseña. Puedes usar ssh-agent para evitar escribir la frase de contraseña repetidamente (ver Paso 4).
Ubicaciones de los archivos de clave
Por defecto, ssh-keygen guarda tu clave privada en ~/.ssh/id_ed25519 y tu clave pública en ~/.ssh/id_ed25519.pub.
Permisos para tu clave privada
Es crucial que tu archivo de clave privada tenga permisos muy estrictos. Solo el propietario debe poder leerlo. ssh-keygen normalmente establece esto correctamente, pero es bueno verificarlo:
chmod 600 ~/.ssh/id_ed25519
Paso 2: Distribuir tu clave pública al servidor
Una vez que hayas generado tu par de claves, tu clave pública debe copiarse al servidor remoto al que deseas acceder. Debe colocarse en un archivo llamado authorized_keys dentro del directorio ~/.ssh/ de tu usuario en el servidor remoto.
Método 1: Usando ssh-copy-id (recomendado)
ssh-copy-id es el método más simple y seguro. Inicia sesión en el servidor remoto (usando tu contraseña), crea el directorio ~/.ssh si no existe, establece los permisos correctos y añade tu clave pública a ~/.ssh/authorized_keys.
ssh-copy-id usuario@ip_de_tu_servidor
Reemplaza usuario con tu nombre de usuario en el servidor remoto e ip_de_tu_servidor con la dirección IP o nombre de host del servidor. Se te pedirá tu contraseña en el servidor remoto.
Método 2: Copia manual
Si ssh-copy-id no está disponible, puedes copiar la clave pública manualmente.
Copia el contenido de la clave pública desde tu máquina local:
cat ~/.ssh/id_ed25519.pubCopia toda la salida a tu portapapeles (comienza con
ssh-ed25519 ...).Inicia sesión en el servidor remoto usando tu contraseña:
ssh usuario@ip_de_tu_servidorCrea el directorio
~/.sshsi no existe y establece permisos:mkdir -p ~/.ssh chmod 700 ~/.sshAñade tu clave pública a
authorized_keys:echo "PEGA_TU_CLAVE_PÚBLICA_AQUÍ" >> ~/.ssh/authorized_keysAsegúrate de reemplazar
PEGA_TU_CLAVE_PÚBLICA_AQUÍcon el contenido real que copiaste. Usar>>(añadir) es importante para evitar sobrescribir claves existentes si las hay.Establece los permisos correctos para
authorized_keys:chmod 600 ~/.ssh/authorized_keys- Advertencia: Los permisos incorrectos en
~/.ssho~/.ssh/authorized_keysimpedirán que funcione la autenticación mediante clave.
- Advertencia: Los permisos incorrectos en
Paso 3: Probar tu autenticación mediante clave SSH
Antes de proceder a deshabilitar la autenticación por contraseña, es absolutamente crítico verificar que la autenticación mediante clave funciona correctamente. Cierra la sesión del servidor remoto si todavía estás conectado desde los pasos de copia manual.
Desde tu máquina local, intenta conectarte al servidor sin especificar una contraseña:
ssh usuario@ip_de_tu_servidor
- Si estableciste una frase de contraseña para tu clave privada, se te pedirá que la introduzcas.
- Si la conexión es exitosa sin un mensaje de contraseña (después de la frase de contraseña, si corresponde), tu autenticación mediante clave está funcionando. Deberías ver el prompt del servidor remoto.
NO continúes al Paso 4 si no puedes iniciar sesión usando tu clave SSH. Soluciona cualquier problema antes de deshabilitar la autenticación por contraseña, o corres el riesgo de quedarte fuera del servidor.
Paso 4: Mejorar la seguridad - Deshabilitar la autenticación por contraseña
Una vez que hayas confirmado que la autenticación mediante clave SSH funciona, puedes deshabilitar los inicios de sesión basados en contraseña en tu servidor para mejorar significativamente la seguridad. Esto evita los ataques de fuerza bruta contra tu contraseña y asegura que solo aquellos con claves SSH válidas puedan acceder al servidor.
Inicia sesión en tu servidor remoto usando tu clave SSH.
ssh usuario@ip_de_tu_servidorEdita el archivo de configuración del demonio SSH. Este archivo normalmente se encuentra en
/etc/ssh/sshd_config.sudo nano /etc/ssh/sshd_config(Puedes usar
vio tu editor de texto preferido en lugar denano.)Localiza y modifica las siguientes directivas:
Busca
PasswordAuthenticationy cambia su valor ano.#PasswordAuthentication yes PasswordAuthentication no(Descomenta la línea si está comentada con
#)Busca
KbdInteractiveAuthenticationy cambia su valor ano. En versiones antiguas de OpenSSH, la directiva equivalente puede serChallengeResponseAuthentication.KbdInteractiveAuthentication no(Opcional pero recomendado) Considera deshabilitar el inicio de sesión de root directamente a través de SSH si planeas usar
sudodespués de iniciar sesión como usuario normal.PermitRootLogin no(Opcional) Considera cambiar el puerto SSH predeterminado de
22a un puerto alto no estándar (por ejemplo,2222). Esto no añade seguridad contra ataques dirigidos, pero puede reducir el ruido de los escáneres de puertos automatizados.#Port 22 Port 2222Si cambias el puerto, recuerda especificarlo con la bandera
-pal conectarte (por ejemplo,ssh -p 2222 usuario@ip_de_tu_servidor).
Guarda los cambios y sal del editor de texto.
Reinicia el servicio SSH para aplicar la nueva configuración. El comando varía ligeramente según tu sistema operativo (por ejemplo, Ubuntu/Debian vs. CentOS/RHEL).
Sistemas basados en Systemd (la mayoría de las distribuciones Linux modernas):
sudo sshd -t sudo systemctl restart sshdSistemas antiguos basados en SysVinit:
sudo service ssh restart
Fundamentalmente, abre una ventana de terminal nueva (no cierres tu sesión SSH activa actual) e intenta iniciar sesión usando tu clave. Esto prueba la nueva configuración sin quedarte fuera si algo salió mal.
ssh usuario@ip_de_tu_servidorSi cambiaste el puerto:
ssh -p 2222 usuario@ip_de_tu_servidorSi la conexión es exitosa, ahora puedes cerrar de forma segura tu sesión SSH original.
Si el nuevo inicio de sesión falla, revierte inmediatamente los cambios en
sshd_configen tu sesión SSH original, aún activa, y reinicia el servicio SSH nuevamente, luego reevalúa.
Mejores prácticas y consejos
- Usa siempre una frase de contraseña fuerte para tu clave privada. Esta es tu última línea de defensa si tu clave privada se ve comprometida.
- Protege tu clave privada. Nunca la compartas y asegúrate de que esté almacenada de forma segura con permisos de archivo estrictos (
chmod 600 ~/.ssh/id_ed25519). Considera módulos de seguridad de hardware (HSM) o YubiKeys para una protección máxima. - Usa
ssh-agentpor conveniencia.ssh-agentte permite cargar tu(s) clave(s) privada(s) en la memoria y solo escribir tu frase de contraseña una vez por sesión, incluso a través de múltiples conexiones SSH. Añade tu clave al agente conssh-add ~/.ssh/id_ed25519. - Rota tus claves SSH regularmente. Genera periódicamente nuevos pares de claves y elimina las claves públicas antiguas de tus servidores, especialmente si un miembro del equipo se va o se sospecha que la seguridad de una clave está comprometida.
- Limita
PermitRootLoginanooprohibit-password. Generalmente es mejor iniciar sesión como usuario normal y usarsudopara tareas administrativas. - Configura un cortafuegos. Asegúrate de que solo los puertos necesarios (como tu puerto SSH) estén abiertos a Internet. Herramientas como
ufwofirewalldpueden ayudar.
Conclusión final
Tu clave privada es ahora tu principal credencial de inicio de sesión, así que protégela con una frase de contraseña y permisos de archivo estrictos. Mantén una sesión SSH probada abierta mientras cambias sshd_config, valida la configuración con sshd -t, y solo cierra la sesión antigua después de que funcione un nuevo inicio de sesión basado en clave.