Endurecer SSH: checklist práctico contra fuerza bruta y accesos indebidos
SSH es la puerta principal de tus servidores, y su configuración por defecto es un imán para la fuerza bruta: en cuanto abres el 22 a Internet empiezan a llover intentos de login automáticos. La buena noticia es que endurecerlo es rápido y casi todo cabe en un fichero: /etc/ssh/sshd_config.
sudo sshd -t (comprueba la sintaxis) y luego sudo systemctl reload ssh.
1. Claves, no contraseñas
Una contraseña se adivina por fuerza bruta; una clave de 256 bits, no. Genera un par moderno y copia la pública al servidor:
ssh-keygen -t ed25519 -C "tu-nombre@equipo"
ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@servidor
Comprueba que entras con la clave y desactiva las contraseñas en sshd_config:
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
2. Nada de root directo
Entrar como root por SSH quita el rastro de quién hizo qué y es el usuario que más se ataca. Entra con tu usuario y escala con sudo:
PermitRootLogin no
3. Restringe quién puede entrar
Por defecto puede intentar autenticarse cualquier usuario del sistema. Limítalo a los necesarios:
AllowUsers sergio deploy
# o por grupo:
AllowGroups ssh-users
4. Frena la fuerza bruta
Cambiar el puerto 22 solo reduce el ruido, no protege (es seguridad por oscuridad). Lo que de verdad ayuda:
- Firewall: expón SSH solo a las IPs que lo necesiten, o mételo detrás de una VPN o un bastión.
- fail2ban: banea IPs tras varios fallos. Es el estándar y se instala en dos comandos.
- Menos margen al atacante en
sshd_config:
MaxAuthTries 3
LoginGraceTime 20
MaxSessions 3
5. Cifrados modernos
Desactiva algoritmos antiguos y deja solo los robustos. Si no lo necesitas, apaga también los forwardings:
KexAlgorithms curve25519-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com
X11Forwarding no
AllowAgentForwarding no
ssh-keygen correctos y te da un checklist de auditoría del servidor.6. Doble factor
Para accesos sensibles, añade 2FA con libpam-google-authenticator (código TOTP además de la clave) o pasa a certificados SSH firmados por una CA interna, que caducan y evitan repartir claves sueltas.
7. Vigila
Endurecer no es «configurar y olvidar». Revisa los intentos en /var/log/auth.log (o journalctl -u ssh), y si tienes SIEM, crea una alerta por ráfagas de Failed password o logins fuera de horario desde IPs nuevas.
Checklist
- ✅ Claves ed25519,
PasswordAuthentication no - ✅
PermitRootLogin no - ✅
AllowUsers/AllowGroups - ✅ Firewall / VPN / bastión + fail2ban
- ✅
MaxAuthTries,LoginGraceTimeajustados - ✅ Cifrados modernos, forwardings apagados
- ✅ 2FA o certificados en accesos críticos
- ✅ Logs y alertas
Diez minutos de sshd_config convierten un servidor que recibe miles de intentos al día en uno donde la fuerza bruta simplemente no tiene por dónde entrar.