Abusive HTTP Watch
Abusive HTTP Watch es un daemon OpenBSD ligero que sigue en tiempo
real el access log del servidor web, detecta probes HTTP maliciosas a
partir de un conjunto curado de tokens y escribe las IPs de origen en
un fichero que puede ser consumido directamente por el firewall
(p. ej. pf). En producción activa protegiendo tiendas online.
| Propiedad | Valor |
|---|---|
| Versión | 2.1.2 |
| Plataforma | OpenBSD (integración con RC script) |
| Lenguaje | Perl 5 (solo biblioteca estándar) |
| Caso de uso | Endurecimiento de tiendas online |
| Estado | En producción |
flowchart LR
A[Logs del servidor web] --> B[Coincidencia de patrón]
B --> C{"¿Umbral alcanzado?"}
C -->|Sí| D[Regla PF de bloqueo]
C -->|No| A
D --> E[(Tabla de bloqueo)]
E -->|TTL expirado| F[Liberación automática]
De qué se trata
Las tiendas online y los sitios web en producción son sondeados de
manera continua en busca de vulnerabilidades — exploits PHP, probes de
login de WordPress, lookups de /etc/passwd, traversal, SQLi,
inyección de null-byte. Estas probes dejan un patrón claro de tokens
en el access log, independientemente del código HTTP devuelto.
Abusive HTTP Watch sigue el log de forma continua, evalúa cada línea
contra un conjunto preciso de tokens y escribe las IPs con hits
repetidos en una blocklist append-only que encaja directamente en
tablas pf de OpenBSD, directivas Require de Apache o listas deny
de nginx.
Categorías de detección
El conjunto de tokens apunta a clases de ataques que aparecen demostrablemente en los logs de producción — deliberadamente conservador para evitar falsos positivos.
- Explotación PHP —
allow_url_include,auto_prepend_file,php://input,eval( - Probes WordPress —
wp-admin,wp-login.phpy variantes - Path traversal —
../..y codificaciones comunes - Rutas sensibles —
.env,.git,.svn,id_rsa,/etc/passwd - Intentos RCE / CGI —
cgi-bin,?cmd=,=shell,eval( - Inyección SQL —
or 1=1y variantes conservadoras - Probes de bucle de login — parámetros
back=cascadeados, incluyendo URL-encoded - Inyección null-byte —
%00en URI
Funcionalidades operativas
- 🔄 Resistente a la rotación de logs — Detecta tanto la rotación (cambio de inodo) como el copytruncate (
pos > size) y se recupera sin perder líneas. - 🌍 Dual stack — Soporte nativo IPv4 e IPv6 incluyendo whitelisting por CIDR (p. ej.
203.0.113.0/24,2001:db8::/32). - 🛡️ Solo IPs públicas — Las direcciones privadas RFC 1918, link-local, loopback, multicast y espacio compartido se omiten automáticamente.
- 🎯 Matching con alcance — Por petición, el matching se restringe a
request,user-agenty opcionalmentereferrer. El scope referrer está desactivado por defecto para evitar bloqueos drive-by vía páginas de terceros. - 🔒 Actualizaciones atómicas de la blocklist —
flock(LOCK_EX)al escribir, dedup en memoria previene duplicados tras reinicios. - 📋 Whitelist con prioridad —
/etc/abusive_http_whitelistacepta IPs sueltas o CIDRs que siempre se dejan pasar. - ⏳ Umbral de hits — Una IP solo entra en la blocklist tras
MIN_HITShits (por defecto 3) — protege contra singletons accidentales. - 📡 Integración con syslog — Eventos estructurados (
tag,facility,prioconfigurables vía env) para accionesaddedy diagnóstico. - 🛑 Apagado limpio — SIGTERM se captura, el daemon termina su iteración actual y cierra los handles en orden.
Configuración
Totalmente controlable vía variables de entorno — sin cambios de código requeridos.
| Variable | Propósito | Por defecto |
|---|---|---|
ABUSIVE_FAMILY | Filtro de familia de IP (v4/v6/any) | any |
ABUSIVE_MIN_HITS | Umbral de hits antes de bloquear | 3 |
ABUSIVE_SCOPE | Campos a comparar (request,ua,referrer) | request,ua |
ABUSIVE_REFERRER_DOMAINS | Hosts referrer permitidos | — |
ABUSIVE_SYSLOG_TAG | Tag de syslog | abusive_http_watch |
ABUSIVE_SYSLOG_FACILITY | Facility de syslog | daemon |
ABUSIVE_SYSLOG_PRIO | Prioridad de syslog | notice |
ABUSIVE_DEBUG | Activar salida debug | 0 |
Base tecnológica
Deliberadamente minimalista — solo herramientas base de OpenBSD y módulos estándar de Perl.
| Componente | Rol |
|---|---|
OpenBSD rc.d | Ciclo de vida del daemon (start/stop/reload) |
| Perl 5 | Runtime — solo stdlib (Fcntl, IO::Handle, Sys::Syslog, Socket) |
pf | Consumidor firewall de la blocklist (tabla <abusive>) |
syslogd | Agregación central de eventos |
newsyslog | Rotación de logs — manejada de forma transparente por el watcher |
Por qué esto es un tema de CEO
- 🏷️ Huella de cumplimiento mínima — Solo lee los logs existentes del servidor, escribe un único fichero, sin nube, sin telemetría. Conforme con el RGPD desde el primer momento.
- 💰 Coste operativo ~0 € — Script en un único fichero, sin contenedores, sin dependencias. Mantenimiento limitado al conjunto de tokens, que cambia raramente.
- 🔐 Reducción de la superficie de ataque — Las IPs repetidas desaparecen del pool en segundos — la mayoría de los atacantes prueban solo 3–10 rutas antes de pasar a la siguiente IP.
- 📊 Auditable — 381 líneas de Perl, sin dependencias externas, cada regla de token es una regex comentada. Revisión de código en una sola sesión.
- 🛠️ Nadie queda bloqueado por error — Whitelist con CIDR IPv4/IPv6 y el umbral de 3 hits previenen que bots de motores de búsqueda o probes accidentales causen daño.
Abusive HTTP Watch — Versión 2.1.2 · Daemon OpenBSD rc.d · En producción en tiendas online · ~380 SLOC Pure Perl