Comprendiendo la Autenticación por Clave SSH: Claves Públicas vs. Privadas Explicadas
Descubre los secretos de la autenticación por clave SSH con esta guía completa. Aprende los roles fundamentales de las claves públicas y privadas, cómo trabajan juntas para asegurar tus conexiones remotas, y por qué este método supera ampliamente a los inicios de sesión basados en contraseñas. Este artículo proporciona instrucciones paso a paso para generar e implementar claves, junto con beneficios de seguridad esenciales y mejores prácticas. Mejora la seguridad de tu servidor y optimiza el acceso con claves SSH.
Comprendiendo la Autenticación por Clave SSH: Claves Públicas vs. Privadas Explicadas
La autenticación por clave SSH es la forma habitual en que muchos administradores, desarrolladores, sistemas de CI y herramientas de implementación inician sesión en servidores. Tu computadora portátil guarda una clave privada, el servidor almacena la clave pública correspondiente, y SSH demuestra que tienes la clave privada sin enviarla a través de la red.
Esa última parte es el punto clave. Una contraseña es un secreto que escribes en muchos lugares. Una clave privada es un secreto que debe permanecer en tu máquina. Si la proteges con una frase de contraseña y almacenas solo la clave pública en los servidores, obtienes un método de inicio de sesión que es más seguro y más fácil de automatizar que las contraseñas compartidas.
El Problema con las Contraseñas
La autenticación tradicional basada en contraseñas se basa en un secreto compartido: la contraseña. Aunque las contraseñas fuertes pueden proporcionar un nivel decente de seguridad, son susceptibles a varias debilidades:
- Ataques de fuerza bruta: Los atacantes pueden probar innumerables combinaciones de contraseñas hasta adivinar la correcta.
- Ataques de diccionario: Usando palabras o frases comunes, los atacantes pueden comprometer cuentas rápidamente.
- Keyloggers: El software malicioso puede capturar las pulsaciones de teclas, revelando contraseñas.
- Phishing: Las tácticas de ingeniería social pueden engañar a los usuarios para que divulguen sus credenciales.
- Error humano: Los usuarios a menudo eligen contraseñas débiles, adivinables o reutilizadas, y pueden exponerlas accidentalmente.
La autenticación por clave SSH reduce esos riesgos porque el secreto privado no se escribe en el servidor remoto. Eso no hace que las claves sean mágicas. Una clave privada robada y sin cifrar aún puede ser mal utilizada, y un archivo authorized_keys mal administrado puede convertirse en una puerta trasera silenciosa.
Autenticación por Clave SSH: Una Visión General
La autenticación por clave SSH aprovecha la criptografía asimétrica, un sistema que utiliza un par de claves matemáticamente vinculadas: una clave pública y una clave privada. A diferencia de la criptografía simétrica, donde se usa la misma clave tanto para cifrar como para descifrar, la criptografía asimétrica utiliza una clave para cifrar y otra diferente, pero relacionada, para descifrar.
Cuando te conectas con claves, el servidor verifica si tu cuenta confía en la clave pública que se ofrece. Luego, tu cliente firma los datos de autenticación con la clave privada correspondiente. El servidor verifica esa firma con la clave pública. La clave privada no se sube al servidor.
El Dúo Criptográfico: Claves Públicas y Privadas
En el corazón de la autenticación por clave SSH se encuentran estos dos componentes distintos pero interconectados.
La Clave Privada
La clave privada es tu identidad secreta. Es una cadena larga y compleja de caracteres que debe mantenerse absolutamente confidencial y nunca compartirse con nadie. Piensa en ella como la llave única de tu caja de seguridad digital.
- Crítica para la Seguridad: Si tu clave privada se ve comprometida, un atacante podría hacerse pasar por ti y obtener acceso no autorizado a cualquier servidor donde se haya implementado la clave pública correspondiente.
- Ubicación: Normalmente se almacena en tu máquina local (por ejemplo,
~/.ssh/id_rsa,~/.ssh/id_ed25519). - Protección: Puede protegerse con una frase de contraseña. Si alguien copia el archivo de clave, la frase de contraseña es la barrera adicional entre "archivo robado" y "acceso al servidor robado".
La Clave Pública
La clave pública es la contraparte de tu clave privada. Se deriva de tu clave privada pero no se puede usar para recrear la clave privada. Como su nombre indica, la clave pública está destinada a ser compartida y colocada en cualquier servidor al que desees acceder.
- Compartible: Puedes distribuir de forma segura tu clave pública a cualquier persona o servidor sin comprometer tu seguridad.
- Ubicación: En el servidor, las claves públicas normalmente se almacenan en el archivo
~/.ssh/authorized_keyspara cada cuenta de usuario. Cada línea en este archivo representa una clave pública de confianza. - Rol: La clave pública permite al servidor verificar una firma realizada por la clave privada correspondiente.
Cómo Funciona la Autenticación por Clave SSH: El Protocolo de Enlace
Desglosemos el proceso paso a paso de cómo la autenticación por clave SSH establece una conexión segura:
- Generación del Par de Claves: Primero, generas un par de claves pública y privada en tu máquina local. La clave privada permanece en secreto, y la clave pública es la que distribuirás.
- Implementación de la Clave Pública: Copias tu clave pública al servidor remoto al que deseas acceder. Esta clave normalmente se agrega al archivo
~/.ssh/authorized_keysen el directorio de inicio de tu usuario en el servidor. - Intento de Conexión: Cuando inicias una conexión SSH desde tu máquina local al servidor remoto, tu cliente SSH indica que desea autenticarse usando una clave.
- Verificación del Servidor: El servidor verifica si la clave pública ofrecida está permitida para ese usuario.
- Prueba del Cliente: Tu cliente firma los datos de autenticación con la clave privada. Si la clave privada tiene una frase de contraseña, es posible que se te pida que la desbloquees localmente.
- Verificación: El servidor verifica la firma usando la clave pública de
authorized_keys. Si la firma es válida y la cuenta tiene permiso para iniciar sesión, la autenticación tiene éxito. - Autenticación Concedida: Si la verificación es exitosa, el servidor te concede acceso y se establece una sesión SSH segura.
Es crucial que tu clave privada nunca abandone tu máquina local durante todo este proceso. Solo se intercambian pruebas criptográficas derivadas de ella.
Generando un Par de Claves SSH
Generar un par de claves SSH es un proceso sencillo usando el comando ssh-keygen en tu máquina local (Linux, macOS o WSL/Git Bash en Windows).
ssh-keygen -t ed25519 -C "[email protected]"
-t ed25519: Especifica el tipo de clave a crear. Ed25519 es un valor predeterminado moderno para la mayoría de las nuevas claves OpenSSH. RSA sigue siendo común, especialmente en sistemas más antiguos.-C "[email protected]": Agrega un comentario a la clave pública, lo que ayuda a identificar su propósito o propietario.
Se te pedirá un archivo para guardar la clave (por defecto es ~/.ssh/id_ed25519) y una frase de contraseña. Usa siempre una frase de contraseña fuerte para proteger tu clave privada.
Generando par de claves ed25519 pública/privada.
Introduce el archivo en el que guardar la clave (~/.ssh/id_ed25519):
Directorio creado '/home/tu_usuario/.ssh'.
Introduce frase de contraseña (vacía para ninguna frase de contraseña):
Introduce la misma frase de contraseña de nuevo:
Tu identificación se ha guardado en /home/tu_usuario/.ssh/id_ed25519.
Tu clave pública se ha guardado en /home/tu_usuario/.ssh/id_ed25519.pub.
La huella digital de la clave es: SHA256:...
La imagen aleatoria de la clave es:
+--[ED25519 256]----+
| .=+ |
| . o. . |
| . + o. |
| o = B o. |
| . S @ + + |
| = + B . |
| o * * E |
| . o o |
| . . |
+----[SHA256]-------+
Después de la generación, tendrás dos archivos en tu directorio ~/.ssh:
id_ed25519(tu clave privada)id_ed25519.pub(tu clave pública)
Asegúrate de que tu archivo de clave privada tenga permisos estrictos:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
Implementando Tu Clave Pública
Para usar la autenticación por clave, tu clave pública debe colocarse en el servidor remoto al que deseas acceder.
Usando ssh-copy-id (Recomendado)
La utilidad ssh-copy-id es la forma más simple y segura de implementar tu clave pública. Se encarga de crear el directorio ~/.ssh y el archivo authorized_keys con los permisos correctos si no existen.
ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@host_remoto
Reemplaza usuario con tu nombre de usuario en el servidor remoto y host_remoto con la dirección IP o nombre de host del servidor. Se te pedirá tu contraseña para usuario@host_remoto por última vez para subir la clave.
Implementación Manual
Si ssh-copy-id no está disponible, puedes copiar la clave pública manualmente:
Copia el contenido de la clave pública: Muestra tu clave pública usando
cat.cat ~/.ssh/id_ed25519.pubCopia toda la salida, que comienza con
ssh-ed25519 ...y termina con tu comentario.Conéctate por SSH al servidor remoto usando autenticación por contraseña:
ssh usuario@host_remotoIntroduce tu contraseña cuando se te solicite.
Crea el directorio
~/.sshy el archivoauthorized_keyssi no existen:mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keysAñade tu clave pública a
authorized_keys: Pega el contenido de la clave pública que copiaste anteriormente en el archivoauthorized_keys.echo "ssh-ed25519 AAAA..." >> ~/.ssh/authorized_keys(Reemplaza
ssh-ed25519 AAAA...con el contenido real de tu clave pública)
Conectándose con Claves SSH
Una vez que tu clave pública está en el servidor, puedes conectarte simplemente especificando el usuario y el host:
ssh usuario@host_remoto
Si tienes múltiples pares de claves o tu clave privada no está en la ubicación predeterminada (~/.ssh/id_rsa o ~/.ssh/id_ed25519), es posible que necesites especificarla usando la opción -i:
ssh -i ~/.ssh/mi_clave_personalizada usuario@host_remoto
Si tu clave privada está protegida por una frase de contraseña, se te pedirá que la introduzcas. Para evitar introducir la frase de contraseña repetidamente durante una sesión, puedes usar ssh-agent.
Beneficios de Seguridad de la Autenticación por Clave SSH
- Reduce el riesgo de adivinación de contraseñas: Si el inicio de sesión por contraseña está deshabilitado, los atacantes no pueden forzar por fuerza bruta esa cuenta a través de contraseñas SSH.
- Credenciales más fuertes: Una clave SSH generada correctamente no es algo que un humano pueda adivinar.
- Sin carga de clave privada: Tu clave privada permanece local durante la autenticación.
- Amigable para la Automatización: Las claves permiten inicios de sesión automatizados y sin contraseña, lo cual es esencial para herramientas de automatización y tuberías CI/CD.
- Protección con Frase de Contraseña: Agregar una frase de contraseña a tu clave privada proporciona una capa adicional de seguridad. Incluso si tu archivo de clave privada es robado, permanece inutilizable sin la frase de contraseña.
Gestionando Tus Claves SSH
ssh-agent
ssh-agent es un programa que se ejecuta en segundo plano y mantiene tus claves privadas descifradas en la memoria. Cuando intentas conectarte a un servidor SSH, tu cliente SSH puede consultar a ssh-agent para obtener la clave privada necesaria, eliminando la necesidad de escribir tu frase de contraseña repetidamente.
Para iniciar ssh-agent y agregar tu clave:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
Introducirás tu frase de contraseña una vez al agregar la clave al agente.
Nombrado y Organización de Claves
Para gestionar múltiples claves (por ejemplo, para diferentes organizaciones, proyectos o uso personal), considera usar nombres significativos:
ssh-keygen -t ed25519 -f ~/.ssh/id_trabajo_proyecto -C "clave_trabajo_proyecto"
ssh-keygen -t ed25519 -f ~/.ssh/id_personal_github -C "clave_personal_github"
Luego puedes especificar qué clave usar con la opción -i, o configurar tu archivo ~/.ssh/config para seleccionar automáticamente la clave correcta según el host.
Ejemplo de ~/.ssh/config:
Host github.com
IdentityFile ~/.ssh/id_personal_github
User git
Host servidor-trabajo
Hostname 192.168.1.100
IdentityFile ~/.ssh/id_trabajo_proyecto
User usuario_dev
Mejores Prácticas y Consejos
- Nunca compartas tu clave privada: Esta es la regla de oro. Tu clave privada es tu identidad digital.
- Usa una frase de contraseña fuerte: Protege tu clave privada con una frase de contraseña robusta, similar a una contraseña fuerte. Esto hace que tu clave sea inútil incluso si cae en manos equivocadas.
- Rota cuando haya una razón: Genera una nueva clave cuando se pierda un dispositivo, un contratista se vaya, una clave se haya compartido por error, o un algoritmo antiguo ya no se ajuste a tu política.
- Restringe los permisos de archivos: Asegúrate de que tu archivo de clave privada tenga permisos
600(rw-------) y tu directorio~/.sshtenga700(rwx------). - Deshabilita la autenticación por contraseña con cuidado: Una vez que el inicio de sesión por clave funcione desde un segundo terminal, muchos servidores deberían establecer
PasswordAuthentication noen/etc/ssh/sshd_config. Mantén el acceso a la consola disponible antes de cambiar esto en sistemas remotos. - Usa
ssh-agent: Por conveniencia y seguridad, usassh-agentpara gestionar tus claves, especialmente aquellas con frases de contraseña.
Un Modelo Mental Simple
La clave pública es la cerradura que instalas en la cuenta del servidor. La clave privada es la credencial que guardas en tu propia máquina. La frase de contraseña protege esa credencial si el archivo es copiado. El archivo authorized_keys es la lista de acceso.
La mayoría de los problemas con las claves SSH provienen de confundirlas: copiar la clave privada al servidor, pegar la clave pública bajo el usuario incorrecto, usar el archivo de identidad incorrecto, o dejar los permisos demasiado abiertos para que OpenSSH los confíe. Nombra las claves por propósito, protege las claves privadas con frases de contraseña, usa ssh-agent por conveniencia, elimina las claves públicas antiguas cuando el acceso deba terminar, y prueba los cambios desde un segundo terminal antes de deshabilitar el inicio de sesión por contraseña.