10 Prácticas Esenciales para Reforzar tu Servidor SSH
Refuerza tu servidor SSH con autenticación más segura, acceso de mínimo privilegio, reglas de firewall, limitación de velocidad, actualizaciones y revisión de registros.
10 Prácticas Esenciales para Reforzar tu Servidor SSH
Secure Shell (SSH) suele ser la puerta de entrada a tu servidor. Si esa puerta acepta contraseñas débiles, inicios de sesión directos como root o tráfico de todo internet, los atacantes la encontrarán rápidamente.
Esta guía te proporciona 10 pasos prácticos para reforzar tu servidor SSH que puedes aplicar a OpenSSH en distribuciones comunes de Linux. Mantén una sesión de trabajo abierta mientras pruebas cada cambio para poder recuperarte si una regla de firewall o una edición de configuración bloquea nuevos inicios de sesión.
1. Cambiar el Puerto SSH por Defecto
El puerto SSH por defecto es 22. Esto es universalmente conocido y constantemente escaneado por bots automatizados que buscan servidores vulnerables. Cambiar el puerto por defecto proporciona una capa de oscuridad simple pero efectiva. Aunque no es una medida de seguridad por sí sola, reduce significativamente el ruido de los escaneos automatizados y ayuda a evitar muchos ataques oportunistas.
Para cambiar el puerto, edita el archivo sshd_config, que generalmente se encuentra en /etc/ssh/sshd_config.
sudo nano /etc/ssh/sshd_config
Busca la línea Port 22 (o agrégala si no existe) y cambia 22 a un número de puerto no estándar y no asignado (por ejemplo, 2222, 49152-65535 son puertos de usuario/dinámicos).
#Port 22
Port 2222
Antes de reiniciar SSH, permite el nuevo puerto en tu firewall. Luego prueba un nuevo inicio de sesión en el nuevo puerto antes de eliminar el acceso al puerto 22.
# Para UFW (Uncomplicated Firewall):
sudo ufw allow 2222/tcp
sudo ufw reload
# Para Firewalld:
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo sshd -t
sudo systemctl restart sshd
Consejo: Siempre mantén al menos una sesión SSH abierta mientras pruebas cambios de configuración. Si te quedas bloqueado, puedes revertir los cambios en la sesión activa.
2. Deshabilitar el Inicio de Sesión como Root
El inicio de sesión directo como root a través de SSH está muy desaconsejado. El usuario root tiene privilegios ilimitados, lo que lo convierte en un objetivo principal para los atacantes. Si un atacante obtiene acceso como root, tiene control total sobre tu sistema. En su lugar, inicia sesión como un usuario normal sin privilegios y luego usa sudo para realizar tareas administrativas.
En sshd_config, busca la directiva PermitRootLogin y establécela en no.
PermitRootLogin no
Guarda y reinicia el servicio SSH:
sudo systemctl restart sshd
3. Usar Autenticación Basada en Claves
La autenticación basada en contraseñas es susceptible a ataques de fuerza bruta y ataques de diccionario, especialmente si los usuarios eligen contraseñas débiles. La autenticación basada en claves SSH es una alternativa mucho más segura. Utiliza un par de claves criptográficas: una clave pública almacenada en el servidor y una clave privada guardada en tu máquina local. Solo los clientes con la clave privada correspondiente pueden autenticarse.
Pasos para implementar la autenticación basada en claves (brevemente):
Genera un par de claves en tu máquina local:
ssh-keygen -t ed25519 -C "[email protected]"ed25519es un algoritmo moderno y seguro con un tamaño de clave fijo.rsatambién es común; si usas RSA, genera una clave grande comossh-keygen -t rsa -b 4096.
Copia la clave pública a tu servidor:
ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@ip_de_tu_servidorAlternativamente, agrega manualmente el contenido de
~/.ssh/id_ed25519.puba~/.ssh/authorized_keysen el servidor para el usuario con el que deseas iniciar sesión.Asegura los permisos correctos en el servidor:
- Directorio
~/.ssh:700(rwx solo para el propietario) - Archivo
~/.ssh/authorized_keys:600(rw solo para el propietario)
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys- Directorio
4. Deshabilitar la Autenticación por Contraseña
Una vez que hayas configurado y probado correctamente la autenticación basada en claves para todos los usuarios necesarios, debes deshabilitar completamente la autenticación por contraseña. Esto elimina el eslabón más débil en la seguridad SSH al hacer imposibles los ataques de fuerza bruta por contraseña.
En sshd_config, establece PasswordAuthentication en no.
PasswordAuthentication no
KbdInteractiveAuthentication no
En algunas distribuciones, la autenticación PAM o interactiva por teclado aún puede solicitar contraseñas a menos que también la deshabilites. Prueba con un terminal nuevo antes de cerrar tu sesión existente.
Guarda y reinicia el servicio SSH:
sudo systemctl restart sshd
Advertencia: Nunca deshabilites la autenticación por contraseña antes de verificar que la autenticación basada en claves funciona correctamente para todos los usuarios que necesitan acceso. De lo contrario, corres el riesgo de quedarte bloqueado fuera del servidor.
5. Limitar el Acceso de Usuarios
Por defecto, cualquier cuenta de usuario en el servidor puede intentar iniciar sesión a través de SSH. Puedes restringir el acceso SSH solo a usuarios o grupos específicos, minimizando la superficie de ataque.
Usa las directivas AllowUsers o AllowGroups en sshd_config.
Para permitir solo usuarios específicos (por ejemplo, adminuser, devuser):
AllowUsers adminuser devuser
Para permitir solo miembros de un grupo específico (por ejemplo, sshusers):
AllowGroups sshusers
Consejo: Generalmente es mejor usar AllowGroups si tienes múltiples usuarios. Crea un grupo dedicado para acceso SSH y agrega usuarios autorizados a él.
sudo groupadd sshusers
sudo usermod -aG sshusers adminuser
sudo usermod -aG sshusers devuser
Después de hacer cambios, guarda y reinicia SSH.
6. Usar Frases de Contraseña Fuertes para las Claves SSH
Aunque la autenticación basada en claves es robusta, tu clave privada sigue siendo un activo crítico. Si un atacante obtiene acceso a tu máquina local, podría robar tu clave privada. Una frase de contraseña fuerte cifra tu clave privada, requiriendo la frase de contraseña para desbloquearla antes de usarla. Esto agrega otra capa de seguridad, protegiendo tu clave incluso si cae en manos equivocadas.
Al generar tu clave SSH (como en el paso 3), se te pedirá una frase de contraseña. Elige una frase de contraseña larga, compleja y memorable que sea diferente de cualquier otra contraseña que uses.
7. Implementar Limitación de Velocidad de Conexión (Fail2Ban)
Incluso con autenticación basada en claves, un servidor SSH sigue sujeto a intentos de conexión. Herramientas como Fail2Ban pueden monitorear activamente los registros SSH en busca de intentos de inicio de sesión fallidos repetidos desde la misma dirección IP y bloquear automáticamente esa dirección IP usando reglas de firewall durante un período determinado.
Instalación (ejemplo para Debian/Ubuntu):
sudo apt update
sudo apt install fail2ban
Fail2Ban funciona de inmediato con reglas SSH predeterminadas, pero puedes personalizar su configuración copiando jail.conf a jail.local y editándolo.
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
Dentro de jail.local, puedes ajustar bantime, findtime y maxretry para la sección [sshd].
[sshd]
enabled = true
port = 2222 # Tu nuevo puerto SSH
logpath = %(sshd_log)s
maxretry = 3
bantime = 1h
findtime = 10m
Reinicia Fail2Ban después de los cambios de configuración:
sudo systemctl restart fail2ban
8. Mantener Actualizado el Software de tu Servidor SSH
Las vulnerabilidades de software se descubren y parchean constantemente. Ejecutar software de demonio SSH (OpenSSH) desactualizado significa que podrías estar expuesto a exploits conocidos. Actualizar regularmente el software de tu servidor, incluido el paquete del servidor OpenSSH, es crucial para parchear vulnerabilidades de seguridad.
# Para Debian/Ubuntu:
sudo apt update && sudo apt upgrade
# Para CentOS/RHEL:
sudo yum update
# o
sudo dnf update
Configura tu sistema para aplicar actualizaciones de seguridad automáticamente cuando sea apropiado, o establece una rutina para actualizaciones manuales.
9. Monitorear los Registros SSH en Busca de Actividad Sospechosa
Incluso con medidas preventivas robustas, la vigilancia es clave. Revisa regularmente los registros de autenticación SSH para detectar patrones inusuales, intentos de inicio de sesión fallidos o intentos de acceso no autorizados. Esto te ayuda a identificar posibles brechas o ataques en curso.
Los registros SSH generalmente se encuentran en:
/var/log/auth.log(Debian/Ubuntu)/var/log/secure(CentOS/RHEL)- Usando
journalctl(sistemas systemd):sudo journalctl -u sshd -f
Busca intentos de autenticación fallidos repetidos, inicios de sesión desde direcciones IP inusuales o inicios de sesión exitosos por usuarios desconocidos. Herramientas como Logwatch o Elastic Stack (ELK) pueden automatizar el análisis de registros y la alerta para entornos más grandes.
10. Configurar Reglas de Firewall para Restringir el Acceso
Un firewall es tu primera línea de defensa. Por defecto, debe bloquear todo el tráfico entrante excepto los servicios que necesitas exponer explícitamente. Para SSH, esto significa permitir conexiones solo en tu puerto elegido (por ejemplo, 2222) e, idealmente, solo desde direcciones IP o redes específicas de confianza.
Ejemplo usando UFW (Uncomplicated Firewall):
Permitir SSH desde una dirección IP específica 192.168.1.100 en el puerto 2222:
sudo ufw allow from 192.168.1.100 to any port 2222
Permitir SSH desde una subred específica 192.168.1.0/24:
sudo ufw allow from 192.168.1.0/24 to any port 2222
Ejemplo usando Firewalld (CentOS/RHEL):
Permitir SSH desde una dirección IP específica 192.168.1.100 en el puerto 2222:
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port=2222 protocol="tcp" accept'
sudo firewall-cmd --reload
Advertencia: Si estás administrando un servidor desde una dirección IP dinámica, ten cuidado con reglas de firewall estrictas. Es posible que necesites permitir el acceso desde un rango más amplio o usar una VPN.
Consejos Adicionales de Reforzamiento
Más allá de los 10 esenciales, considera estas directivas para una seguridad aún mayor:
MaxAuthTries: Limita el número de intentos de autenticación por conexión. El valor predeterminado es 6. Reducirlo (por ejemplo,3) disminuye las posibilidades de fuerza bruta. Establecer ensshd_config.MaxAuthTries 3LoginGraceTime: Limita el tiempo permitido para que un usuario se autentique. El valor predeterminado es 2 minutos. Reducirlo (por ejemplo,30s) reduce la ventana para ataques lentos.LoginGraceTime 30sClientAliveIntervalyClientAliveCountMax: Evitan que las sesiones SSH inactivas permanezcan abiertas indefinidamente.ClientAliveIntervalenvía un mensaje de keepalive cada X segundos. Si se pierden las respuestas deClientAliveCountMax, se termina la conexión.ClientAliveInterval 300 ClientAliveCountMax 2Banner: Muestra un mensaje de advertencia antes de la autenticación. Esto sirve como aviso legal a posibles usuarios no autorizados.
Crea el archivoBanner /etc/issue.net/etc/issue.netcon tu mensaje de advertencia deseado.
Conclusión Práctica
Comienza con los cambios que eliminan el mayor riesgo: deshabilitar el inicio de sesión como root, requerir claves SSH, restringir quién puede conectarse y limitar las redes de origen cuando sea posible. Prueba cada cambio con sshd -t y una nueva sesión de inicio de sesión antes de cerrar tu sesión actual.