Introducción a OpenSSH
OpenSSH es la implementación más utilizada del protocolo Secure Shell (SSH) en sistemas Linux y otros Unix-like. Proporciona un canal cifrado para acceder remotamente a máquinas, transferir archivos y ejecutar comandos de forma segura.
Breve historia
OpenSSH nació en 1999 como una bifurcación libre del proyecto original SSH, desarrollado por Tatu Ylönen. Su objetivo era ofrecer una alternativa libre de patentes y con licencia BSD, lo que ha facilitado su adopción en prácticamente todas las distribuciones Linux.
Instalación en las distribuciones más populares
- Debian / Ubuntu:
sudo apt-get update && sudo apt-get install openssh-server openssh-client - Fedora:
sudo dnf install openssh-server openssh-client - RHEL / CentOS:
sudo yum install openssh-server openssh-client(en versiones recientes usar dnf) - Arch Linux:
sudo pacman -S openssh - openSUSE:
sudo zypper install openssh
Configuración básica del daemon sshd
El archivo de configuración principal se encuentra en /etc/ssh/sshd_config. Algunas directivas esenciales son:
Port 22– define el puerto de escucha (se puede cambiar a un puerto no estándar para reducir ruido).PermitRootLogin prohibit-password– impide el login directo de root con contraseña, obligando al uso de claves.PasswordAuthentication no– desactiva la autenticación por contraseña tras configurar claves SSH.AllowUsers usuario1 usuario2– limita el acceso a ciertos usuarios.
Tras modificar el archivo, recargue el servicio con:
sudo systemctl reload sshd
Generación y gestión de claves SSH
El par de claves se crea con ssh-keygen. Por ejemplo:
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519 -C 'comentario opcional'
Luego copie la clave pública al servidor remoto:
ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@servidor
Es recomendable proteger la clave privada con una frase de paso fuerte.
Uso del cliente SSH
Para conectarse:
ssh -i ~/.ssh/id_ed25519 usuario@servidor
Transferencia de archivos con scp y sftp:
scp archivo.local usuario@servidor:/ruta/remota/
sftp usuario@servidor
Tunelización y reenvío de puertos
OpenSSH permite crear túneles seguros:
- Reenvío local:
ssh -L 8080:localhost:80 usuario@servidor– accede a un servicio web interno mediante localhost:8080. - Reenvío remoto:
ssh -R 9000:localhost:3000 usuario@servidor– expone un servicio local en el servidor. - Reenvío dinámico (SOCKS proxy):
ssh -D 1080 usuario@servidor– configura un proxy SOCKS para navegar de forma segura.
Mejores prácticas de seguridad
- Mantener OpenSSH actualizado mediante los repositorios de la distribución.
- Utilizar algoritmos de clave fuertes (ed25519 o RSA ≥ 4096 bits).
- Desactivar la autenticación por contraseña después de establecer claves.
- Implementar fail2ban o similar para bloquear intentos de fuerza bruta.
- Revisar periódicamente el archivo
/var/log/auth.log(Debian/Ubuntu) o/var/log/secure(RHEL) para detectar accesos sospechosos. - Limitar el acceso por IP usando
tcpwrapperso reglas deiptables/nftables.
Solución de problemas comunes
- Error “Permission denied (publickey)”. Verifique que la clave pública esté en
~/.ssh/authorized_keysdel usuario remoto y que los permisos de la carpeta.sshsean 700 y del archivo 600. - Conexión rechazada: asegúrese de que el daemon sshd esté en ejecución (
systemctl status sshd) y que no haya un firewall bloqueando el puerto. - Latencia alta: compruebe que no haya reenvío de X11 innecesario (
-x) y que la MTU esté adecuada.
OpenSSH y automatización
Muchas herramientas de gestión de configuración como Ansible, Chef y Puppet dependen de SSH para ejecutar tareas remotas. En Ansible, el módulo ping verifica la conectividad mediante una conexión SSH. Es recomendable usar un usuario dedicado con claves SSH y restringir su acceso mediante AllowUsers en sshd_config.
Certificados SSH y autoridad de certificación (CA)
En lugar de gestionar miles de claves públicas individuales, se puede crear una autoridad de certificación que firme claves de usuarios. El servidor confía en la CA y acepta cualquier clave firmada por ella. Esto simplifica la rotación de claves y reduce la carga de administración. Para generar una CA:
ssh-keygen -f ~/.ssh/ca -t ed25519 -N ''
Luego firme una clave de usuario:
ssh-keygen -s ~/.ssh/ca -I id_ejemplo -V +52w:~1d ~/.ssh/id_ed25519.pub
El archivo resultante id_ed25519-cert.pub se envía al usuario y el servidor debe tener la opción TrustedUserCAKeys ~/.ssh/ca.pub en su configuración.
Uso de ssh-agent y reenvío de agente
El agente SSH mantiene las claves privadas en memoria para evitar teclear la frase de paso cada vez. Se inicia con eval $(ssh-agent) y se añaden claves con ssh-add. El reenvío de agente (ssh -A) permite que un salto intermedio use las credenciales del cliente original, útil en arquitecturas de bastion.
Auditoría y registro de conexiones
OpenSSH registra cada intento de conexión en /var/log/auth.log (Debian/Ubuntu) o /var/log/secure (RHEL). Para un seguimiento más detallado, se puede habilitar el registro de nivel VERBOSE en sshd_config con LogLevel VERBOSE. Además, herramientas como last and utmpdump permiten inspeccionar quién ha accedido y desde dónde.
OpenSSH en contenedores y entornos de alta disponibilidad
En contenedores Docker, es común ejecutar un servidor SSH solo para depuración, aunque se recomienda evitarlo en producción por razones de seguridad. Si se necesita, se puede usar una imagen mínima como ubuntu:22.04 y instalar openssh-server, exponiendo el puerto 2222 y mapeándolo al host. En clústeres de servidores, un balanceador de carga como HAProxy puede distribuir las conexiones SSH entre varios nodos, mejorando la tolerancia a fallos.
Conclusión
OpenSSH sigue siendo la piedra angular de la administración remota segura en entornos Linux. Su combinación de cifrado fuerte, flexibilidad de configuración y amplio soporte lo convierte en una herramienta indispensable para administradores, desarrolladores y cualquier profesional que necesite acceder a sistemas de forma segura. Siguiendo las prácticas descritas en este artículo podrá instalar, configurar y usar OpenSSH con confianza, minimizando riesgos y maximizando productividad.