Hardening avanzado de SSH: defensa contra fuerza bruta, túneles seguros y configuración enterprise
SSH es la puerta de entrada más utilizada para administrar servidores Linux y, por lo tanto, también uno de los vectores de ataque más frecuentes.
Un servicio SSH mal configurado puede permitir:
- Ataques de fuerza bruta
- Accesos no autorizados
- Movimientos laterales
- Escaladas de privilegios
- Robo de claves
En este artículo aprenderás a implementar un SSH Zero Trust, endurecido al máximo y adaptado a entornos empresariales o de alta seguridad.
1. Deshabilitar configuraciones inseguras por defecto
Edición del archivo:
1
|
sudo nano /etc/ssh/sshd_config
|
Desactivar login directo de root
Desactivar contraseñas
1
2
|
PasswordAuthentication no
KbdInteractiveAuthentication no
|
Limitar protocolos
Deshabilitar autenticación insegura
1
2
3
|
HostbasedAuthentication no
RhostsRSAAuthentication no
RSAAuthentication no
|
No es una medida de seguridad absoluta, pero reduce ruido, fuerza bruta y escaneo.
Abrir el puerto en el firewall
1
|
sudo ufw allow 2222/tcp
|
3. Claves SSH modernas y seguras
Generar claves modernas recomendadas (ed25519)
1
|
ssh-keygen -t ed25519 -a 200 -C "admin@server"
|
Alternativa segura (RSA 4096)
1
|
ssh-keygen -t rsa -b 4096 -o -a 200
|
Deshabilitar claves antiguas en sshd
1
|
PubkeyAcceptedKeyTypes=ssh-ed25519,ssh-rsa
|
4. Activar autenticación multifactor (MFA)
Mucho más seguro que claves solas.
Instalar Google Authenticator PAM
1
|
sudo apt install libpam-google-authenticator
|
Ejecutar configuración por usuario
Editar PAM
1
|
sudo nano /etc/pam.d/sshd
|
Añadir:
1
|
auth required pam_google_authenticator.so nullok
|
Habilitar MFA en sshd
1
|
ChallengeResponseAuthentication yes
|
5. Limitar accesos por usuario, grupo y IP
Acceso solo a usuarios concretos
1
|
AllowUsers admin deploy
|
Acceso por grupos
Acceso solo desde ciertas IP
1
2
|
Match Address 192.168.1.0/24
PasswordAuthentication no
|
6. Timeouts agresivos para romper ataques
1
2
3
|
LoginGraceTime 20
ClientAliveInterval 30
ClientAliveCountMax 2
|
Esto reduce sesiones colgadas y bots intentando conexiones masivas.
7. Cifrado moderno (Kex, MACs, Ciphers)
Reemplazar cifrados inseguros
1
2
3
|
KexAlgorithms curve25519-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512,hmac-sha2-256
|
Ver soportes del servidor
1
2
3
|
ssh -Q cipher
ssh -Q kex
ssh -Q mac
|
8. Mitigar fuerza bruta con Fail2Ban
Instalar
1
|
sudo apt install fail2ban -y
|
Configurar
1
|
sudo nano /etc/fail2ban/jail.local
|
1
2
3
4
5
|
[sshd]
enabled = true
maxretry = 3
bantime = 1h
findtime = 10m
|
Reiniciar
1
|
sudo systemctl restart fail2ban
|
9. Wazuh / OSSEC para análisis en tiempo real
Para detección avanzada:
- Cambios en archivos
- Intentos de acceso
- Fuerza bruta distribuida
- SSH hijacking
Instalación rápida Wazuh
1
2
|
curl -sO https://packages.wazuh.com/4.8/wazuh-agent.deb
sudo dpkg -i wazuh-agent.deb
|
10. Port knocking avanzado (port-knock)
Abre el puerto SSH solo tras enviar una secuencia de “golpes”.
Configuración con knockd
1
|
sudo apt install knockd
|
1
2
3
|
[options]
start_command = ufw allow 2222
stop_command = ufw deny 2222
|
11. SSH sobre WireGuard (Zero Trust real)
Crear túnel seguro
1
|
wg genkey | tee wg.key | wg pubkey > wg.pub
|
SSH limitado exclusivamente al túnel
1
|
ListenAddress 10.10.10.1:22
|
12. Registros avanzados con auditd
Instalar auditd
1
|
sudo apt install auditd
|
Auditar acceso a claves
1
|
auditctl -w /home/*/.ssh/ -p war -k ssh_keys
|
Auditar configuraciones
1
|
auditctl -w /etc/ssh/sshd_config -p wa -k ssh_config
|
13. Monitorizar intentos de fuerza bruta en tiempo real
Comando útil
1
|
sudo tail -f /var/log/auth.log
|
Detección con awk
1
|
awk '/Failed password/ {print $1,$2,$3,$11}' /var/log/auth.log
|
14. Reglas avanzadas de iptables
Limitar conexiones simultáneas
1
|
iptables -A INPUT -p tcp --syn --dport 2222 -m connlimit --connlimit-above 3 -j DROP
|
Limitar velocidad
1
|
iptables -A INPUT -p tcp --dport 2222 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 -j DROP
|
15. Verificación automática de integridad SSH
Script de autocomprobación
1
2
3
|
if ! sha256sum -c /etc/ssh/sshd_config.sha256; then
echo "⚠ CONFIG SSH ALTERADA"
fi
|
16. Proteger claves SSH del usuario
Permisos correctos
1
2
3
|
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
|
Evitar ssh-agent en memoria persistente
17. SSH con certificados (CA interna)
Método de autenticación enterprise.
Crear CA
1
|
ssh-keygen -f ssh_ca -t ed25519
|
Firmar claves
1
|
ssh-keygen -s ssh_ca -I usuario -n usuario id_ed25519.pub
|
Configurar servidor
1
|
TrustedUserCAKeys /etc/ssh/ca.pub
|
18. Evitar ataques MITM
Revisar fingerprint siempre
1
|
ssh-keyscan -H server.com >> ~/.ssh/known_hosts
|
Usar DNSSEC + SSHFP
1
|
ssh-keygen -r dominio.com
|
19. Buenas prácticas adicionales
- Deshabilitar SSHv1
- Usar logs remotos
- Usar banners legales
- Limitar SFTP
- Rotar claves automáticamente
- Bloquear países completos con geoip
- Autenticación por hardware (YubiKey)
20. Configuración final completa recomendada (sshd_config)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
Port 2222
Protocol 2
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication yes
Usedns no
LoginGraceTime 20
ClientAliveInterval 30
ClientAliveCountMax 2
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
KexAlgorithms curve25519-sha256
MACs hmac-sha2-512,hmac-sha2-256
AllowUsers admin
TrustedUserCAKeys /etc/ssh/ca.pub
|
Conclusión
Un SSH seguro no se basa en una sola medida, sino en un conjunto de capas:
- Cifrado moderno
- Autenticación fuerte
- Restricciones de acceso
- Firewalls
- Monitoreo
- Reglas antibruteforce
- Integridad del sistema
Implementar todo este hardening eleva tu servidor al nivel de seguridad requerido en infraestructuras críticas, empresas y entornos cloud modernos.
“La seguridad no es un estado, es un proceso continuo.”