7.6 Seguridad SSH Avanzada
tutorial.getReady
- Entenderás por qué SSH es el vector de ataque #1 en servidores expuestos a
internet. - Implementarás autenticación por clave pública eliminando
contraseñas del acceso remoto. - Endurecerás
/etc/ssh/sshd_configpara desactivar vectores de entrada peligrosos. - Aprenderás a proteger SSH confail2bancomo segunda línea de defensa automática.
SSH (Secure Shell) es la arteria vital que te conecta a tus servidores desde cualquier punto del planeta. También es la puerta que los bots automatizados bombardean sin descanso, los 365 días del año.
Un servidor Debian recién conectado a internet con el puerto 22 abierto recibirá sus primeros intentos de intrusión en menos de 60 segundos. No es exageración; es matemática de internet.
1. El Problema: Contraseñas como Único Factor
Sección titulada “1. El Problema: Contraseñas como Único Factor"La configuración por defecto de SSH acepta contraseñas. Esto significa que cualquier bot con un diccionario de millones de combinaciones puede probarlas todas, una a una, indefinidamente.
# Evidencia del ataque constante en logs realessudo journalctl -u ssh --since "1 hour ago" | grep "Failed password"# Jun 15 03:12:41 servidor sshd[1847]: Failed password for root from 185.234.219.45# Jun 15 03:12:43 servidor sshd[1849]: Failed password for root from 185.234.219.45# Jun 15 03:12:45 servidor sshd[1851]: Failed password for root from 185.234.219.45# (miles de líneas idénticas cada hora)La solución definitiva: eliminar las contraseñas del ecuación de SSH por completo.
2. Autenticación por Clave Pública
Sección titulada “2. Autenticación por Clave Pública"El sistema de claves asimétricas es la respuesta. Funciona como una cerradura y una llave:
- Clave privada: Tu llave física. Vive en tu portátil. Nunca se comparte.
- Clave pública: La cerradura. Se instala en cada servidor al que quieres entrar.
Un bot sin tu clave privada no puede entrar aunque pruebe billones de contraseñas. Punto.
Paso 1: Generar el par de claves (en tu máquina local)
Sección titulada “Paso 1: Generar el par de claves (en tu máquina local)"# Ed25519: el algoritmo moderno y recomendado (más seguro y rápido que RSA)ssh-keygen -t ed25519 -C "tu_email@dominio.com"
# El sistema te preguntará dónde guardar la clave (acepta el default):# /home/tuusuario/.ssh/id_ed25519 (privada) y id_ed25519.pub (pública)
# IMPORTANTE: Añade una passphrase para doble protección# Si alguien roba tu fichero de clave privada, aún necesita la passphrasePaso 2: Copiar la clave pública al servidor
Sección titulada “Paso 2: Copiar la clave pública al servidor"# Copia automáticamente la clave pública al servidorssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@ip_servidor
# Deberás introducir tu contraseña SSH por última vez# El comando añade tu clave a ~/.ssh/authorized_keys en el servidor# Ver el contenido de tu clave públicacat ~/.ssh/id_ed25519.pub
# En el servidor, crear el directorio .ssh y el fichero authorized_keysmkdir -p ~/.ssh && chmod 700 ~/.sshnano ~/.ssh/authorized_keys# Pega aquí el contenido de id_ed25519.pubchmod 600 ~/.ssh/authorized_keysPaso 3: Verificar antes de cerrar sesión
Sección titulada “Paso 3: Verificar antes de cerrar sesión"# Desde otra terminal (sin cerrar la sesión actual), prueba el acceso con clavessh -i ~/.ssh/id_ed25519 usuario@ip_servidor
# Si entras sin contraseña, el sistema funciona correctamente# Solo entonces continúa con el endurecimiento del sshd_config3. Endurecimiento de /etc/ssh/sshd_config
Sección titulada “3. Endurecimiento de /etc/ssh/sshd_config"Con las claves funcionando, el siguiente paso es eliminar todas las vías de entrada innecesarias:
# Editar la configuración del demonio SSHsudo nano /etc/ssh/sshd_configDirectivas críticas de seguridad
Sección titulada “Directivas críticas de seguridad"# =========================================================# ACCESO Y AUTENTICACIÓN# =========================================================
# Nunca permitas login directo como root# (usa sudo desde una cuenta de usuario normal)PermitRootLogin no
# Deshabilitar contraseñas completamente — solo claves# (hazlo SOLO después de verificar que tus claves funcionan)PasswordAuthentication no
# Rechazar cuentas sin contraseña configuradaPermitEmptyPasswords no
# Deshabilitar autenticación basada en host (método antiguo e inseguro)HostbasedAuthentication no
# =========================================================# LÍMITES Y TIMEOUTS# =========================================================
# Máximo de intentos de autenticación por conexiónMaxAuthTries 3
# Tiempo máximo para completar la autenticación (en segundos)LoginGraceTime 20
# Máximo de sesiones simultáneas por conexiónMaxSessions 3
# =========================================================# RESTRICCIONES ADICIONALES# =========================================================
# Deshabilitar reenvío X11 (escritorio gráfico remoto) si no lo usasX11Forwarding no
# Deshabilitar banner de versión SSH (no dar información al atacante)# DebianBanner no
# Puerto alternativo (oscuridad, no es seguridad real, pero reduce ruido)# Port 2222Aplicar los cambios
Sección titulada “Aplicar los cambios"# Verificar la sintaxis del fichero ANTES de reiniciarsudo sshd -t# Si no da errores, la sintaxis es correcta
# Reiniciar el servicio para aplicar cambiossudo systemctl restart ssh
# Verificar que el servicio arrancó correctamentesudo systemctl status ssh4. Fail2ban: La Segunda Línea de Defensa
Sección titulada “4. Fail2ban: La Segunda Línea de Defensa"Incluso con claves obligatorias, los bots siguen intentando conexiones y generando ruido en los logs. fail2ban monitoriza los logs en tiempo real y banea automáticamente IPs que muestran comportamiento de fuerza bruta:
# Instalar fail2bansudo apt install fail2ban
# Copiar la configuración por defecto (nunca edites jail.conf directamente)sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# Editar la configuración localsudo nano /etc/fail2ban/jail.localConfiguración básica para SSH
Sección titulada “Configuración básica para SSH"[DEFAULT]# Tiempo de ban en segundos (3600 = 1 hora)bantime = 3600
# Ventana de tiempo para contar intentos (600 = 10 minutos)findtime = 600
# Número de intentos fallidos antes del banmaxretry = 3
# Tu IP de gestión (nunca te banees a ti mismo)ignoreip = 127.0.0.1/8 ::1
[sshd]enabled = trueport = sshlogpath = /var/log/auth.logmaxretry = 3# Habilitar e iniciar fail2bansudo systemctl enable fail2bansudo systemctl start fail2ban
# Ver el estado y las IPs baneadas actualmentesudo fail2ban-client status sshd
# Desbanear una IP manualmente (si te baneaste tú mismo)sudo fail2ban-client set sshd unbanip 192.168.1.1005. Verificación del Estado Final
Sección titulada “5. Verificación del Estado Final"# Verificar configuración activa de sshdsudo sshd -T | grep -E "permitrootlogin|passwordauthentication|maxauthtries"
# Ver intentos de login fallidos en tiempo realsudo journalctl -u ssh -f
# Comprobar qué IPs están baneadas por fail2bansudo fail2ban-client status sshd
# Verificar que el puerto SSH escucha correctamentess -tlnp | grep :22Comprueba tus conocimientos
Sección titulada “Comprueba tus conocimientos"-
Un compañero junior acaba de configurar correctamente la autenticación por clave pública en el servidor de producción. Emocionado, ejecuta
PasswordAuthentication noensshd_configy reinicia el servicio SSH. Dos minutos después te llama diciendo que no puede entrar al servidor. ¿Cuál fue probablemente su error? -
Tu servidor recibe ataques de fuerza bruta constantes en el puerto 22 que saturan los logs. Ya tienes autenticación por clave pública activada y contraseñas deshabilitadas. ¿Qué herramienta añadirías como segunda capa de defensa para banear automáticamente las IPs atacantes?
-
¿Cuál es la diferencia clave entre
PermitRootLogin noyPasswordAuthentication noensshd_config?