Saltar a contenido

Notas sobre claves ssh (pares público-privado)

Historial de cambios

Versión Fecha Comentario Autor
1.0 03/02/2025 Primera edición. Marco teórico y Cheat Sheet. Jes

1. Marco Teórico

1.1 Fundamentos Criptográficos

sequenceDiagram  
    participant Cliente  
    participant Servidor  
    Cliente->>Servidor: Conexión SSH (Puerto 22/TCP)  
    Servidor->>Cliente: Envía clave pública del host  
    Cliente->>Cliente: Verifica huella en known_hosts  
    Cliente->>Servidor: Cifra desafío con clave pública del servidor  
    Servidor->>Servidor: Descifra con clave privada  
    Servidor->>Cliente: Confirma autenticación  
    Cliente->>Servidor: Establece canal seguro (AES/ChaCha20)
Diagrama 1: Flujo de autenticación SSH con claves asimétricas

Conceptos Clave:

  • Ed25519: Algoritmo EdDSA basado en curvas elípticas (Curva25519). 256 bits, 30% más rápido que RSA-4096.
  • Diffie-Hellman Efímero (ECDH): Genera claves de sesión únicas por conexión (PFS).
  • known_hosts: Base de datos local de huellas criptográficas de servidores (evita MITM).

2.1 SSH Cheat Sheet: Gestión de Claves y Operaciones Esenciales

2.1.1 Generación de Claves SSH

Sistemas Unix/Linux/WSL

ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_servidor_prod -C "admin@prod"
  • -t ed25519: Algoritmo EdDSA (más seguro que RSA)
  • -a 100: 100 rondas de derivación de clave para protección PBKDF2
  • -C: Comentario identificativo (normalmente email/usuario)

Windows (PowerShell)

ssh-keygen -t ed25519 -C "user@win" | Out-Null

Archivos Generados

~/.ssh/id_servidor_prod    # Clave privada (permisos 600)
~/.ssh/id_servidor_prod.pub # Clave pública (copiar a servidores)

2.1.2 Configuración del Agente SSH

Linux/WSL

eval $(ssh-agent -s)        # Iniciar agente en sesión actual
ssh-add -t 1h ~/.ssh/id_servidor_prod  # Cache en memoria por 1 hora

Windows (OpenSSH)

Start-Service ssh-agent                    # Iniciar servicio
ssh-add "$env:USERPROFILE\.ssh\id_ed25519" # Agregar clave

If you have a copy of your ssh keys (e.g., on a USB stick) then simply copy the key files to the ~/.ssh/ directory.
E.g.,
cp /path/to/my/key/id_rsa ~/.ssh/id_rsa
cp /path/to/my/key/id_rsa.pub ~/.ssh/id_rsa.pub
sudo chmod 600 ~/.ssh/id_rsa # change permissions on file
sudo chmod 600 ~/.ssh/id_rsa.pub
eval $(ssh-agent -s) # start the ssh-agent in the background
ssh-add ~/.ssh/id_rsa # make ssh agent to actually use copied key

2.1.3 Instalación Manual en Servidor Remoto

1
2
3
4
5
6
7
8
9
# Copiar clave pública al servidor:
# manual
cat ~/.ssh/id_servidor_prod.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# ssh-copy
ssh-copy-id -i id_servidor_prod.pub user@hostname.example.com

# Configurar permisos (ejecutar en servidor):
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys  # Evita acceso no autorizado

The ssh-copy-id command (in the openssh-client package and installed by default) does exactly this:
ssh-copy-id user@hostname.example.com
copies the public key of your default identity (use -i identity_file for other identities) to the remote host.
The default identity is your "standard" ssh key. It consists of two files (public and private key) in your ~/.ssh directory, normally named identity, id_rsa, id_dsa, id_ecdsa or id_ed25519 (and the same with .pub), depending on the type of key. If you did not create more than one ssh key, you do not have to worry about specifying the identity, ssh-copy-id will just pick it automatically.


2.1.4 Configuración Avanzada (~/.ssh/config)

1
2
3
4
5
6
7
Host servidor-prod
    HostName 192.168.1.100      # IP/Dominio del servidor
    User admin                  # Usuario por defecto
    Port 2222                   # Puerto no estándar
    IdentityFile ~/.ssh/id_servidor_prod  # Ruta clave privada
    IdentitiesOnly yes          # Ignora otras claves del agente
    ProxyCommand C:\Windows\System32\OpenSSH\ssh.exe -W %h:%p jump-host  # Windows: Conexión via jump host

2.1.5 Comandos Esenciales Multiplataforma

Conexión Básica

ssh -i ~/.ssh/id_ed25519 user@host  # Linux/WSL
ssh -i "$env:USERPROFILE\.ssh\id_ed25519" user@host  # PowerShell

Túnel SOCKS (Proxy Dinámico)

ssh -D 1080 servidor-prod  # Redirige tráfico al puerto 1080 local

Transferencia Segura de Archivos

scp -i ~/.ssh/clave.pub archivo.txt servidor-prod:/ruta/destino  # Copiar archivo
rsync -avz -e "ssh -i ~/.ssh/clave.pub" directorio/ servidor-prod:/backup/  # Sincronización eficiente

2.1.6 Buenas Prácticas de Seguridad

Passphrases Robustas

pwgen -s 20 1  # Genera frase de 20 caracteres aleatorios (instalar con 'sudo apt install pwgen')

Rotación Periódica de Claves

ssh-keygen -p -f ~/.ssh/id_old_key  # Cambiar passphrase sin regenerar clave

Deshabilitar Autenticación por Contraseña

sudo sed -i 's/^#\?PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl restart sshd  # Aplica cambios en servidor

2.1.7 Solución de Problemas Comunes

Error de Permisos

chmod 600 ~/.ssh/id_ed25519  # Linux/WSL: Corregir permisos
icacls "$env:USERPROFILE\.ssh\id_ed25519" /reset  # Windows: Restablecer ACL

Depuración de Conexiones

ssh -vvv servidor-prod  # Modo verbose (nivel 3)
tail -f /var/log/auth.log  # Monitorear logs de autenticación (servidor Ubuntu)