Mejores prácticas para reforzar la seguridad de SSH en servidores Linux
Secure Shell (SSH) es la columna vertebral de la administración remota para prácticamente todos los servidores Linux. Aunque es increíblemente potente y generalmente seguro desde el principio, SSH es también el objetivo principal de actores maliciosos que intentan obtener acceso no autorizado mediante ataques de fuerza bruta, ataques de diccionario y relleno de credenciales (credential stuffing).
Reforzar su configuración SSH es posiblemente el paso más crítico al asegurar una nueva implementación de Linux. Al implementar algunas prácticas esenciales, yendo más allá de la simple autenticación de nombre de usuario y contraseña, puede reducir drásticamente su superficie de ataque, minimizar el ruido en sus registros y garantizar que solo los usuarios autorizados que utilicen métodos seguros puedan acceder a su sistema.
Esta guía describe los pasos esenciales y procesables para asegurar el servicio SSH en cualquier distribución de Linux, centrándose en el archivo de configuración principal: /etc/ssh/sshd_config.
Prerrequisito: Copia de seguridad de la configuración
Antes de realizar cualquier cambio en la configuración del demonio SSH (sshd_config), es fundamental crear una copia de seguridad. Una configuración incorrecta puede bloquearle el acceso a su servidor. Pruebe siempre exhaustivamente los cambios.
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak_$(date +%F)
Después de editar el archivo, compruebe la sintaxis antes de reiniciar el servicio:
sudo sshd -t
Si la prueba es satisfactoria, puede reiniciar el servicio SSH de forma segura (el comando varía según la distribución):
# Para sistemas que usan systemd (la mayoría de las distribuciones modernas)
sudo systemctl restart sshd
1. Deshabilitar el inicio de sesión como root
Permitir el inicio de sesión directo como usuario root es uno de los mayores riesgos de seguridad. Si un atacante logra descifrar una contraseña por fuerza bruta, obtiene instantáneamente el control total del sistema. En su lugar, los usuarios que no son root deben iniciar sesión primero y elevar privilegios usando sudo.
Paso de configuración
Abra /etc/ssh/sshd_config y localice la directiva PermitRootLogin. Cambie su valor a no.
# Antes:
# PermitRootLogin yes
# Después (Mejor práctica):
PermitRootLogin no
Nota importante
Asegúrese de haber creado y configurado al menos un usuario estándar con privilegios
sudoantes de deshabilitar el inicio de sesión de root. De lo contrario, se le bloqueará el acceso administrativo.
2. Implementar la autenticación obligatoria basada en claves
La autenticación por contraseña es susceptible a ataques de fuerza bruta y de diccionario. Las claves SSH, que consisten en una clave pública (en el servidor) y una clave privada (en el cliente), ofrecen una seguridad significativamente mayor debido a su extrema complejidad y longitud.
A. Generar e instalar claves
- Generar el par de claves (en su máquina cliente local):
bash ssh-keygen -t ed25519 -C "[email protected]" - Copiar la clave pública (al servidor):
bash ssh-copy-id -i ~/.ssh/id_ed25519 user@your_server_ip
B. Deshabilitar la autenticación por contraseña
Una vez que confirme que puede iniciar sesión correctamente utilizando su clave SSH, deshabilite por completo la autenticación por contraseña.
# Deshabilitar contraseñas
PasswordAuthentication no
# Asegurar que las claves estén habilitadas
PubkeyAuthentication yes
Mejor práctica: Utilice tipos de clave fuertes como Ed25519 o RSA de 4096 bits. Proteja siempre la clave privada con una contraseña segura.
3. Cambiar el puerto SSH predeterminado (Defensa en profundidad)
El puerto SSH predeterminado (puerto TCP 22) es escaneado constantemente por bots automatizados. Cambiar el puerto a un número alto y no estándar (por ejemplo, 2222, 22222 o superior a 30000) reduce significativamente la cantidad de ruido en los registros de su servidor y lo hace invisible para los escáneres casuales.
Paso de configuración
En /etc/ssh/sshd_config, cambie la directiva Port:
# Antes:
# Port 22
# Después (Puerto no estándar de ejemplo):
Port 22222
Advertencia: Ajuste del cortafuegos requerido
Si cambia el puerto, debe actualizar su cortafuegos (por ejemplo,
iptables,firewalldo Grupos de Seguridad de AWS) para permitir el tráfico en el nuevo puerto. No hacerlo resultará en una pérdida inmediata de conexión.
Ejemplo usando firewalld (CentOS/RHEL):
sudo firewall-cmd --permanent --add-port=22222/tcp
sudo firewall-cmd --reload
4. Limitar el acceso a usuarios y grupos específicos
Para aplicar un control de acceso estricto, debe definir explícitamente qué usuarios o grupos están autorizados a conectarse a través de SSH. Esto limita los posibles puntos de entrada, incluso si una cuenta está comprometida o no se utiliza.
Directivas de configuración
Utilice una o ambas de las siguientes directivas en sshd_config:
- Permitir usuarios específicos:
config AllowUsers alice bob - Permitir grupos específicos:
config AllowGroups sshaccess admins
Si estas directivas están presentes, cualquier usuario o grupo no incluido explícitamente se le negará el acceso.
5. Aplicar protocolos y cifrados más estrictos
Asegúrese de estar utilizando el moderno y seguro Protocolo SSH 2 y fuerce el uso de cifrados criptográficos y Códigos de Autenticación de Mensajes (MACs) fuertes.
Pasos de configuración
Verifique que los protocolos heredados y vulnerables estén deshabilitados:
Protocol 2
# Denegar métodos de autenticación heredados inseguros
HostbasedAuthentication no
IgnoreRhosts yes
Si bien las implementaciones modernas de SSH a menudo están bien configuradas por defecto, definir explícitamente cifrados y MACs fuertes puede prevenir ataques de degradación. Un conjunto mínimo recomendado incluye:
Ciphers [email protected],[email protected]
MACs hmac-sha2-512,hmac-sha2-256
6. Implementar limitación de velocidad e detección de intrusiones (Fail2Ban)
Incluso con autenticación basada en claves, la sondeo continuo por parte de bots consume recursos y satura los registros. Fail2Ban es una herramienta crítica que monitorea los registros en busca de intentos de inicio de sesión fallidos (u otra actividad sospechosa) y ajusta dinámicamente el cortafuegos para prohibir temporal o permanentemente la dirección IP de origen.
Pasos generales de instalación y configuración
-
Instalar Fail2Ban:
```bash
# Debian/Ubuntu
sudo apt update && sudo apt install fail2banRHEL/CentOS/Fedora
sudo dnf install fail2ban
`` 2. **Configurar la 'cárcel' (Jail) SSH:** Fail2Ban utiliza configuraciones llamadas 'jails'. La 'jail'sshdpredeterminada es muy eficaz para monitorear/var/log/auth.log` (o equivalente) en busca de fallos repetidos en el servicio SSH y aplicar automáticamente prohibiciones temporales. -
Asegurar que el servicio se esté ejecutando:
bash sudo systemctl enable fail2ban sudo systemctl start fail2ban
Fail2Ban mitiga significativamente los intentos automatizados de fuerza bruta y se considera obligatorio para los servidores accesibles desde Internet.
7. Otras directivas esenciales para reforzar SSH
Estos ajustes menores ayudan a administrar sesiones y reducen la posible ventana de ataque:
| Directiva | Valor recomendado | Propósito |
|---|---|---|
ClientAliveInterval |
300 | Envía un paquete nulo cada 300 segundos (5 minutos) para mantener la sesión activa. |
ClientAliveCountMax |
3 | Número máximo de comprobaciones de 'vida' fallidas antes de la desconexión (15 minutos de tiempo inactivo total). |
UsePAM |
yes | Habilita los Módulos de Autenticación Conectables (PAM) para políticas de seguridad adicionales del sistema local. |
PermitEmptyPasswords |
no | Prohíbe que los usuarios con contraseñas vacías inicien sesión (debería ser no por defecto). |
Resumen de la lista de verificación de refuerzo
Utilice esta lista de verificación para asegurarse de que su servidor cumple con los estándares básicos de refuerzo de SSH:
- [ ] Realizar una copia de seguridad de
sshd_configantes de realizar cambios. - [ ] Establecer
PermitRootLogin no. - [ ] Establecer
PasswordAuthentication no(después de configurar las claves). - [ ] Cambiar el
Porta un valor no estándar. - [ ] Actualizar el cortafuegos para permitir el nuevo puerto.
- [ ] Usar
AllowUsersoAllowGroupspara restringir el acceso. - [ ] Establecer
Protocol 2. - [ ] Instalar y configurar Fail2Ban.
- [ ] Comprobar la configuración con
sshd -tantes de reiniciar.
Al implementar estas mejores prácticas, transforma SSH de un posible pasivo a un canal de administración remota altamente seguro.