SSH (Secure Shell)¶
📖 Definición¶
SSH (Secure Shell) es un protocolo de red criptográfico que permite acceder y administrar equipos remotos a través de una red no confiable, garantizando confidencialidad, integridad y autenticación. Por defecto escucha en el puerto 22/TCP.
Fue creado en 1995 por Tatu Ylönen tras un ataque de captura de contraseñas en la red de su universidad, con el fin de sustituir protocolos que enviaban credenciales en texto claro, como Telnet, rlogin o FTP. La versión actual, SSH-2, está estandarizada en las RFC 4251 a 4254, y la implementación más extendida es OpenSSH.
Además del acceso a una terminal remota, SSH permite transferir archivos (SFTP, SCP), crear túneles y reenviar puertos (port forwarding), y autenticar operaciones automatizadas (Git, Ansible, copias de seguridad).
Nota importante
SSH cifra el canal, pero no vuelve seguro un servidor mal configurado. Un servicio SSH expuesto a Internet con contraseñas débiles es uno de los vectores de ataque más comunes (fuerza bruta, credential stuffing). Además, cambiar el puerto 22 no es una medida de seguridad real, solo reduce el ruido en los registros.
⚙️ ¿Cómo funciona? / Principios fundamentales¶
Una conexión SSH sigue una arquitectura cliente-servidor y se establece en varias fases:
- Negociación de versión y algoritmos: cliente y servidor acuerdan la versión del protocolo y los algoritmos de intercambio de claves, cifrado, MAC y firma.
- Intercambio de claves y autenticación del servidor: se genera una clave de sesión compartida (por ejemplo, con Diffie-Hellman de curva elíptica). El servidor se identifica con su clave de host, que el cliente verifica contra el archivo
known_hostspara detectar suplantaciones (ataques man-in-the-middle). - Autenticación del usuario: el cliente demuestra su identidad mediante contraseña, clave pública/privada (recomendado), certificados SSH o autenticación multifactor.
- Canal cifrado y multiplexado: una vez autenticado, se abre una sesión interactiva, una transferencia de archivos o un túnel, todo dentro del canal cifrado.
Métodos de autenticación habituales:
| Método | Seguridad | Observaciones |
|---|---|---|
| Contraseña | Baja | Vulnerable a fuerza bruta y reutilización de credenciales |
| Clave pública | Alta | Requiere proteger la clave privada con passphrase |
| Certificados SSH | Alta | Escalable en entornos grandes, con caducidad y revocación |
| Clave pública + MFA | Muy alta | Recomendado para accesos privilegiados |
🎯 Ejemplo práctico o escenario de demostración¶
Configuración del servidor OpenSSH (/etc/ssh/sshd_config) en un servidor expuesto a Internet.
Acceso de root con contraseña, sin límite de intentos y con funciones innecesarias activas:
# /etc/ssh/sshd_config (configuración insegura)
PermitRootLogin yes
PasswordAuthentication yes
PermitEmptyPasswords yes
MaxAuthTries 20
X11Forwarding yes
# Sin restricción de usuarios ni de origen
Un atacante puede lanzar fuerza bruta contra root desde cualquier lugar y, si acierta, obtiene control total del sistema.
Solo claves públicas, sin acceso directo de root y con superficie reducida:
# /etc/ssh/sshd_config (configuración bastionada)
PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
MaxAuthTries 3
LoginGraceTime 30
AllowUsers admin deploy
X11Forwarding no
AllowTcpForwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
LogLevel VERBOSE
Generación de una clave moderna en el cliente y verificación de la configuración antes de recargar:
ssh-keygen -t ed25519 -a 100 -C "usuario@equipo"
ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@servidor
sudo sshd -t && sudo systemctl reload sshd
Antes de desactivar contraseñas
Comprueba en otra sesión abierta que el acceso con clave funciona, o podrías bloquearte el acceso al servidor.
🛡️ Medidas de mitigación y buenas prácticas¶
- Autenticación por clave pública: desactivar las contraseñas y proteger las claves privadas con passphrase.
- Deshabilitar el acceso directo de root: entrar con un usuario sin privilegios y elevar con
sudo. - Restringir usuarios y orígenes: usar
AllowUsers/AllowGroupsy limitar el acceso por IP con cortafuegos. - MFA: añadir un segundo factor (TOTP, llaves FIDO2) en accesos privilegiados.
- Protección frente a fuerza bruta: limitar intentos (
MaxAuthTries) y usar herramientas como Fail2ban o reglas de limitación de conexiones. - No exponer SSH a Internet: acceder mediante VPN, un bastión (jump host) o soluciones de acceso Zero Trust.
- Algoritmos modernos: desactivar cifrados y MAC obsoletos, y mantener OpenSSH actualizado.
- Reducir funciones innecesarias: desactivar
X11ForwardingyAllowTcpForwardingsi no se usan. - Gestión de claves: rotar y revocar claves, auditar
authorized_keysy evitar claves compartidas. - Registro y monitorización: centralizar logs (
LogLevel VERBOSE) en un SIEM y alertar sobre intentos fallidos masivos o accesos inusuales. - Verificar claves de host: confirmar la huella en la primera conexión para evitar suplantaciones.