¿Qué es SSH?

SSH, que significa "Secure Shell" (en español, "Consola Segura"), es un protocolo de red y un conjunto de utilidades que permiten a los usuarios acceder de forma segura a un sistema informático remoto a través de una red no segura, como Internet.

A diferencia de protocolos más antiguos como Telnet o FTP, que enviaban la información en texto plano, SSH cifra toda la comunicación entre el cliente (el ordenador desde el que te conectas) y el servidor (el ordenador al que te conectas). Esto significa que incluso si alguien intercepta los datos, no podrá leer la información, incluyendo nombres de usuario, contraseñas y los comandos que se ejecutan.

¿Para qué se utiliza SSH?

  • Administración remota de servidores: Es la herramienta principal para que los administradores de sistemas se conecten a servidores Linux, Unix y otros sistemas para realizar tareas de mantenimiento, configuración y solución de problemas.
  • Transferencia segura de archivos: A través de SSH se pueden utilizar protocolos como SCP (Secure Copy Protocol) y SFTP (SSH File Transfer Protocol) para copiar archivos de forma segura entre ordenadores.
  • Automatización de tareas: Se pueden crear scripts para automatizar la ejecución de comandos en servidores remotos.
  • Creación de túneles seguros: Permite crear "túneles" cifrados para proteger el tráfico de otras aplicaciones, como navegadores web o bases de datos, que de otro modo no estarían cifrados.

¿Cómo funciona SSH?

El protocolo SSH utiliza una arquitectura de cliente-servidor. Existen dos versiones principales del protocolo SSH:

  • SSH-1: La versión original, ahora obsoleta debido a vulnerabilidades de seguridad conocidas.
  • SSH-2: La versión actual y recomendada, que incluye mejoras significativas en seguridad y funcionalidad.

Componentes principales:

  • Cliente SSH: Es el programa que se ejecuta en tu ordenador para iniciar la conexión. Ejemplos populares son OpenSSH (incluido en la mayoría de los sistemas Linux y macOS) y PuTTY (para Windows).
  • Servidor SSH: Es el servicio que se ejecuta en el ordenador remoto y que está a la espera de conexiones entrantes. El más común es OpenSSH Server.
  • Puerto por defecto: SSH utiliza el puerto TCP 22 por defecto, aunque puede configurarse para usar otros puertos por motivos de seguridad.

Proceso de conexión:

  1. Negociación de versión: Cliente y servidor acuerdan qué versión de SSH usarán.
  2. Intercambio de claves: Se establece una clave de sesión compartida usando algoritmos de cifrado asimétrico.
  3. Autenticación: El cliente debe probar su identidad al servidor.
  4. Canal cifrado: Una vez autenticado, se crea un canal seguro para la comunicación.

Métodos de autenticación:

La autenticación se puede realizar de varias maneras, siendo las más comunes:

  • Contraseña: El usuario introduce su nombre de usuario y contraseña. Es simple pero menos seguro que otros métodos.
  • Claves SSH: Es el método más seguro. Implica un par de claves:
    • Clave privada: Se mantiene en el ordenador del usuario (nunca se comparte).
    • Clave pública: Se almacena en el servidor en el archivo ~/.ssh/authorized_keys.

    El servidor utiliza la clave pública para verificar que el cliente es quien dice ser, sin necesidad de enviar la contraseña a través de la red.

  • Autenticación basada en host: Permite conexiones basadas en la confianza entre hosts.
  • Autenticación multifactor: Combina varios métodos para mayor seguridad.

Instalación y configuración básica

En Linux/Ubuntu:

sudo apt update
sudo apt install openssh-server
sudo systemctl enable ssh
sudo systemctl start ssh

En CentOS/RHEL:

sudo yum install openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd

Archivos de configuración importantes:

  • /etc/ssh/sshd_config - Configuración del servidor SSH
  • /etc/ssh/ssh_config - Configuración del cliente SSH
  • ~/.ssh/config - Configuración personal del cliente
  • ~/.ssh/authorized_keys - Claves públicas autorizadas

Comandos SSH más utilizados

Conexión básica:

ssh usuario@hostname

Conexión a puerto específico:

ssh -p 2222 usuario@hostname

Transferencia de archivos:

scp archivo.txt usuario@servidor:/ruta/destino/
scp usuario@servidor:/ruta/archivo.txt .

Transferencia de archivos con SFTP:

sftp usuario@hostname

Ejecución de comandos remotos:

ssh usuario@servidor "ls -la /home"

Reenvío de puertos (Port Forwarding):

ssh -L 8080:localhost:80 usuario@servidor

Generación de claves SSH:

ssh-keygen -t rsa -b 4096 -C "tu-email@ejemplo.com"

Copia de clave pública al servidor:

ssh-copy-id usuario@servidor

Características avanzadas

SSH Agent:

El SSH Agent permite gestionar claves SSH y mantenerlas en memoria para conexiones más rápidas y convenientes.

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa

Configuración de hosts:

En ~/.ssh/config puedes definir configuraciones específicas para diferentes hosts:

Host servidor-produccion
    HostName 192.168.1.100
    User miusuario
    Port 22
    IdentityFile ~/.ssh/produccion_key

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

Túneles SSH (SSH Tunneling):

  • Local Port Forwarding: Acceder a un servicio remoto a través de un túnel seguro.
  • Remote Port Forwarding: Exponer un servicio local en un servidor remoto.
  • Dynamic Port Forwarding: Crear un proxy SOCKS para navegar de forma segura.

Hardening y mejores prácticas de seguridad

Configuración del servidor:

  • Cambiar el puerto por defecto (22) a uno no estándar
  • Deshabilitar el acceso root directo
  • Usar solo SSH-2
  • Limitar los usuarios que pueden conectarse
  • Configurar timeouts apropiados
  • Usar Fail2Ban para prevenir ataques de fuerza bruta

Mejores prácticas:

  • Siempre usar claves SSH en lugar de contraseñas
  • Usar frases de paso para proteger las claves privadas
  • Regularmente rotar las claves SSH
  • Monitorear los logs de SSH (/var/log/auth.log, /var/log/secure)
  • Usar ssh-audit para verificar la configuración de seguridad

Configuración de ejemplo segura:

Port 2222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
AllowUsers usuario1 usuario2
ClientAliveInterval 300
ClientAliveCountMax 0
MaxAuthTries 3
LoginGraceTime 20

Solución de problemas comunes

Problemas de conexión:

  • "Connection refused": El servidor SSH no está ejecutándose o el puerto está bloqueado por firewall
  • "Permission denied": Problemas de autenticación o permisos de archivos
  • "Host key verification failed": La clave del host ha cambiado (puede ser un ataque MITM)

Comandos de diagnóstico:

ssh -v usuario@servidor          # Modo verbose
nmap -p 22 servidor              # Verificar si el puerto está abierto
telnet servidor 22               # Probar conectividad básica
ssh-keyscan servidor             # Obtener fingerprint del host

Problemas con claves SSH:

  • Verificar permisos: chmod 600 ~/.ssh/id_rsa
  • Verificar permisos del directorio: chmod 700 ~/.ssh
  • Asegurarse de que el archivo authorized_keys tenga los permisos correctos

SSH en diferentes entornos

SSH en contenedores Docker:

docker run -d -p 2222:22 \
  -v /host/path:/home/user \
  --name ssh-container ssh-server-image

SSH en la nube (AWS, GCP, Azure):

  • Usar Security Groups para controlar el acceso
  • Implementar bastion hosts para acceso seguro
  • Usar AWS Systems Manager Session Manager como alternativa

SSH vs otras alternativas:

  • vs Telnet: SSH es cifrado, Telnet no lo es
  • vs RDP: SSH es más ligero y seguro para administración de servidores
  • vs VPN: SSH proporciona acceso remoto a nivel de aplicación, VPN a nivel de red