Guía para principiantes sobre claves SSH: Genere, use y administre de forma segura

Genera claves SSH, copia claves públicas a servidores, usa ssh-agent y gestiona la configuración SSH específica de cada host de forma segura.

Guía para principiantes sobre claves SSH: generar, usar y gestionar de forma segura

Las claves SSH te permiten iniciar sesión en servidores sin enviar una contraseña reutilizable a través de la red. Si gestionas servidores Linux, instancias en la nube o repositorios remotos de Git, una clave SSH correctamente protegida suele ser más segura y fácil que el inicio de sesión basado en contraseña.

Esta guía para principiantes te muestra cómo generar un par de claves SSH, copiar la clave pública a un servidor, conectarte con la clave privada correcta y mantener tus claves manejables a medida que crece tu lista de servidores.

Comprendiendo los pares de claves SSH

La autenticación mediante clave SSH se basa en un par de claves criptográficas: una clave privada y una clave pública. Estas claves están matemáticamente vinculadas, pero es computacionalmente inviable derivar la clave privada a partir de la clave pública.

  • Clave privada: Esta clave debe mantenerse en secreto y nunca debe compartirse. Reside en tu máquina local y actúa como tu identidad. Cuando inicias una conexión SSH, tu cliente usa tu clave privada para demostrar tu identidad.
  • Clave pública: Esta clave se puede compartir libremente. Colocarás tu clave pública en los servidores remotos a los que deseas acceder. Cuando intentas conectarte, el servidor usa tu clave pública para verificar que posees la clave privada correspondiente.

Cuando intentas conectarte a un servidor, ocurre el siguiente proceso:

  1. Tu cliente SSH presenta tu clave pública al servidor.
  2. El servidor verifica si esta clave pública está autorizada (es decir, presente en su archivo authorized_keys).
  3. Si está autorizada, el servidor envía un desafío a tu cliente.
  4. Tu cliente firma el desafío con tu clave privada y envía la firma de vuelta al servidor.
  5. El servidor verifica la firma con tu clave pública. Si la firma es válida, la autenticación se concede sin contraseña.

Generando pares de claves SSH

La herramienta más común para generar pares de claves SSH es ssh-keygen. Este comando está disponible en la mayoría de los sistemas Linux, macOS y Windows (a través de WSL o Git Bash).

Usando ssh-keygen

Para generar un nuevo par de claves SSH, abre tu terminal o símbolo del sistema y ejecuta el siguiente comando:

ssh-keygen -t ed25519

Desglosemos este comando:

  • ssh-keygen: El comando para generar claves SSH.
  • -t ed25519: Especifica el tipo de clave a crear. ed25519 es un algoritmo de criptografía de curva elíptica moderno, altamente seguro y rápido. Otras opciones comunes incluyen rsa (por ejemplo, ssh-keygen -t rsa -b 4096 para una clave RSA de 4096 bits).

Al ejecutar el comando, se te pedirá que respondas algunas preguntas:

  1. Introduce el archivo en el que guardar la clave (por ejemplo, /home/tu_usuario/.ssh/id_ed25519): Presiona Enter para aceptar la ubicación predeterminada. Esto creará dos archivos en tu directorio .ssh: id_ed25519 (tu clave privada) e id_ed25519.pub (tu clave pública).
  2. Introduce una frase de contraseña (vacía para ninguna frase de contraseña): Este es un paso de seguridad crucial. Introducir una frase de contraseña cifra tu clave privada en el disco. Si el archivo de tu clave privada se ve comprometido, el atacante aún necesitaría la frase de contraseña para usarla. Se recomienda encarecidamente usar una frase de contraseña sólida.
  3. Introduce la misma frase de contraseña nuevamente: Confirma tu frase de contraseña.

Comprendiendo los archivos de salida

Después de la generación, se crearán dos archivos en tu directorio ~/.ssh/ (o la ruta que especificaste):

  • id_ed25519 (o id_rsa): Tu clave privada. NUNCA COMPARTAS ESTE ARCHIVO. Restringe sus permisos a solo lectura para tu usuario.
  • id_ed25519.pub (o id_rsa.pub): Tu clave pública. Esta es la clave que distribuirás a los servidores.

Asegurando tu clave privada

Es esencial asegurarse de que tu clave privada tenga los permisos de archivo correctos. En Linux/macOS, ejecuta:

chmod 600 ~/.ssh/id_ed25519

Este comando restringe los permisos de lectura y escritura solo al propietario del archivo, evitando que otros usuarios del sistema accedan a tu clave privada.

Desplegando tu clave pública en un servidor

Una vez que hayas generado tu par de claves SSH, debes colocar tu clave pública en el(los) servidor(es) remoto(s) al que deseas acceder.

Usando ssh-copy-id (Recomendado)

ssh-copy-id es un script de utilidad que simplifica el proceso de copiar tu clave pública a un servidor remoto. Automáticamente agrega tu clave pública al archivo ~/.ssh/authorized_keys en el servidor y establece los permisos correctos.

Para usar ssh-copy-id, ejecuta el siguiente comando desde tu máquina local:

ssh-copy-id usuario@host_remoto

Reemplaza usuario con tu nombre de usuario en el servidor remoto y host_remoto con la dirección IP o el nombre de host del servidor. Se te pedirá la contraseña del usuario en el host_remoto por última vez para autorizar la transferencia de clave.

Si estás usando un puerto SSH no estándar (por ejemplo, 2222), puedes especificarlo con la opción -p:

ssh-copy-id -p 2222 usuario@host_remoto

Despliegue manual (si ssh-copy-id no está disponible)

Si ssh-copy-id no está disponible, puedes copiar manualmente tu clave pública. Primero, muestra el contenido de tu clave pública en tu máquina local:

cat ~/.ssh/id_ed25519.pub

Copia toda la salida. Luego, conéctate por SSH a tu servidor remoto usando tu contraseña:

ssh usuario@host_remoto

Una vez conectado, crea el directorio .ssh si no existe, y luego crea o agrega al archivo authorized_keys:

mkdir -p ~/.ssh
chmod 700 ~/.ssh

Ahora, pega el contenido de tu clave pública en el archivo authorized_keys. Puedes hacerlo usando un editor de texto como nano o vim:

nano ~/.ssh/authorized_keys

Pega la clave pública copiada en una nueva línea. Guarda y sal del editor.

Finalmente, asegúrate de que el archivo authorized_keys tenga los permisos correctos:

chmod 600 ~/.ssh/authorized_keys

Después de completar estos pasos, deberías poder conectarte por SSH al servidor sin contraseña.

Conectándose con claves SSH

Una vez que tu clave pública está en el servidor, puedes conectarte usando tu clave privada. El cliente SSH intentará automáticamente usar las claves encontradas en ~/.ssh/.

ssh usuario@host_remoto

Si usaste una frase de contraseña durante la generación de la clave, se te pedirá que la introduzcas ahora. Si no usaste una frase de contraseña, iniciarás sesión directamente.

Especificando una clave diferente

Si tienes múltiples pares de claves SSH o tu clave no está en la ubicación predeterminada, puedes especificar qué clave privada usar con la opción -i:

ssh -i /ruta/a/tu/clave_privada usuario@host_remoto

Gestionando claves SSH

A medida que accedes a más servidores, acumularás más claves SSH. Una gestión eficaz es clave para mantener la seguridad y la comodidad.

Agente SSH

El agente SSH es un programa en segundo plano que mantiene tus claves privadas en memoria, descifradas con tu frase de contraseña. Esto te permite usar tus claves para múltiples conexiones SSH sin tener que volver a introducir tu frase de contraseña cada vez.

  • Iniciando el agente SSH: El agente a menudo se inicia automáticamente cuando inicias sesión en tu entorno de escritorio. Si no es así, puedes iniciarlo manualmente:
    eval "$(ssh-agent -s)"
    
  • Agregando claves al agente: Una vez que el agente está en ejecución, agrega tu(s) clave(s) privada(s):
    ssh-add ~/.ssh/id_ed25519
    
    Se te pedirá tu frase de contraseña. Después de esto, el agente gestionará la clave, y las conexiones SSH posteriores la usarán automáticamente.

Archivo de configuración SSH (~/.ssh/config)

El archivo de configuración del cliente SSH (~/.ssh/config) te permite definir alias para hosts y especificar parámetros de conexión, incluida qué clave usar para un host específico. Esto es increíblemente útil para gestionar múltiples servidores.

Crea o edita el archivo ~/.ssh/config en tu máquina local y agrega entradas como esta:

# Configuración predeterminada
Host *
  ServerAliveInterval 60

# Servidor 1: Servidor web
Host webserver
  HostName 192.168.1.100
  User webadmin
  Port 2222
  IdentityFile ~/.ssh/webserver_key

# Servidor 2: Servidor de base de datos
Host dbserver
  HostName db.example.com
  User dbuser
  IdentityFile ~/.ssh/db_key

Con esta configuración, puedes conectarte al servidor web usando:

ssh webserver

Y al servidor de base de datos usando:

ssh dbserver

El cliente SSH usará automáticamente el nombre de usuario, puerto y archivo de clave privada correctos según lo definido en el archivo ~/.ssh/config. Evita habilitar ForwardAgent yes de forma global; el reenvío del agente es útil para algunos flujos de trabajo de host de salto, pero expone tu socket del agente al host remoto mientras la sesión está activa.

Rotación y revocación de claves

  • Rotación: Considera rotar regularmente tus claves SSH, especialmente para sistemas altamente sensibles. Esto implica generar nuevas claves y reemplazar las claves públicas antiguas en los servidores.
  • Revocación: Si una clave privada se ve comprometida o ya no necesitas acceso, debes eliminar la clave pública correspondiente de todos los archivos authorized_keys en los servidores donde se implementó. Esto es crítico para mantener la seguridad.

Mejores prácticas y consejos de seguridad

  • Usa frases de contraseña: Siempre protege tus claves privadas con frases de contraseña sólidas. Esta es tu principal defensa contra el uso no autorizado si el archivo de clave privada es robado.
  • Asegura los permisos de la clave privada: Asegúrate de que tu archivo de clave privada tenga permisos 600 (-rw-------).
  • Usa ssh-agent: Aprovecha el agente SSH para evitar escribir repetidamente tu frase de contraseña.
  • Deshabilita la autenticación por contraseña: Una vez que la autenticación mediante clave SSH funcione, considera deshabilitar la autenticación basada en contraseña en tus servidores para una capa adicional de seguridad.
  • Mantén las claves actualizadas: Usa algoritmos modernos y sólidos como Ed25519. Evita claves RSA más antiguas sin una longitud de bits suficiente (al menos 4096).
  • Ten cuidado con authorized_keys: Solo agrega claves públicas de fuentes confiables a tu archivo authorized_keys.
  • Auditorías regulares: Revisa periódicamente los archivos authorized_keys en tus servidores para asegurarte de que solo estén presentes las claves autorizadas.

Conclusión

Vale la pena configurar las claves SSH antes de que necesites acceso de emergencia a un servidor. Genera una clave moderna, protege la clave privada con una frase de contraseña, copia solo la clave pública a los servidores y elimina las claves obsoletas de authorized_keys cuando cambien los accesos.