Cómo generar y asegurar claves SSH para acceso remoto

Domina el acceso remoto seguro aprendiendo a generar pares de claves SSH robustos usando `ssh-keygen`. Esta guía cubre las mejores prácticas para seleccionar tipos de claves (Ed25519), asegurar tu clave privada con una frase de contraseña, desplegar eficientemente la clave pública usando `ssh-copy-id` y utilizar `ssh-agent` para una autenticación sin interrupciones. Asegura que tu infraestructura esté protegida contra ataques de fuerza bruta implementando control de acceso basado en claves.

Cómo generar y proteger claves SSH para acceso remoto

Secure Shell (SSH) es la forma estándar de conectarse a servidores remotos. Si todavía usas contraseñas para el acceso diario, las claves SSH te proporcionan una autenticación más fuerte y eliminan el riesgo de adivinación de contraseñas contra esa cuenta.

Esta guía te muestra cómo generar claves SSH, proteger la clave privada con una frase de contraseña, instalar la clave pública en un servidor y usar ssh-agent para no tener que escribir la frase de contraseña en cada conexión.

Comprendiendo los pares de claves SSH

Un par de claves SSH consta de dos componentes distintos:

  1. La clave privada: Esta clave nunca debe compartirse. Permanece de forma segura en tu máquina local y se utiliza para demostrar tu identidad al servidor remoto.
  2. La clave pública: Esta clave se comparte libremente y se carga en el archivo ~/.ssh/authorized_keys en el(los) servidor(es) remoto(s) al que deseas acceder. El servidor utiliza esta clave para verificar la firma generada por tu clave privada.

Eligiendo el algoritmo correcto

Al generar claves, elige un algoritmo moderno. Ed25519 es un buen valor predeterminado para clientes OpenSSH actuales porque es rápido, compacto y ampliamente compatible. RSA todavía funciona y es útil cuando debes conectarte a sistemas antiguos que no admiten Ed25519.

Paso 1: Generando el par de claves SSH

La utilidad ssh-keygen es la herramienta estándar para crear pares de claves SSH en Linux, macOS y Windows (a través de Git Bash o WSL).

Generando una clave Ed25519 (Recomendado)

Para crear una clave Ed25519 moderna, usa el siguiente comando. Especificamos el tipo de clave (-t ed25519) y proporcionamos un comentario (-C) para ayudar a identificar el propósito o propietario de la clave:

ssh-keygen -t ed25519 -C "[email protected]_o_nombre_del_host"

Cuando se te solicite:

  1. Ingresa el archivo en el que guardar la clave: Presiona Enter para aceptar la ubicación predeterminada (/home/usuario/.ssh/id_ed25519).
  2. Ingresa frase de contraseña (recomendado): Establece una frase de contraseña fuerte para claves utilizadas fuera de sistemas de laboratorio desechables. Esto cifra tu clave privada, por lo que un archivo de clave robado no es inmediatamente utilizable.

Generando una clave RSA (Alternativa)

Si se requiere compatibilidad con sistemas muy antiguos, puedes generar una clave RSA, asegurándote de especificar una longitud de clave suficiente (al menos 4096 bits):

ssh-keygen -t rsa -b 4096 -C "comentario_tu_clave_rsa"

Archivos de salida de la clave

Después de la generación, se crean dos archivos en tu directorio ~/.ssh/ (asumiendo valores predeterminados):

  • id_ed25519 (o id_rsa): Tu clave privada
  • id_ed25519.pub (o id_rsa.pub): Tu clave pública

Mejor práctica de seguridad: Nunca compartas el archivo sin la extensión .pub. Establece permisos restrictivos en tu clave privada con chmod 600 ~/.ssh/id_ed25519.

Paso 2: Copiando la clave pública al servidor

El servidor remoto debe tener tu clave pública en su archivo ~/.ssh/authorized_keys para otorgar acceso.

Usando ssh-copy-id (El método más fácil)

La utilidad ssh-copy-id automatiza el proceso, manejando la creación de directorios y la configuración de permisos en el servidor remoto. Necesitarás autenticarte con una contraseña por última vez para esta configuración inicial.

ssh-copy-id usuario@ip_del_host_remoto

Si tiene éxito, el comando te informará que las claves han sido agregadas. Ahora puedes intentar iniciar sesión.

Copia manual (Si ssh-copy-id no está disponible)

Si no puedes usar ssh-copy-id, puedes agregar manualmente el contenido de la clave pública. Primero, muestra la clave pública:

cat ~/.ssh/id_ed25519.pub

Luego, inicia sesión en el servidor remoto usando tu contraseña y agrega la salida al archivo authorized_keys:

# En el servidor remoto
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# Reemplaza <PEGA_TU_CLAVE_PÚBLICA_AQUÍ> con el contenido real de la clave
echo "<PEGA_TU_CLAVE_PÚBLICA_AQUÍ>" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Paso 3: Asegurando el acceso con ssh-agent

Escribir tu frase de contraseña cada vez que te conectas a un servidor se vuelve tedioso. El ssh-agent es un programa en segundo plano que mantiene de forma segura tus claves privadas descifradas en la memoria, permitiéndote usarlas sin ingresar repetidamente la frase de contraseña.

Iniciando y usando ssh-agent

  1. Asegúrate de que el agente esté en ejecución: En la mayoría de los sistemas Linux/macOS modernos, el agente se inicia automáticamente cuando inicias sesión. Puedes verificar su estado buscando las variables de entorno:

    echo $SSH_AUTH_SOCK
    
  2. Agrega tu clave al agente: Usa el comando ssh-add para cargar tu clave privada. Se te solicitará la frase de contraseña solo una vez.

    ssh-add ~/.ssh/id_ed25519
    # Ingresa frase de contraseña para /home/usuario/.ssh/id_ed25519: **********
    # Identidad agregada: /home/usuario/.ssh/id_ed25519 (comentario)
    
  3. Verifica las claves cargadas:

    ssh-add -l
    

Ahora, cuando ejecutes ssh usuario@ip_del_host_remoto, la conexión se autenticará usando la clave mantenida por el agente sin solicitar la frase de contraseña nuevamente (hasta que finalice la sesión del agente).

Notas importantes sobre ssh-agent

  • Dependiente de la sesión: Las claves cargadas en el agente generalmente solo están disponibles para la sesión de terminal actual o la sesión de inicio de sesión del escritorio. Necesitarás volver a ejecutar ssh-add después de cerrar sesión y volver a iniciarla.
  • Vida útil de la clave: Puedes establecer una vida útil máxima para las claves mantenidas en el agente usando la bandera -t (por ejemplo, ssh-add -t 1h ~/.ssh/id_ed25519 mantiene la clave cargada durante una hora).

Seguridad avanzada: Deshabilitando la autenticación por contraseña

Una vez que hayas confirmado que la autenticación basada en claves funciona perfectamente en todos los servidores requeridos, la medida de seguridad más fuerte es deshabilitar por completo los inicios de sesión basados en contraseñas. Esto evita ataques de fuerza bruta contra contraseñas.

  1. Conéctate a tu servidor a través de SSH usando tu clave.

  2. Edita el archivo de configuración del demonio SSH, generalmente ubicado en /etc/ssh/sshd_config:

    sudo nano /etc/ssh/sshd_config
    
  3. Encuentra y establece las siguientes directivas:

    # Asegúrate de que esto esté configurado en yes (generalmente predeterminado)
    PubkeyAuthentication yes
    
    # Deshabilitar inicios de sesión con contraseña
    PasswordAuthentication no
    
  4. Verifica la configuración antes de reiniciar:

    sudo sshd -t
    
  5. Reinicia el servicio SSH para aplicar los cambios. El nombre del servicio es comúnmente sshd en sistemas de la familia RHEL y ssh en Debian/Ubuntu:

    sudo systemctl restart sshd
    # o
    sudo systemctl restart ssh
    

Advertencia: Antes de deshabilitar la autenticación por contraseña, mantén una sesión SSH de trabajo abierta y confirma que un segundo inicio de sesión funcione con la nueva clave. Si el reinicio falla o la clave es incorrecta, necesitarás acceso a la consola o fuera de banda.

Próximos pasos

Después de que tu primer inicio de sesión basado en claves funcione, trata las claves SSH como credenciales de producción:

  • Genera un par de claves único para cada sistema o servicio importante al que accedas.
  • Audita regularmente el archivo authorized_keys en servidores críticos.
  • Elimina claves antiguas cuando las personas cambien de roles o las máquinas se retiren.
  • Usa ssh-add -t para sesiones de agente de corta duración en estaciones de trabajo compartidas.