Gestión de Claves SSH
Genera, rota y distribuye claves SSH de forma segura con scripts de Bash para equipos y acceso a servidores.
Nota para desarrolladores hispanohablantes: Esta guía incluye ejemplos y convenciones de nomenclatura adaptadas a equipos que trabajan en español. Cuando existen diferencias significativas en terminología técnica entre el inglés y el español, se indican explícitamente para facilitar la comunicación en equipos multiculturales.
Visión General
Las claves SSH son la forma estándar de autenticarse en servidores Linux, repositorios Git e instancias cloud. Gestionarlas bien significa generar claves robustas, rotarlas antes de que envejezcan y distribuir claves públicas a servidores autorizados sin exponer claves privadas. Un script de Bash puede automatizar este ciclo de vida, reduciendo el riesgo de claves obsoletas y errores de copiar y pegar manual.
Cuándo Usar
Usa este recurso cuando:
- Gestiones muchos servidores o cuentas de usuario y necesites despliegue consistente de claves SSH.
- Rotes claves periódicamente por cumplimiento o después de que un miembro del equipo se vaya.
- Quieras deshabilitar la autenticación por contraseña y confiar en acceso basado en claves.
- Necesites recopilar y auditar claves públicas en toda la flota.
Solución
Script de gestión de claves SSH
#!/usr/bin/env bash
set -euo pipefail
USER="${1:-$USER}"
KEY_DIR="$HOME/.ssh"
# Generar una nueva clave Ed25519 si no existe
if [[ ! -f "$KEY_DIR/id_ed25519" ]]; then
mkdir -p "$KEY_DIR"
chmod 700 "$KEY_DIR"
ssh-keygen -t ed25519 -a 100 -f "$KEY_DIR/id_ed25519" -N "" -C "$USER@$(hostname)-$(date +%Y-%m-%d)"
fi
# Mostrar clave pública
cat "$KEY_DIR/id_ed25519.pub"
# Rotar una clave antigua renombrándola y generando una nueva
rotate_key() {
local key_file="$1"
if [[ -f "$key_file" ]]; then
local backup="${key_file}.old.$(date +%Y%m%d)"
mv "$key_file" "$backup"
mv "${key_file}.pub" "${backup}.pub"
fi
ssh-keygen -t ed25519 -a 100 -f "$key_file" -N "" -C "rotated-$(date +%Y-%m-%d)"
}
rotate_key "$KEY_DIR/id_ed25519"
# Distribuir clave pública a un servidor
distribute_key() {
local server="$1"
ssh-copy-id -i "$KEY_DIR/id_ed25519.pub" "$server"
}
# distribute_key user@server.example.com
Explicación
El script primero asegura que el directorio ~/.ssh exista con los permisos correctos. Luego genera una clave Ed25519, que es más corta y segura que RSA para longitudes de clave equivalentes. La función rotate_key renombra el par de claves existente con un sufijo de fecha y crea uno nuevo. La función distribute_key usa ssh-copy-id para agregar la clave pública al archivo ~/.ssh/authorized_keys del servidor remoto. Esto es más seguro que editar archivos manualmente porque preserva permisos correctos y evita errores de pegado.
Variantes
| Operación | Comando | Notas |
|---|---|---|
| Generar | ssh-keygen -t ed25519 | Default moderno, seguridad de 256 bits |
| Rotar | renombrar + regenerar | Conserva la clave vieja hasta confirmar que la nueva funciona |
| Distribuir | ssh-copy-id | Agrega a authorized_keys de forma segura |
| Auditar | ssh-keygen -lf key.pub | Muestra fingerprint y comentario |
Mejores Prácticas
- Prefiere Ed25519 sobre RSA. Ed25519 es más rápido, más corto y evita debilidades de parámetros de RSA.
- Protege claves privadas con passphrase para uso interactivo. Usa
ssh-agentpara evitar escribirla repetidamente. - Rota claves bajo programación o eventos. Activa la rotación cuando un empleado se va o una clave se sospecha comprometida.
- Mantén authorized_keys bajo control de versiones. Rastrea cambios de claves de servidor con una herramienta de gestión de configuración.
- Deshabilita autenticación por contraseña. Una vez desplegadas las claves, configura
PasswordAuthentication noen sshd_config.
Errores Comunes
- Compartir claves privadas entre usuarios. Cada persona y cada proceso automatizado debe tener su propio par de claves.
- Almacenar claves sin passphrase en laptops. Un laptop robado da acceso inmediato a cada servidor.
- Ignorar permisos de archivo.
~/.sshdebe ser 700 y las claves privadas 600; permisos demasiado abiertos hacen que SSH rechace la clave. - Dejar claves antiguas en servidores después de rotar. Una rotación no está completa hasta que la clave pública antigua se elimina de authorized_keys.
- Usar claves RSA cortas. Las claves RSA por debajo de 4096 bits ya no se recomiendan para producción.
Preguntas Frecuentes
P: ¿Cómo agrego una passphrase a una clave existente?
R: Usa ssh-keygen -p -f ~/.ssh/id_ed25519. También puedes usar ssh-agent para cachear la passphrase durante la sesión.
P: ¿Puedo usar la misma clave para múltiples servidores? R: Sí, pero es más seguro usar claves diferentes para distintas zonas de seguridad o proyectos. Esto limita el alcance si una clave se compromete.
P: ¿Cómo revoco una clave comprometida?
R: Elimina la clave pública correspondiente de cada archivo ~/.ssh/authorized_keys y rota la clave. Audita tu herramienta de gestión de infraestructura para asegurar que la clave no se reagregue.
Recursos Relacionados
Bash Scripting for DevOps Automation and System Tasks
How to write robust Bash scripts for automating deployments, system monitoring, log rotation, and routine maintenance tasks
RecipeBackup Rotation Script
Automate file backups with retention policies using a Bash script that rotates daily, weekly, and monthly snapshots.
RecipeLog Rotation and Compression
Rotate and compress application logs with Bash to prevent disk exhaustion and simplify log retention.
RecipeBash Loop Over Files
How to safely loop over files and directories in Bash, handling spaces, globs, and large file lists with correct patterns.
RecipeBash Parallel Execution
How to run shell commands in parallel with xargs, GNU parallel, and Bash background jobs while controlling concurrency and collecting results.