DenyHosts

DenyHosts – El guardián simple y ligero para proteger el acceso SSH en servidores Linux

Descripción del programa DenyHosts

DenyHosts es un script escrito en Python que actúa como un guardián automático para servidores, con una única y clara misión: proteger el servicio SSH (Secure Shell) de ataques de fuerza bruta. Lanzado originalmente en 2005, se ha convertido en una herramienta clásica y muy popular entre los administradores que buscan una solución simple y ligera para proteger sus servidores Unix-like (Linux, BSD, macOS).

Si Fail2ban es una navaja suiza, DenyHosts es un cuchillo especialmente afilado para una sola tarea. Su funcionamiento es extremadamente directo: monitoriza el archivo de registro de autenticaciones fallidas (/var/log/auth.log o /var/log/secure). Cuando detecta un número configurable de intentos fallidos de inicio de sesión provenientes de una misma dirección IP, la añade al archivo /etc/hosts.deny.

Al hacer esto, el servidor dejará de aceptar cualquier conexión entrante desde esa IP, bloqueándola por completo antes de que siquiera pueda intentar autenticarse de nuevo. Su eficacia es tal que fue incluido por defecto en las políticas de seguridad de los servidores públicos de Fedora.

¿Necesitas una herramienta simple y efectiva para detener los ataques de diccionario contra el SSH de tu servidor, sin tener que lidiar con configuraciones complejas?

Características clave de DenyHosts

1. Enfoque exclusivo en la protección SSH

DenyHosts es una herramienta de propósito específico. A diferencia de Fail2ban, no está diseñado para analizar logs de Apache, FTP o cualquier otro servicio. Su singular concentración en el demonio sshd lo hace increíblemente fácil de configurar. Solo hay que indicarle qué archivo de log leer (generalmente /var/log/secure en Red Hat o /var/log/auth.log en Debian) y definir cuándo se debe considerar una IP como maliciosa.

2. Utiliza TCP Wrappers (/etc/hosts.deny)

DenyHosts se integra con la infraestructura de seguridad nativa de Linux a través de TCP Wrappers. Al escribir las IPs bloqueadas en /etc/hosts.deny, le está diciendo al sistema: «Para los servicios que estén configurados para usar TCP Wrappers, no permitas el acceso a estas direcciones».

Esta característica tiene la gran ventaja de que no depende de iptables (el cortafuegos), lo que simplifica su uso en sistemas donde gestionar reglas de cortafuegos es más complejo. Es tan simple como añadir una línea a un archivo de texto.

3. Sistema de sincronización central (Característica única)

Una de las características más singulares de DenyHosts es su capacidad para conectarse a un servidor central de sincronización. Cuando activas esta opción, tu servidor no solo bloquea a los atacantes en tu propia máquina, sino que comparte las direcciones IP de los atacantes con un repositorio central.

A cambio, tu servidor también descarga listas de IPs maliciosas detectadas por otros administradores. Esto crea una defensa colaborativa en tiempo real. Si un atacante acaba de intentar vulnerar otro servidor en la red, DenyHosts lo sabrá y lo bloqueará en el tuyo antes de que siquiera intente el primer ataque, actuando de forma proactiva.

4. Ligereza y simplicidad radical

Escrito en Python y diseñado para ser ejecutado como un demonio (servicio en segundo plano), DenyHosts apenas consume recursos. No tiene dependencias pesadas ni requiere reglas de expresiones regulares complejas para funcionar. Es una solución ideal para servidores más modestos o máquinas virtuales (VPS) con recursos limitados.

5. Panel de control integrado (en distribuciones como SME Server)

En ciertos entornos de servidor empresarial, como SME Server, DenyHosts cuenta con un panel de administración web integrado. Este panel permite gestionar las IPs bloqueadas, añadir excepciones y controlar el servicio directamente desde la interfaz gráfica del servidor. Aunque no es estándar en todas las distribuciones, es una muestra de su integración en ecosistemas de administración.

Explicación detallada del funcionamiento

El funcionamiento de DenyHosts es un ejemplo de la filosofía Unix: «Haz una cosa y hazla bien». Se ejecuta en segundo plano y sigue un flujo de trabajo continuo:

  1. Monitorización de Logs: El demonio denyhosts vigila en tiempo real el archivo de logs de autenticación (/var/log/auth.log).
  2. Detección de Fallos: Por cada intento fallido de inicio de sesión (por ejemplo, contraseña incorrecta o usuario inexistente), DenyHosts extrae la IP del origen y la registra en su base de datos interna.
  3. Evaluación del Umbral: Cuando una IP acumula un número determinado de fallos (maxretry) dentro de un periodo de tiempo (findtime), la herramienta la considera una amenaza.
  4. Bloqueo Automático: DenyHosts añade una entrada para esa IP maliciosa en el archivo /etc/hosts.deny. A partir de ese momento, el demonio SSH (sshd) rechazará cualquier conexión proveniente de ella.
  5. Caducidad del Bloqueo: Opcionalmente, se puede configurar un tiempo de expiración (purge_deny). Una vez transcurrido este tiempo, DenyHosts eliminará automáticamente la IP del archivo hosts.deny, liberándola.

Descarga e instalación de DenyHosts

  • Desarrollador Original: Phil Schwartz.
  • Mantenedor Actual: Comunidad Open Source (Proyecto en GitHub).
  • Página Oficial: http://denyhosts.sourceforge.net/.
  • Repositorio GitHub: https://github.com/denyhosts/denyhosts.
  • Versión Actual: 3.1.2 (actualizado en 2024).
  • Tamaño: Extremadamente reducido (el paquete fuente ronda los 50-100 KB).
  • Sistemas Operativos Compatibles: Linux (todas las distribuciones), FreeBSD, macOS, Solaris y otros sistemas Unix-like.
  • Licencia: GNU General Public License v2 (GPLv2) – Código abierto y gratuito.
  • Idioma: Inglés (logs y comandos).
  • Soporte técnico: Documentación oficial, listas de correo, GitHub Issues.

Instalación en Debian/Ubuntu:

sudo apt update
sudo apt install denyhosts

Instalación en Red Hat/CentOS/Rocky Linux (requiere EPEL):

sudo yum install epel-release
sudo yum install denyhosts

Instalación en FreeBSD:

pkg install denyhosts

El servicio se encuentra en el directorio /usr/local/etc/rc.d/denyhosts.

Cómo usar DenyHosts

Paso 1: Configuración inicial
DenyHosts se configura editando su archivo principal, que suele encontrarse en /etc/denyhosts.conf. Lo más recomendable es no tocar el original, sino copiar las líneas que se quieran modificar para personalizar el comportamiento. Los parámetros clave son:

sudo nano /etc/denyhosts.conf

Paso 2: Configurar parámetros básicos de bloqueo
Dentro del archivo de configuración, busca y ajusta los valores de SECURE_LOG, HOSTS_DENY, PURGE_DENY, BLOCK_SERVICE y los contadores:

# Ubicación del log de autenticación
SECURE_LOG = /var/log/auth.log

# Archivo donde se guardan las IPs bloqueadas
HOSTS_DENY = /etc/hosts.deny

# Tiempo que una IP permanecerá bloqueada (por ejemplo, 1 semana)
PURGE_DENY = 7d

# Servicio específico que se bloquea (si no se especifica, se bloquea todo)
BLOCK_SERVICE = sshd

# Número de fallos permitidos antes del bloqueo
MAXDENY = 5
# Tiempo en segundos para resetear el contador de fallos (20 minutos)
AGE_RESET = 20m

Paso 3: Configurar la sincronización (Opcional)
Para aprovechar la red de inteligencia colectiva, busca la sección [Synchronization] y actívala:

SYNC_SERVER = http://xmlrpc.denyhosts.net:9911
SYNC_INTERVAL = 1h

Paso 4: Iniciar y habilitar el servicio
Una vez configurado, activa el demonio para que proteja el sistema continuamente y se inicie con el arranque de la máquina:

sudo systemctl enable --now denyhosts

Paso 5: Gestionar IPs bloqueadas manualmente
Para desbloquear una IP (por ejemplo, si te bloqueaste a ti mismo accidentalmente), se debe editar directamente el archivo hosts.deny y luego reiniciar el servicio:

sudo nano /etc/hosts.deny

Localiza la línea correspondiente a tu IP y elimínala. Luego, reinicia DenyHosts:

sudo systemctl restart denyhosts

Observaciones sobre el programa DenyHosts

DenyHosts y Fail2ban suelen ser comparados constantemente. Para un servidor que solo necesita proteger el acceso SSH de sus usuarios, DenyHosts suele ser una opción más limpia y sencilla, mientras que Fail2ban es más versátil pero también más complejo.

Estado de Desarrollo y El Futuro (Deprecación)
Es importante señalar que, aunque DenyHosts sigue siendo funcional y está disponible en los repositorios (con versiones actualizadas en 2024 para FreeBSD), su desarrollo ha sido declarado «moribundo» (en estado de abandono) por sus mantenedores en Fedora. La razón principal es que las distribuciones modernas (Fedora, RHEL, CentOS 8+) están eliminando el soporte para TCP Wrappers (el sistema de /etc/hosts.deny).

Además, la versión oficial requiere Python 2, aunque existen forks y versiones beta que lo han adaptado a Python 3. Por todo ello, se recomienda evaluar la transición a Fail2ban o CrowdSec en sistemas operativos muy modernos.

Ventajas clave frente a Fail2ban:

  • Simplicidad: Su configuración es muy fácil de entender.
  • No depende de iptables: Al usar hosts.deny, evita tener que lidiar con reglas de cortafuegos.
  • Inteligencia Colaborativa: La sincronización con el servidor central de DenyHosts permite una defensa proactiva muy útil.

Limitaciones importantes

  • Limitado a SSH: No protege otros servicios (HTTP, FTP, etc.).
  • Dependencia de TCP Wrappers: Es ineficaz en sistemas modernos que lo han deshabilitado u omitido (muchas distribuciones Linux actuales).
  • Python 2: La versión oficial depende de Python 2 (aunque existen forks que lo han portado a Python 3).
  • No es reactivo a ataques complejos: No es útil contra DDoS ni ataques distribuidos.

Alternativa recomendada

Si buscas una alternativa moderna y con soporte activo a DenyHosts, la recomendación unánime en la industria es Fail2ban.

  • Fail2ban: Es el estándar de facto. Es mucho más flexible, permite proteger múltiples servicios, se integra perfectamente con iptables/firewalld y está en desarrollo activo, soportando Python 3. Es la opción a elegir si tu servidor ejecuta servicios web o de correo además de SSH.
  • CrowdSec: Una alternativa más moderna, con un enfoque colaborativo basado en Machine Learning y una comunidad global. Es ideal para quienes buscan un sistema de prevención de intrusiones de próxima generación y gratuito.

DenyHosts es una herramienta que cumplió un rol fundamental en la administración de sistemas durante casi dos décadas. Sigue siendo una opción excelente para estaciones de trabajo o servidores legacy donde el SSH es la única puerta de entrada al sistema y se busca una solución que simplemente funcione sin complejidades.

Sección FAQ

¿DenyHosts es gratis o de pago?

DenyHosts es completamente gratuito y de código abierto bajo la licencia GPLv2. No tiene versiones de pago ni funcionalidades bloqueadas. Puedes descargarlo, usarlo y modificarlo libremente.

¿Funciona en Linux, macOS, Windows 10 y Windows 11?

DenyHosts está diseñado exclusivamente para sistemas Unix-like como Linux, FreeBSD y macOS. No existe una versión nativa para Windows. Para proteger un servidor Windows, se recomiendan soluciones como RdpGuard.

¿Qué diferencia a DenyHosts de Fail2ban?

La principal diferencia es el alcance. DenyHosts es una herramienta de propósito específico para proteger exclusivamente SSH. Fail2ban es una herramienta multipropósito que puede proteger SSH, FTP, Apache, correo y prácticamente cualquier servicio que genere logs.

¿Puedo usar DenyHosts para proteger mi servidor web?

No. DenyHosts solo analiza los logs de autenticación del sistema (/var/log/auth.log o /var/log/secure), donde se registran los intentos de acceso SSH. Para proteger un servidor web (Apache, Nginx) contra ataques a WordPress o fuerza bruta a directorios, se necesitan herramientas como Fail2ban.

¿Qué ha pasado con el desarrollo de DenyHosts?

El desarrollo de DenyHosts se ha ralentizado significativamente y su estado se considera «moribundo» por los mantenedores de paquetes en distribuciones como Fedora. La razón principal es que las distribuciones modernas están abandonando TCP Wrappers, el mecanismo en el que se basa DenyHosts. Aunque el código fuente sigue disponible, se recomienda considerar alternativas como Fail2ban para nuevos proyectos. El repositorio en GitHub aún recibe mantenimiento.