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