SSH cliente: ssh, ssh-keygen, ssh-copy-id, ~/.ssh/config

Introducción

SSH (Secure Shell) es el protocolo estándar para administrar sistemas remotos de forma segura. Cifra todo el tráfico y soporta autenticación por contraseña o por par de claves criptográficas. La autenticación por clave es más segura y cómoda que la contraseña.

Conexión básica con ssh


# Conectar como el mismo usuario del sistema local
ssh servidor.ejemplo.com

# Conectar como usuario específico
ssh usuario@servidor.ejemplo.com

# Puerto diferente al estándar (22)
ssh -p 2222 usuario@servidor.ejemplo.com

# Usar una clave privada específica
ssh -i ~/.ssh/mi_clave usuario@servidor.ejemplo.com

# Ejecutar un comando remoto sin abrir sesión interactiva
ssh usuario@servidor "df -h"
ssh usuario@servidor "uptime; free -h"

# Pseudo-terminal forzada (necesaria para comandos interactivos)
ssh -t usuario@servidor "sudo bash"

# Verbose para depurar problemas de conexión
ssh -v usuario@servidor
ssh -vv usuario@servidor   # más detalle
          

ssh-keygen — Generar par de claves

La autenticación por clave usa criptografía asimétrica: la clave privada se queda en el cliente (protegida con passphrase) y la clave pública se instala en el servidor.


# Generar clave Ed25519 (recomendado, más corta y segura que RSA)
ssh-keygen -t ed25519 -C "usuario@equipo"

# Generar clave RSA de 4096 bits (compatible con sistemas más antiguos)
ssh-keygen -t rsa -b 4096 -C "usuario@equipo"

# Especificar fichero de salida (por defecto: ~/.ssh/id_ed25519)
ssh-keygen -t ed25519 -f ~/.ssh/clave_servidor_web

# Cambiar passphrase de una clave existente
ssh-keygen -p -f ~/.ssh/id_ed25519

# Ver la huella digital (fingerprint) de una clave
ssh-keygen -l -f ~/.ssh/id_ed25519

# Ver la clave pública a partir de la privada
ssh-keygen -y -f ~/.ssh/id_ed25519
          

Estructura de ficheros generados:

  • ~/.ssh/id_ed25519 — clave privada (permisos 600, nunca compartir)
  • ~/.ssh/id_ed25519.pub — clave pública (se copia al servidor)

ssh-copy-id — Instalar la clave pública en el servidor


# Copiar la clave pública por defecto al servidor
ssh-copy-id usuario@servidor.ejemplo.com

# Copiar una clave específica
ssh-copy-id -i ~/.ssh/clave_servidor_web.pub usuario@servidor.ejemplo.com

# Si el servidor usa puerto diferente
ssh-copy-id -p 2222 usuario@servidor.ejemplo.com

# Equivalente manual (cuando ssh-copy-id no está disponible)
cat ~/.ssh/id_ed25519.pub | ssh usuario@servidor "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
          

Permisos requeridos en el servidor:


# El directorio .ssh debe tener permisos 700
chmod 700 ~/.ssh

# El fichero authorized_keys debe tener permisos 600
chmod 600 ~/.ssh/authorized_keys

# Si los permisos son incorrectos, SSH ignora las claves autorizadas
          

~/.ssh/config — Configuración del cliente

El fichero ~/.ssh/config permite definir alias y opciones por servidor, evitando escribir flags en cada conexión.


# ~/.ssh/config

# Alias "web" para conectar a servidor de producción
Host web
    HostName 192.168.1.100
    User administrador
    Port 2222
    IdentityFile ~/.ssh/clave_web

# Servidor de base de datos
Host db
    HostName db.intranet.local
    User dba
    IdentityFile ~/.ssh/clave_db
    ServerAliveInterval 60     # keepalive cada 60 s
    ServerAliveCountMax 3

# Todos los servidores de la intranet
Host *.intranet.local
    User admin
    IdentityFile ~/.ssh/clave_intranet

# Opciones globales para todas las conexiones
Host *
    ServerAliveInterval 120
    AddKeysToAgent yes
    IdentitiesOnly yes
          

Con este fichero basta escribir ssh web en lugar de ssh -p 2222 -i ~/.ssh/clave_web administrador@192.168.1.100.

Transferencia de ficheros


# scp — copiar fichero al servidor
scp fichero.txt usuario@servidor:/ruta/destino/

# scp — copiar directorio completo
scp -r directorio/ usuario@servidor:/ruta/destino/

# scp — descargar desde servidor
scp usuario@servidor:/ruta/fichero.txt .

# sftp — sesión interactiva
sftp usuario@servidor
# Dentro de sftp: put fichero, get fichero, ls, cd, quit

# rsync sobre SSH (más eficiente para sincronización)
rsync -avz --progress ficheros/ usuario@servidor:/ruta/destino/
rsync -avz -e "ssh -p 2222" ficheros/ usuario@servidor:/ruta/
          

SSH tunneling (reenvío de puertos)


# Reenvío local (-L): acceder a un servicio remoto como si fuera local
# Acceder a la web interna del servidor como localhost:8080
ssh -L 8080:localhost:80 usuario@servidor
# Ahora http://localhost:8080 apunta al puerto 80 del servidor

# Reenvío remoto (-R): exponer un servicio local en el servidor remoto
# Exponer el puerto 3000 local como puerto 9000 en el servidor
ssh -R 9000:localhost:3000 usuario@servidor

# Proxy SOCKS (-D): enrutar tráfico a través del servidor
ssh -D 1080 usuario@servidor
# Configurar el navegador para usar SOCKS5 en localhost:1080

# Sin abrir shell (solo el túnel)
ssh -N -L 5432:db-interno:5432 usuario@bastion
          

ssh-agent — Gestionar claves en memoria


# Iniciar el agente (normalmente ya está activo en el escritorio)
eval "$(ssh-agent -s)"

# Añadir la clave privada al agente (pide passphrase una sola vez)
ssh-add ~/.ssh/id_ed25519

# Añadir con tiempo de expiración (3600 segundos)
ssh-add -t 3600 ~/.ssh/id_ed25519

# Ver claves cargadas en el agente
ssh-add -l

# Eliminar todas las claves del agente
ssh-add -D

# Agent forwarding: usar las claves locales en conexiones encadenadas
ssh -A usuario@bastion
# Desde bastion se puede conectar a otros servidores usando las claves locales
          

Usar siempre claves Ed25519 con passphrase. Configurar ~/.ssh/config para evitar escribir opciones repetidamente. Nunca compartir la clave privada ni copiarla fuera del equipo de trabajo.

Servidor SSH: sshd_config, AllowUsers, PermitRootLogin, autenticación por clave

Índice de la sección

Índice del curso