Guía completa para securizar el servicio SSH en servidores Linux, reduciendo la superficie de ataque frente a fuerza bruta, acceso no autorizado y escuchas.
# Ruta principal:
/etc/ssh/sshd_config
# Tras cada cambio, reiniciar el servicio:
systemctl restart sshd
# o
service ssh restart
# En /etc/ssh/sshd_config:
Port 2222 # Cambiar de 22 a otro puerto (1024-65535)
# Conectarse con el nuevo puerto:
ssh -p 2222 usuario@servidor
PermitRootLogin no
# Opciones: yes | no | without-password | forced-commands-only
# Generar par de claves en el cliente:
ssh-keygen -t ed25519 -C "mi_clave_segura"
# o RSA 4096:
ssh-keygen -t rsa -b 4096
# Copiar clave pública al servidor:
ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@servidor
# En sshd_config del servidor:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# Deshabilitar autenticación por contraseña (solo claves):
PasswordAuthentication no
ChallengeResponseAuthentication no
# Solo usuarios específicos:
AllowUsers usuario1 usuario2
# Solo grupos específicos:
AllowGroups sshusers admins
# Denegar usuarios específicos:
DenyUsers root oracle mysql
# Tiempo máximo para autenticarse:
LoginGraceTime 30
# Máximo de intentos de autenticación:
MaxAuthTries 3
# Máximo de sesiones simultáneas por conexión:
MaxSessions 3
# Desactivar reenvío X11 (si no es necesario):
X11Forwarding no
# Desactivar reenvío de agente SSH:
AllowAgentForwarding no
# Desactivar túneles TCP:
AllowTcpForwarding no
# Deshabilitar autenticación GSSAPI:
GSSAPIAuthentication no
# Banner de advertencia:
Banner /etc/ssh/banner.txt
# Solo algoritmos modernos (en sshd_config):
KexAlgorithms curve25519-sha256,diffie-hellman-group14-sha256
Ciphers aes256-gcm@openssh.com,chacha20-poly1305@openssh.com
MACs hmac-sha2-512,hmac-sha2-256
# Verificar configuración sin reiniciar:
sshd -T | grep -E "kexalgorithms|ciphers|macs"
apt install fail2ban
# Configuración en /etc/fail2ban/jail.local:
[sshd]
enabled = true
port = 2222 # Puerto SSH configurado
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 # Intentos antes de bloquear
bantime = 3600 # Segundos de bloqueo (1 hora)
findtime = 600 # Ventana de tiempo (10 min)
# Reiniciar Fail2Ban:
systemctl restart fail2ban
# Ver IPs bloqueadas:
fail2ban-client status sshd
| Medida | Parámetro | Valor recomendado |
|---|---|---|
| Puerto no estándar | Port | ≠ 22 |
| Sin login root | PermitRootLogin | no |
| Solo claves públicas | PasswordAuthentication | no |
| Tiempo de gracia | LoginGraceTime | 30 |
| Máx. intentos | MaxAuthTries | 3 |
| Sin X11 | X11Forwarding | no |
| Fail2Ban activo | maxretry | 3 intentos / 1h ban |