Problema
En entornos con varios servidores y más de un equipo cliente (portátiles, desktop, máquinas de CI), la proliferación de claves SSH rápidamente se vuelve inmanejable. Cada vez que se añade o se pierde un dispositivo, la lista de claves autorizadas en cada servidor debe actualizarse. Sin una estrategia clara, se corre el riesgo de:
- Dejar claves huérfanas que siguen permitiendo acceso.
- No poder revocar el acceso de un dispositivo comprometido sin afectar a los demás.
- Confundir cuál clave corresponde a cuál máquina, lo que dificulta auditorías y rotaciones periódicas.
El desafío es mantener una relación uno‑a‑uno entre dispositivos cliente y sus credenciales, sin que esa relación se vuelva una tabla de Excel imposible de mantener.
Causa
-
Uso de una única clave maestra
Copiar la misma clave privada a todos los dispositivos simplifica la configuración inicial, pero cualquier pérdida o robo compromete todo el parque. -
Falta de inventario estructurado
Sin un registro que asocie dispositivo, huella de la clave pública y servidores donde está autorizada, la revocación se vuelve manual y propensa a errores. -
Mezcla de claves de usuario y de automatización
Cuando los scripts de backup o despliegue reutilizan la misma clave que el usuario interactivo, se pierde la granularidad de permisos. -
Ignorar la separación entre host keys y user keys
Confundir la función de la clave del servidor (host key) con la del cliente lleva a prácticas inseguras, como copiar la clave privada del servidor a los clientes.
Solución
Adoptar un modelo de una clave por dispositivo cliente y una clave por cuenta de automatización. Cada clave tiene su propio comentario y passphrase, y se gestiona mediante un inventario sencillo (por ejemplo, un archivo YAML o una hoja de cálculo). El flujo básico es:
-
Generar una clave única por dispositivo
Utilizaed25519por su tamaño reducido y resistencia criptográfica. Incluye un comentario descriptivo ("alex-laptop"). -
Distribuir solo la clave pública
Copia la clave pública a los servidores que necesiten acceso, añadiéndola al archivo~/.ssh/authorized_keysdel usuario correspondiente. Nunca copies la clave privada al servidor. -
Mantener un inventario central
Registra: nombre del dispositivo, huella (ssh-keygen -lf <pubkey>), usuarios/servidores donde está autorizada, fecha de creación y fecha de última rotación. -
Rotación periódica
Cada 6‑12 meses (o al detectar una pérdida) genera una nueva clave, actualiza el inventario y reemplaza la entrada enauthorized_keys. Deja la clave antigua en el inventario hasta confirmar que todos los procesos críticos migraron. -
Cuentas de servicio separadas
Para backups, despliegues o CI, crea usuarios dedicados en los servidores y asigna claves exclusivas a esas cuentas. Limita los permisos conauthorized_keys(por ejemplo,command="rsync --server ..."). -
Procedimiento de revocación
Cuando un dispositivo se pierde, busca su huella en el inventario y elimina la línea correspondiente deauthorized_keysen cada servidor. Usassh-copy-id -f -i <pubkey> user@hostpara actualizar de forma automática.
Herramientas útiles
- ssh-keygen – generación y gestión de claves.
- ssh-copy-id – copia segura de claves públicas.
- ansible o fabric – automatiza la inserción/eliminación de claves en varios servidores.
- git – versiona el archivo de inventario para auditoría.
Cuándo aplicar esta solución
- Entornos con >2 dispositivos cliente que acceden a varios servidores.
- Necesidad de revocar acceso rápidamente (pérdida de laptop, compromiso de cuenta).
- Política de cumplimiento que exige rotación de credenciales y trazabilidad.
- Automatización donde los scripts requieren permisos limitados y diferenciados.
No es necesario si solo manejas un único servidor y un único cliente; en ese caso una sola clave puede ser suficiente y la sobrecarga de inventario no se justifica.
Código
# 1. Generar clave Ed25519 con comentario y passphrase
ssh-keygen -t ed25519 -C "alex-laptop" -f ~/.ssh/id_ed25519_alex_laptop
# 2. Ver huella de la clave pública (para el inventario)
ssh-keygen -lf ~/.ssh/id_ed25519_alex_laptop.pub
# 3. Copiar la clave pública a un servidor remoto
ssh-copy-id -i ~/.ssh/id_ed25519_alex_laptop.pub [email protected]
# 4. Añadir restricción de comando (ejemplo para backup)
cat <<EOF >> ~/.ssh/authorized_keys
command="/usr/local/bin/backup.sh",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE... backup-key
EOF
Verificación
-
Conexión con la nueva clave
ssh -i ~/.ssh/id_ed25519_alex_laptop [email protected] "echo ok"Debe devolver
oksin solicitar contraseña. -
Comprobar que la clave antigua ya no funciona (si se revocó). Intenta conectar con la clave retirada; la autenticación debe fallar.
-
Validar inventario
Ejecuta un script que compare la huella almacenada con la presente enauthorized_keysde cada servidor:for host in server1.example.com server2.example.com; do ssh user@$host "grep -F \"$(ssh-keygen -lf ~/.ssh/id_ed25519_alex_laptop.pub | awk '{print $2}')\" ~/.ssh/authorized_keys && echo present || echo missing" done
Notas adicionales
- Passphrase vs. agente SSH: Usa una passphrase fuerte y carga la clave en
ssh-agentpara evitar escribirla en cada sesión. Si el agente se compromete, revoca la clave inmediatamente. - Backup del inventario: Guarda el archivo de inventario en un repositorio privado y cifrado; sin él, la revocación será un proceso manual y propenso a errores.
- Host key verification: No confundas la gestión de host keys con la de user keys. Mantén el archivo
~/.ssh/known_hostsactualizado y verifica que los fingerprints de los servidores coincidan con los esperados. - Múltiples usuarios en el mismo dispositivo: Si varios usuarios comparten una laptop, cada uno debe tener su propio par de claves y su propio registro en el inventario.
- Herramientas de gestión centralizada: En entornos más grandes, considera soluciones como HashiCorp Vault SSH secrets engine o FreeIPA para delegar la emisión y revocación automática de claves.
Con este enfoque, la gestión de SSH keys deja de ser un dolor de cabeza y se convierte en un proceso repetible, auditable y fácil de escalar.