Configuración segura de SSH

Introducción

SSH es el servicio más expuesto en la mayoría de servidores Linux. Su configuración por defecto es funcional pero no es la más segura. Endurecer SSH es una de las primeras acciones de hardening a realizar en cualquier servidor de producción.

Fichero de configuración

La configuración del servidor SSH está en /etc/ssh/sshd_config. Tras cualquier cambio hay que recargar el servicio:


systemctl reload ssh       # Ubuntu 22.04+
systemctl reload sshd      # otras distribuciones
          

Siempre mantener abierta la sesión SSH actual mientras se prueba la nueva configuración. Si algo falla, la sesión abierta permite corregirlo.

Opciones recomendadas


# /etc/ssh/sshd_config

# Deshabilitar login directo como root
PermitRootLogin no

# Deshabilitar autenticación por contraseña (solo claves SSH)
PasswordAuthentication no
PermitEmptyPasswords no

# Restringir qué usuarios pueden conectarse
AllowUsers adminuser deploy

# Limitar intentos de autenticación fallidos
MaxAuthTries 3

# Cerrar sesiones inactivas
ClientAliveInterval 300
ClientAliveCountMax 2

# Deshabilitar reenvío X11 si no se necesita escritorio remoto
X11Forwarding no

# Deshabilitar reenvío de agente y TCP si no se usan
AllowAgentForwarding no
AllowTcpForwarding no

# Usar solo el protocolo SSH 2 (el 1 está obsoleto y es inseguro)
# En Ubuntu moderno esto ya es el comportamiento por defecto

# Cambiar el puerto (dificulta el escaneo automático, no es seguridad real)
Port 2222

# Limitar a qué interfaces escucha SSH
ListenAddress 0.0.0.0
          

Autenticación exclusiva por clave SSH

La autenticación por contraseña es vulnerable a ataques de fuerza bruta. El estándar en producción es usar solo claves SSH.


# En el cliente: generar par de claves (Ed25519 es el algoritmo recomendado)
ssh-keygen -t ed25519 -C "servidor-produccion"

# Copiar la clave pública al servidor
ssh-copy-id -i ~/.ssh/id_ed25519.pub adminuser@servidor

# O manualmente: añadir la clave pública al fichero authorized_keys del servidor
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh/
          

Una vez verificado que el acceso por clave funciona, deshabilitar PasswordAuthentication en sshd_config.

Algoritmos y cifrados recomendados

Para limitar SSH a algoritmos modernos y seguros, añadir a sshd_config:


# Algoritmos de intercambio de claves
KexAlgorithms curve25519-sha256,diffie-hellman-group14-sha256

# Cifrados simétricos
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com

# Códigos de autenticación de mensajes
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com

# Tipos de clave del host aceptados
HostKeyAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256
          

Verificar la configuración


# Comprobar sintaxis del fichero de configuración sin reiniciar
sshd -t

# Ver la configuración activa completa
sshd -T

# Auditar la configuración SSH con ssh-audit
apt install ssh-audit
ssh-audit localhost
          

Doble factor de autenticación (2FA)

Para mayor seguridad, se puede añadir un segundo factor con Google Authenticator o similar:


apt install libpam-google-authenticator

# Ejecutar como el usuario que usará SSH:
google-authenticator
# Responder "y" a todas las preguntas y guardar los códigos de emergencia

# Configurar PAM: añadir en /etc/pam.d/sshd
auth required pam_google_authenticator.so

# En sshd_config:
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
          

Con estas medidas — acceso solo por clave, root deshabilitado, intentos limitados y algoritmos modernos — la exposición de SSH queda drásticamente reducida. Combinado con fail2ban, el servidor estará bien protegido frente a ataques automatizados.

Rotación de logs

Índice de la sección

Índice del curso