10 Prácticas Esenciales para Endurecer su Servidor SSH

Asegure su entorno de acceso remoto de inmediato con esta guía completa para el endurecimiento de servidores SSH. Descubra 10 mejores prácticas críticas, incluyendo cambiar el puerto predeterminado, deshabilitar la autenticación de root y contraseña en favor de las claves SSH, e implementar reglas de firewall robustas. Aprenda cómo limitar el acceso de usuarios, utilizar frases de contraseña seguras y desplegar Fail2Ban para la protección contra ataques de fuerza bruta. Consejos esenciales sobre cómo mantener el software actualizado y monitorear los registros completan esta guía práctica, asegurando que sus servidores estén protegidos contra ataques comunes y acceso no autorizado.

37 vistas

10 Prácticas Esenciales para Fortalecer su Servidor SSH

Secure Shell (SSH) es la columna vertebral de la administración remota de servidores, ya que proporciona un protocolo de red criptográfico para la comunicación segura de datos, la ejecución remota de comandos y otros servicios de red. Sin embargo, su naturaleza ubicua también lo convierte en un objetivo principal para los atacantes. Un servidor SSH inadecuadamente protegido puede abrir una vulnerabilidad crítica, lo que lleva a accesos no autorizados, filtraciones de datos y compromiso del sistema. Proteger su entorno de acceso remoto no es solo una buena práctica; es una necesidad.

Este artículo describe 10 prácticas esenciales para fortalecer la configuración de su servidor SSH. Al implementar estas directivas de configuración críticas, la configuración de permisos recomendada y consejos de seguridad, puede reforzar significativamente las defensas de su servidor contra el acceso no autorizado y vectores de ataque comunes como los intentos de fuerza bruta y el relleno de credenciales. Seguir estas pautas ayudará a garantizar que su administración remota permanezca segura y que la infraestructura de su servidor esté protegida.

1. Cambiar el Puerto Predeterminado de SSH

El puerto predeterminado de SSH es 22. Este es universalmente conocido y constantemente escaneado por bots automatizados que buscan servidores vulnerables. Cambiar el puerto predeterminado proporciona una capa de ofuscación 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, edite el archivo sshd_config, que generalmente se encuentra en /etc/ssh/sshd_config.

sudo nano /etc/ssh/sshd_config

Busque la línea Port 22 (o agréguela si no existe) y cambie 22 por un número de puerto no estándar y no asignado (por ejemplo, 2222, 49152-65535 son puertos dinámicos/de usuario).

#Port 22
Port 2222

Después de guardar el archivo, reinicie el servicio SSH. Recuerde actualizar las reglas de su firewall para permitir el tráfico en el nuevo puerto y bloquear el anterior.

sudo systemctl restart sshd
# Para UFW (Uncomplicated Firewall):
sudo ufw allow 2222/tcp
sudo ufw deny 22/tcp
sudo ufw reload
# Para Firewalld:
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --remove-port=22/tcp
sudo firewall-cmd --reload

Consejo: Siempre mantenga al menos una sesión SSH abierta mientras prueba los cambios de configuración. Si se queda fuera, puede revertir los cambios en la sesión activa.

2. Deshabilitar el Inicio de Sesión de Root

El inicio de sesión directo de root a través de SSH no es recomendable. El usuario root tiene privilegios ilimitados, lo que lo convierte en un objetivo principal para los atacantes. Si un atacante obtiene acceso de root, tiene control total sobre su sistema. En su lugar, inicie sesión como un usuario regular sin privilegios y luego use sudo para realizar tareas administrativas.

En sshd_config, encuentre la directiva PermitRootLogin y establézcala en no.

PermitRootLogin no

Guarde y reinicie 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 su máquina local. Solo los clientes con la clave privada coincidente pueden autenticarse.

Pasos para implementar la autenticación basada en claves (brevemente):

  1. Generar un par de claves en su máquina local:
    bash ssh-keygen -t ed25519 -b 4096 -C "[email protected]"
    • ed25519 es un algoritmo moderno y seguro. rsa también es común, a menudo con -b 4096 para la solidez de la clave.
  2. Copiar la clave pública a su servidor:
    bash ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your_server_ip
    Alternativamente, agregue manualmente el contenido de ~/.ssh/id_ed25519.pub a ~/.ssh/authorized_keys en el servidor para el usuario con el que desea iniciar sesión.
  3. Asegurar los permisos correctos en el servidor:

    • Directorio ~/.ssh: 700 (rwx solo para el propietario)
    • Archivo ~/.ssh/authorized_keys: 600 (rw solo para el propietario)

    bash chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys

4. Deshabilitar la Autenticación por Contraseña

Una vez que haya configurado y probado con éxito la autenticación basada en claves para todos los usuarios necesarios, debe deshabilitar completamente la autenticación por contraseña. Esto elimina el eslabón más débil en la seguridad de SSH al hacer imposibles los ataques de fuerza bruta de contraseñas.

En sshd_config, establezca PasswordAuthentication en no.

PasswordAuthentication no

Guarde y reinicie el servicio SSH:

sudo systemctl restart sshd

Advertencia: Nunca deshabilite 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, corre el riesgo de bloquearse 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. Puede restringir el acceso SSH solo a usuarios o grupos específicos, minimizando la superficie de ataque.

Utilice las directivas AllowUsers o AllowGroups en sshd_config.

Para permitir solo usuarios específicos (ej. adminuser, devuser):

AllowUsers adminuser devuser

Para permitir solo a los miembros de un grupo específico (ej. sshusers):

AllowGroups sshusers

Consejo: Generalmente es mejor usar AllowGroups si tiene varios usuarios. Cree un grupo dedicado para el acceso SSH y agregue los usuarios autorizados a él.

sudo groupadd sshusers
sudo usermod -aG sshusers adminuser
sudo usermod -aG sshusers devuser

Después de realizar los cambios, guarde y reinicie SSH.

6. Usar Frases de Contraseña Fuertes para las Claves SSH

Aunque la autenticación basada en claves es robusta, su clave privada sigue siendo un activo crítico. Si un atacante obtiene acceso a su máquina local, podría robar su clave privada. Una frase de contraseña fuerte cifra su clave privada, requiriendo la frase de contraseña para desbloquearla antes de usarla. Esto añade otra capa de seguridad, protegiendo su clave incluso si cae en las manos equivocadas.

Al generar su clave SSH (como en el paso 3), se le solicitará una frase de contraseña. Elija una frase de contraseña larga, compleja y memorable que sea diferente de cualquier otra contraseña que utilice.

7. Implementar Limitación de Tasa de Conexión (Fail2Ban)

Incluso con autenticación basada en claves, un servidor SSH todavía está sujeto a intentos de conexión. Herramientas como Fail2Ban pueden monitorear activamente los registros de 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 utilizando reglas de firewall por un período determinado.

Instalación (ejemplo para Debian/Ubuntu):

sudo apt update
sudo apt install fail2ban

Fail2Ban funciona directamente con las reglas predeterminadas de SSH, pero puede personalizar su configuración copiando jail.conf a jail.local y editándola.

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Dentro de jail.local, puede ajustar bantime, findtime y maxretry para la sección [sshd].

[sshd]
enabled = true
port = 2222 # Su nuevo puerto SSH
logpath = %(sshd_log)s
maxretry = 3
bantime = 1h # Bloquear durante 1 hora
findtime = 10m # Buscar 3 fallos en 10 minutos

Reinicie Fail2Ban después de los cambios de configuración:

sudo systemctl restart fail2ban

8. Mantener Actualizado el Software del Servidor SSH

Las vulnerabilidades del software se descubren y parchean constantemente. Ejecutar software de demonio SSH (OpenSSH) desactualizado significa que podría estar expuesto a exploits conocidos. Actualizar periódicamente el software de su 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

Configure su sistema para aplicar actualizaciones de seguridad automáticamente cuando sea apropiado, o establezca una rutina para actualizaciones manuales.

9. Monitorear los Registros de SSH en Busca de Actividad Sospechosa

Incluso con medidas preventivas sólidas, la vigilancia es clave. Revise periódicamente los registros de autenticación de SSH para detectar patrones inusuales, intentos de inicio de sesión fallidos o intentos de acceso no autorizados. Esto le ayuda a identificar posibles brechas o ataques en curso.

Los registros de SSH se encuentran típicamente en:

  • /var/log/auth.log (Debian/Ubuntu)
  • /var/log/secure (CentOS/RHEL)
  • Usando journalctl (sistemas systemd):
    bash sudo journalctl -u sshd -f

Busque intentos de autenticación fallidos repetidos, inicios de sesión desde direcciones IP inusuales o inicios de sesión exitosos por parte de usuarios desconocidos. Herramientas como Logwatch o Elastic Stack (ELK) pueden automatizar el análisis de registros y las alertas para entornos más grandes.

10. Configurar Reglas de Firewall para Restringir el Acceso

Un firewall es su primera línea de defensa. Por defecto, debe bloquear todo el tráfico entrante, excepto por los servicios que necesita exponer explícitamente. Para SSH, esto significa permitir conexiones solo en el puerto elegido (ej. 2222) y, idealmente, solo desde direcciones IP o redes de confianza específicas.

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 administra un servidor desde una dirección IP dinámica, tenga cuidado con las reglas de firewall estrictas. Es posible que deba permitir el acceso desde un rango más amplio o utilizar una VPN.

Consejos Adicionales de Fortalecimiento

Además de los 10 esenciales, considere 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 (ej. 3) reduce las posibilidades de fuerza bruta. Se configura en sshd_config.
    config MaxAuthTries 3
  • LoginGraceTime: Limita el tiempo permitido para que un usuario se autentique. El valor predeterminado es de 2 minutos. Reducirlo (ej. 30s) reduce la ventana para ataques lentos.
    config LoginGraceTime 30s
  • ClientAliveInterval y ClientAliveCountMax: Evita que las sesiones SSH inactivas permanezcan abiertas indefinidamente. ClientAliveInterval envía un paquete nulo cada X segundos. Si se pierden ClientAliveCountMax (predeterminado 3) respuestas, la conexión se termina.
    config ClientAliveInterval 300 ClientAliveCountMax 0 # Deshabilita la comprobación de vida del cliente si desea que las sesiones persistan indefinidamente
  • Banner: Muestra un mensaje de advertencia antes de la autenticación. Esto sirve como aviso legal para posibles usuarios no autorizados.
    config Banner /etc/issue.net
    Cree el archivo /etc/issue.net con el mensaje de advertencia deseado.

Conclusión

Fortalecer su servidor SSH es un proceso continuo, no una configuración única. Al implementar estas 10 prácticas esenciales, desde cambiar los puertos predeterminados y deshabilitar el inicio de sesión de root hasta aplicar la autenticación basada en claves e implementar firewalls, usted establece una postura de seguridad robusta para su acceso remoto. Recuerde siempre probar los cambios cuidadosamente, mantener sus sistemas actualizados y monitorear periódicamente los registros en busca de cualquier actividad sospechosa. La vigilancia constante es clave para mantener un entorno de administración remota seguro y confiable.

Estas prácticas son fundamentales para cualquier administrador de servidores y reducirán significativamente su exposición a amenazas cibernéticas comunes, salvaguardando la infraestructura de su servidor contra accesos no autorizados y posibles compromisos.