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.

  1. Copia el contenido de la clave pública desde tu máquina local:

    cat ~/.ssh/id_ed25519.pub
    

    Copia toda la salida a tu portapapeles (comienza con ssh-ed25519 ...).

  2. Inicia sesión en el servidor remoto usando tu contraseña:

    ssh usuario@ip_de_tu_servidor
    
  3. Crea el directorio ~/.ssh si no existe y establece permisos:

    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    
  4. Añade tu clave pública a authorized_keys:

    echo "PEGA_TU_CLAVE_PÚBLICA_AQUÍ" >> ~/.ssh/authorized_keys
    

    Asegú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.

  5. Establece los permisos correctos para authorized_keys:

    chmod 600 ~/.ssh/authorized_keys
    
    • Advertencia: Los permisos incorrectos en ~/.ssh o ~/.ssh/authorized_keys impedirán que funcione la autenticación mediante clave.

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.

  1. Inicia sesión en tu servidor remoto usando tu clave SSH.

    ssh usuario@ip_de_tu_servidor
    
  2. Edita 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 vi o tu editor de texto preferido en lugar de nano.)

  3. Localiza y modifica las siguientes directivas:

    • Busca PasswordAuthentication y cambia su valor a no.

      #PasswordAuthentication yes
      PasswordAuthentication no
      

      (Descomenta la línea si está comentada con #)

    • Busca KbdInteractiveAuthentication y cambia su valor a no. En versiones antiguas de OpenSSH, la directiva equivalente puede ser ChallengeResponseAuthentication.

      KbdInteractiveAuthentication no
      
    • (Opcional pero recomendado) Considera deshabilitar el inicio de sesión de root directamente a través de SSH si planeas usar sudo después de iniciar sesión como usuario normal.

      PermitRootLogin no
      
    • (Opcional) Considera cambiar el puerto SSH predeterminado de 22 a 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 2222
      

      Si cambias el puerto, recuerda especificarlo con la bandera -p al conectarte (por ejemplo, ssh -p 2222 usuario@ip_de_tu_servidor).

  4. Guarda los cambios y sal del editor de texto.

  5. 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 sshd
      
    • Sistemas antiguos basados en SysVinit:

      sudo service ssh restart
      
  6. 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_servidor
    

    Si cambiaste el puerto:

    ssh -p 2222 usuario@ip_de_tu_servidor
    

    Si 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_config en 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-agent por conveniencia. ssh-agent te 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 con ssh-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 PermitRootLogin a no o prohibit-password. Generalmente es mejor iniciar sesión como usuario normal y usar sudo para tareas administrativas.
  • Configura un cortafuegos. Asegúrate de que solo los puertos necesarios (como tu puerto SSH) estén abiertos a Internet. Herramientas como ufw o firewalld pueden 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.