12. SSH (Secure Shell)

SSH es el estándar de facto para administrar servidores y dispositivos de red de forma cifrada. Reemplazó a Telnet y rsh al aportar autenticación robusta, integridad de mensajes y confidencialidad sobre una sola conexión TCP (puerto 22).

Además de proveer terminales remotas, SSH permite copiar archivos (scp, sftp), reenviar puertos y automatizar tareas, por lo que se integra en despliegues, monitoreo y flujos DevOps.

12.1 Acceso remoto seguro

Un cliente SSH inicia un saludo criptográfico con el servidor para negociar algoritmos, verificar la identidad del host mediante huellas digitales y establecer claves simétricas. A partir de ese momento, cada comando y respuesta viaja cifrado y protegido contra modificaciones.

El protocolo está especificado en la RFC 4251 y soporta versiones 1 y 2, aunque hoy se recomienda utilizar estrictamente SSHv2 por sus mejoras de seguridad.

12.2 Autenticación por contraseña o clave

SSH admite distintos mecanismos de autenticación:

Método Ventajas Consideraciones
Contraseña Fácil de desplegar en entornos pequeños. Vulnerable a fuerza bruta; requiere políticas estrictas.
Clave pública No transmite secretos por la red; ideal para automatización. Debe protegerse la clave privada y rotarla periódicamente.
Certificados X.509 o SSH CA Permiten expirar y revocar accesos centralmente. Requieren infraestructura de autoridad certificadora.

Las claves modernas se generan con algoritmos como Ed25519 o RSA de al menos 3072 bits. Su parte pública se instala en ~/.ssh/authorized_keys y puede limitarse a comandos o direcciones IP específicas.

12.3 Tunelización y reenvío de puertos

SSH puede transportar otros protocolos mediante tres modalidades:

  • Local forwarding: redirige un puerto local hacia un destino remoto protegido (ssh -L 8080:intranet:80 usuario@jump).
  • Remote forwarding: expone un servicio local a través del servidor (ssh -R 9000:localhost:1433 usuario@jump).
  • Dynamic forwarding: crea un proxy SOCKS (ssh -D 1080 usuario@jump) para enrutar aplicaciones enteras.

Estas capacidades son esenciales para acceder a bases de datos, paneles de administración o APIs internas sin exponerlos a Internet.

12.4 Ejemplo de uso básico

Un inicio de sesión interactivo luce así:

ssh usuario@192.168.0.10
The authenticity of host '192.168.0.10 (192.168.0.10)' can't be established.
ED25519 key fingerprint is SHA256:abcd1234...
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.10' (ED25519) to the list of known hosts.
usuario@192.168.0.10's password:
[usuario@servidor ~]$ uname -a

La primera conexión solicita confirmar la huella digital del servidor para prevenir ataques de intermediario. Luego, el usuario recibe una shell remota lista para ejecutar comandos.

12.5 Comandos útiles desde Windows PowerShell

Windows 10+ incluye el cliente OpenSSH, por lo que se puede trabajar desde PowerShell sin instalar software adicional:

ssh-keygen -t ed25519 -f C:\Users\usuario\.ssh\id_ed25519 -C "usuario@equipo"

ssh -i C:\Users\usuario\.ssh\id_ed25519 `
  -L 8080:intranet.local:80 `
  admin@bastion.midominio.com

El primer comando genera un par de claves Ed25519; el segundo establece un túnel local 8080 hacia un servidor interno a través de un bastion. PowerShell también permite usar scp o sftp con la misma clave.

12.6 Automatización con Python

La biblioteca Paramiko facilita ejecutar comandos remotos o transferir archivos dentro de scripts:

import paramiko

host = "192.168.0.10"
usuario = "deploy"
clave = "C:/Users/deploy/.ssh/id_ed25519"

cliente = paramiko.SSHClient()
cliente.set_missing_host_key_policy(paramiko.AutoAddPolicy())
cliente.connect(hostname=host, username=usuario, key_filename=clave)
stdin, stdout, stderr = cliente.exec_command("systemctl status nginx")
print(stdout.read().decode())
cliente.close()

Paramiko respeta las mismas claves y algoritmos de OpenSSH, por lo que se integra en pipelines de despliegue continuo para ejecutar comandos o recopilar logs en serie.

12.7 Puertos y versiones habituales

El puerto predeterminado de SSH es el 22/TCP, aunque algunas organizaciones adoptan puertos alternativos para reducir el ruido de escáneres automáticos. La siguiente tabla resume configuraciones comunes:

Configuración Propósito
22/TCP Puerto estándar compatible con herramientas y firewalls.
2022/TCP Alternativa usada en bastiones o clusters para separar accesos.
Versión SSHv2 Obligatoria para habilitar algoritmos modernos (ChaCha20, AES-GCM, Curve25519).

Independientemente del puerto, se recomienda habilitar solo ciphers seguros, desactivar contraseñas si es posible y registrar intentos fallidos mediante herramientas como Fail2ban.

12.8 Buenas prácticas y cierre

Mantener SSH protegido implica aplicar parches a OpenSSH, limitar usuarios permitidos, usar autenticación multifactor cuando esté disponible, habilitar AllowUsers o Match para separar roles, y establecer registros detallados para auditoría. También es recomendable rotar claves y aprovechar agentes como ssh-agent para gestionar passphrases sin exponerlas.

Con estas medidas, SSH continúa siendo una pieza esencial para la administración remota y la automatización segura de infraestructuras modernas.