Llaves SSH: la forma correcta (y segura) de acceder a tu servidor

Llaves SSH: la forma correcta (y segura) de acceder a tu servidor
Imágen generada con Nano Banana

Adiós a las contraseñas: el poder de las llaves SSH

Si has seguido el artículo anterior sobre los primeros pasos con tu VPS, habrás visto que mencioné las llaves SSH como parte de la configuración de seguridad. Pero este tema se merece un artículo completo, porque entender bien cómo funcionan las llaves SSH es una de las habilidades fundamentales para cualquier persona que administre servidores.

En este artículo vamos a ver desde qué son exactamente hasta cómo usarlas como un profesional, con múltiples servidores, agentes y buenas prácticas de seguridad.

Una llave SSH es un par de archivos que funcionan como una cerradura y una llave digitales:

Cuando intentas conectarte por SSH, el servidor te reta a demostrar que posees la llave privada que corresponde a la llave pública que él tiene guardada. Si la tienes, acceso concedido. Si no, por más que tengas la contraseña del usuario... ni siquiera llegarás a pedírtela si así lo configuramos.

Usar llaves SSH en lugar de contraseñas tiene muchísimas ventajas:

  • **Inmunidad a la fuerza bruta:** Las contraseñas, por complejas que sean, pueden ser descifradas o filtradas. Una llave criptográfica moderna (como Ed25519) es matemáticamente imposible de romper mediante ataques de fuerza bruta.
  • **Adiós a los bots:** Al usar llaves, puedes deshabilitar por completo el inicio de sesión con contraseña (`PasswordAuthentication no`). Esto le cierra la puerta en la cara al 99% de los escáneres automáticos que recorren internet buscando servidores vulnerables.
  • **Mayor comodidad en el día a día:** Olvídate de memorizar contraseñas larguísimas cada vez que necesites entrar a tu VPS. El acceso es directo e instantáneo.
  • **Automatización sin fricción:** Las llaves SSH son esenciales si quieres configurar scripts de despliegue, automatizar copias de seguridad con `rsync` o usar herramientas de integración continua.
  • **Protección contra keyloggers:** Como no tienes que digitar ninguna credencial al iniciar sesión, un malware en tu computadora local no tendría forma de capturar tus datos de acceso al servidor.

En tu máquina local (no en el servidor), abre una terminal y ejecuta:

ssh-keygen -t ed25519 -C "mi-llave-personal"

Te preguntará dónde guardarla (lo ideal es dejarlo por defecto: ~/.ssh/id_ed25519) y una passphrase opcional.

¿Poner o no poner passphrase? Siempre ponla. Es una capa extra de seguridad: si alguien roba tu archivo de llave privada, todavía necesitará la frase para usarla. Es como tener la llave de tu casa dentro de una caja fuerte con candado.

Hay dos tipos principales de llaves hoy en día:

  • **Ed25519 (recomendado):** Es el estándar moderno. Sus llaves son más cortas, más rápidas de generar y se consideran más seguras que RSA. Usa `-t ed25519`.
  • **RSA (legacy):** Solo deberías usarlo si trabajas con sistemas antiguos que no soportan Ed25519. En ese caso, asegúrate de usar al menos 4096 bits: `-t rsa -b 4096`.

Para la gran mayoría de casos, Ed25519 es la opción correcta. Si por algún motivo necesitas RSA:

ssh-keygen -t rsa -b 4096 -C "mi-llave-rsa"

Copiar la llave pública al servidor

Hay varias formas de hacerlo. Te muestro las más prácticas:

ssh-copy-id -p 4867 andres@tu-ip-del-vps

Te pedirá la contraseña una última vez y automáticamente agregará tu llave pública al archivo ~/.ssh/authorized_keys del servidor.

cat ~/.ssh/id_ed25519.pub | ssh andres@tu-ip-del-vps "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

Sí, ese comando hace todo: crea la carpeta .ssh si no existe, agrega tu llave al final del archivo y ajusta los permisos correctamente.

Muestra tu llave pública:

cat ~/.ssh/id_ed25519.pub

Copia el resultado, conéctate al servidor con tu contraseña y pégala en:

nano ~/.ssh/authorized_keys

Y ajusta permisos:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Probar la conexión

Ahora intenta conectarte. Si todo está bien, ya no te pedirá contraseña:

ssh -p 4867 andres@tu-ip-del-vps

Si funciona, ya puedes dar el paso final: deshabilitar el login por contraseña en el servidor. Edita /etc/ssh/sshd_config y asegúrate de tener:

PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no

Reinicia SSH:

sudo systemctl restart ssh

A partir de este momento, solo quien tenga tu llave privada podrá acceder al servidor. Así de simple.

El agente SSH: no escribas la passphrase cada vez

Si pusiste passphrase a tu llave (como recomiendo), cada vez que te conectes te la pedirá. Para evitarlo, usa el agente SSH:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

Te pedirá la passphrase una sola vez y la recordará durante toda la sesión de tu terminal. En macOS esto ocurre automáticamente si agregas la llave al llavero:

ssh-add --apple-use-keychain ~/.ssh/id_ed25519

Múltiples llaves para múltiples servidores

Es normal tener varias llaves: una personal, una del trabajo, una para GitHub, etc. El archivo ~/.ssh/config te permite organizarlo todo de forma elegante:

# VPS personal
Host mi-vps
    HostName 198.51.100.40
    Port 4867
    User andres
    IdentityFile ~/.ssh/id_ed25519

# Servidor del trabajo
Host work-server
    HostName 198.51.100.42
    Port 22
    User juan
    IdentityFile ~/.ssh/id_rsa_trabajo

# GitHub
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_github

Con esta configuración, puedes conectarte simplemente con:

ssh mi-vps

En lugar de: ssh -p 4867 andres@198.51.100.40, mucho más limpio, ¿verdad?

Tu llave privada es el archivo más importante de tu configuración. Algunas reglas de oro:

  • **Nunca compartas tu llave privada** — ni la envíes por correo, ni la subas a GitHub, ni la pegues en un chat.
  • **Usa una passphrase fuerte** — es tu última línea de defensa si alguien roba el archivo.
  • **Rota las llaves periódicamente** — si sospechas que una llave se comprometió, revócala de inmediato.
  • **Usa llaves diferentes para cada servicio** — no uses la misma llave para tu VPS y para GitHub.

Windows: también puede

En Windows 10 y 11 modernos, SSH viene incluido. Abre PowerShell o Terminal de Windows y los comandos son prácticamente los mismos:

ssh-keygen -t ed25519 -C "windows-llave"
type %userprofile%\.ssh\id_ed25519.pub | clip

El segundo comando copia tu llave pública al portapapeles para que la pegues en el servidor.

También puedes usar PuTTYgen si prefieres interfaz gráfica, pero te recomiendo la terminal: es universal y los conceptos aprendidos aplican en cualquier sistema.

💡 En resumen: Dominar las llaves SSH es como aprender a cambiar una llanta: no lo haces todos los días, pero cuando lo necesitas, salva el viaje. Es una de esas habilidades que separan a quien usa un servidor de quien realmente lo administra.

En el próximo artículo veremos cómo usar estas llaves para automatizar despliegues con GitHub Actions y rsync. ¡No te lo pierdas!