Skip to content

Introducción

El protocolo SSH es una herramienta fundamental para la administración remota de servidores, pero si no se configura adecuadamente, puede convertirse en un punto vulnerable para accesos no autorizados. Este capítulo está diseñado para administradores de sistemas y profesionales de TI que desean fortalecer la seguridad de sus servidores SSH.

Objetivos

Esta sección tiene como propósito:

  • Reconocer los potenciales puntos de falla en un servidor ssh.
  • Reducir los riesgos y proteger el acceso remoto de manera robusta.

Incrementar la Seguridad de un servidor SSH

Uso de Llaves

El uso de llaves SSH en lugar de contraseñas mejora significativamente la seguridad del servidor. Las llaves públicas y privadas permiten una autenticación más robusta, reduciendo el riesgo de ataques de fuerza bruta.

Crear el archivo para guardar las llaves y definir permisos:

mkdir ~/.ssh
touch ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Algoritmos recomendados:

Tipo de Clave Tamaño de Clave Velocidad (Firma/Verificación) Nivel de Seguridad Uso Recomendado Notas Comando
RSA 2048–4096 bits Más lenta Moderado–Alto Compatibilidad/Legado Muy compatible, claves grandes ssh-keygen -t rsa -b 4096
ED25519 256 bits Muy rápida Alto (~128 bits) Uso moderno de SSH Pequeñas, rápidas, muy seguras ssh-keygen -t ed25519
ED448 456 bits Rápida Muy alto (~224 bits) Entornos de alta seguridad Más nueva, menos soporte en sistemas ssh-keygen -t ed448

Generar las llaves:

ssh-keygen -t ed448
Enter file in which to save the key (/home/student/.ssh/id_ed448): ssh_key
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Copiar la llave pública a la configuración ssh.

cat ssh_key.pub >> ~/.ssh/authorized_keys

sudo vi /etc/ssh/sshd_config
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2

Reiniciar el servicio:

sudo systemctl restart ssh

Verificar que la conexión funcione correctamente desde el cliente:

ssh -i <ssh_key.priv> <USUARIO>@<IP>

Si funciona correctamente eliminar la configuración anterior:

sudo vi /etc/ssh/sshd_config
PasswordAuthentication no
PermitEmptyPasswords no

Reiniciar el servicio:

sudo systemctl restart ssh

Deshabilitar Root Login

En la gran mayoría de casos se debería limitar la conexión a su usuario asignado, y especialmente bloquear el acceso a Root. Esto se puede hacer fácilmente desde la configuración:

sudo vi /etc/ssh/sshd_config
PermitRootLogin no

Reiniciar el servicio:

sudo systemctl restart ssh

Deshabilitar Protocolos Viejos de SSH

*Solo en sistemas modernos

Ess recomendable deshabilitar algoritmos criptográficos obsoletos para reforzar la seguridad del servidor SSH. Al especificar algoritmos seguros como curve25519-sha256 para el intercambio de claves, aes256-gcm para cifrado y hmac-sha2-256 para integridad, se reducen las vulnerabilidades frente a ataques criptográficos conocidos.

sudo vi /etc/ssh/sshd_config
KexAlgorithms curve25519-sha256@libssh.org
Ciphers aes256-gcm@openssh.com,aes256-ctr
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-256

Reiniciar el servicio:

sudo systemctl restart ssh

Activar Logging

Para poder monitorear intentos de acceso sospechosos y potencialmente bloquear IPs de forma manual, se puede activar logging dentro de la configuración de ssh.

sudo vi /etc/ssh/sshd_config
SyslogFacility AUTH
LogLevel INFO

Definir permisos:

chmod 640 /var/log/secure

Reiniciar el servicio:

sudo systemctl restart ssh

Limitar a usuarios y/o IPs

Si se trata de un servidor para uso dentro de una empresa o un equipo conocido, se recomienda limitar el servidor a únicamente permitir conexiones con usuarios dentro de la misma red IP, o IPs fijas si se encuentran en redes distintas y se conocen.

Esto reduce la flexibilidad pero drásticamente mejora la seguridad.

Alternativamente se pueden implementar otras herramientas como fail2ban, demostrándose posteriormente.

Limitar desde la configuración

  • Limitar a usuarios >
    sudo vi /etc/ssh/sshd_config
    
    >>
    AllowUsers <user1> <user2> # etc...
    
  • Limitar a usuarios en IP fija >
    sudo vi /etc/ssh/sshd_config
    
    >>
    AllowUsers <user1>@<IP1> <user2>@<IP2> # etc...
    
sudo systemctl restart ssh

Limitar utilizando la Firewall

sudo firewall-cmd --state
sudo firewall-cmd --list-all

Permitir acceso las máquinas en la subred 192.168.1.x * Agregar los protocolos (puertos) deseados: * Protocolo ssh

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="22" protocol="tcp" accept'
* Protocolo http
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="80" protocol="tcp" accept'
etc...

Ignorar el cualquier otro tráfico entrante:

sudo firewall-cmd --set-default-zone=drop

Aplicar los cambios:

sudo firewall-cmd --reload

Verificar:

sudo firewall-cmd --list-all --zone=drop

Herramienta de Monitoreo Fail2ban

Fail2ban es una herramienta de seguridad que protege el servidor contra ataques de fuerza bruta y accesos no autorizados mediante el monitoreo de archivos de registro. Cuando detecta múltiples intentos fallidos de inicio de sesión, bloquea automáticamente la dirección IP atacante utilizando reglas de firewall. Es principalmente útil si el servidor esta expuesto y no está limitado a un set de IPs.

en ciertos sistemas es necesario instalar: sudo dnf install epel-release
*si aún no es posible intentar:
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
dnf repolist

sudo dnf install fail2ban -y
  • Usar configuración por defecto *(recomendado):

    Copiar la configuración:

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

    Buscar [sshd] y agregar la linea enabled = true:

    sudo vi /etc/fail2ban/jail.local
    
    [sshd]
    enabled = true
    
  • Usar configuración por personalizada:

    Crear archivo de configuración:

    sudo touch /etc/fail2ban/jail.local
    
    Definir la configuración.

    sudo vi /etc/fail2ban/jail.local
    
    [DEFAULT]
    ignoreip = 127.0.0.1/8 ::1
    bantime  = 10m
    findtime  = 10m
    maxretry = 5
    backend = systemd
    
    [sshd]
    enabled = true
    port = ssh
    logpath = %(sshd_log)s
    
sudo systemctl enable --now fail2ban

Verificar estado:

fail2ban-client status
Salida esperada:
| - Number of Jail: 1
` - Jail list: sshd

Más detalle:

fail2ban-client status sshd

Ver logs:

sudo tail -f /var/log/fail2ban.log

Conclusión

SSH es una herramienta ampliamente utilizada y de gran utilidad. Para su uso y configuración correcta se han abordado prácticas esenciales para mitigar riesgos, como el uso de llaves en lugar de contraseñas, la desactivación del acceso root, la eliminación de protocolos antiguos, la habilitación de registros de auditoría, la restricción por usuarios o direcciones IP, y la integración de herramientas de monitoreo como Fail2ban.

Además de estas medidas, se recomienda aplicar técnicas adicionales de hardening, como la modificación del puerto por defecto de SSH y el remapeo de puertos expuestos, lo cual puede reducir significativamente la exposición a escanéos automatizados y ataques por fuerza bruta.