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):

  1. Genera un par de claves en tu máquina local:

    ssh-keygen -t ed25519 -C "[email protected]"
    
    • ed25519 es un algoritmo moderno y seguro con un tamaño de clave fijo. rsa también es común; si usas RSA, genera una clave grande como ssh-keygen -t rsa -b 4096.
  2. Copia la clave pública a tu servidor:

    ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@ip_de_tu_servidor
    

    Alternativamente, agrega manualmente el contenido de ~/.ssh/id_ed25519.pub a ~/.ssh/authorized_keys en el servidor para el usuario con el que deseas iniciar sesión.

  3. 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
    

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 en sshd_config.
    MaxAuthTries 3
    
  • LoginGraceTime: 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 30s
    
  • ClientAliveInterval y ClientAliveCountMax: Evitan que las sesiones SSH inactivas permanezcan abiertas indefinidamente. ClientAliveInterval envía un mensaje de keepalive cada X segundos. Si se pierden las respuestas de ClientAliveCountMax, se termina la conexión.
    ClientAliveInterval 300
    ClientAliveCountMax 2
    
  • Banner: Muestra un mensaje de advertencia antes de la autenticación. Esto sirve como aviso legal a posibles usuarios no autorizados.
    Banner /etc/issue.net
    
    Crea el archivo /etc/issue.net con 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.