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]
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.
El conjunto de tokens apunta a clases de ataques que aparecen demostrablemente en los logs de producción — deliberadamente conservador para evitar falsos positivos.
allow_url_include, auto_prepend_file, php://input, eval(wp-admin, wp-login.php y variantes../.. y codificaciones comunes.env, .git, .svn, id_rsa, /etc/passwdcgi-bin, ?cmd=, =shell, eval(or 1=1 y variantes conservadorasback= cascadeados, incluyendo URL-encoded%00 en URIpos > size) y se recupera sin perder líneas.203.0.113.0/24, 2001:db8::/32).request, user-agent y opcionalmente referrer. El scope referrer está desactivado por defecto para evitar bloqueos drive-by vía páginas de terceros.flock(LOCK_EX) al escribir, dedup en memoria previene duplicados tras reinicios./etc/abusive_http_whitelist acepta IPs sueltas o CIDRs que siempre se dejan pasar.MIN_HITS hits (por defecto 3) — protege contra singletons accidentales.tag, facility, prio configurables vía env) para acciones added y diagnóstico.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 |
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 |
Abusive HTTP Watch — Versión 2.1.2 · Daemon OpenBSD rc.d · En producción en tiendas online · ~380 SLOC Pure Perl