Abusive HTTP Watch
Abusive HTTP Watch ist ein leichter OpenBSD-Daemon, der den
Webserver-Access-Log in Echtzeit verfolgt, bösartige HTTP-Probes anhand
eines kuratierten Token-Sets erkennt und die Quell-IPs in eine Datei
überführt, die direkt von der Firewall (z. B. pf) konsumiert werden
kann. Im produktiven Einsatz zur Absicherung von Webshops.
| Eigenschaft | Wert |
|---|---|
| Version | 2.1.2 |
| Plattform | OpenBSD (RC-Script-Integration) |
| Sprache | Perl 5 (nur Standardmodule) |
| Einsatzgebiet | Webshop-Hardening |
| Status | Produktiv im Einsatz |
flowchart LR
A[Webserver-Logs] --> B[Pattern-Match]
B --> C{"Schwelle erreicht?"}
C -->|Ja| D[PF-Block-Regel]
C -->|Nein| A
D --> E[(Block-Tabelle)]
E -->|TTL abgelaufen| F[Auto-Release]
Worum es geht
Web-Shops und produktive Webseiten werden permanent automatisiert nach
Schwachstellen abgeklopft — PHP-Exploits, WordPress-Login-Probes,
/etc/passwd-Lookups, Path-Traversal, SQLi, Null-Byte-Injektionen.
Diese Probes hinterlassen ein klares Token-Muster im Access-Log,
unabhängig vom HTTP-Status-Code.
Abusive HTTP Watch liest den Log fortlaufend, prüft jede Zeile gegen
ein präzises Token-Set und schreibt IPs mit wiederholten Treffern in
eine Append-Only-Blocklist, die sich direkt in OpenBSDs pf-Tabellen,
Apache-Require-Direktiven oder nginx-deny-Listen einhängen lässt.
Erkennungs-Kategorien
Das Token-Set adressiert Angriffsklassen, die in produktiven Logs nachweislich vorkommen — bewusst konservativ, um False-Positives zu vermeiden.
- PHP-Exploitation —
allow_url_include,auto_prepend_file,php://input,eval( - WordPress-Probes —
wp-admin,wp-login.phpund Varianten - Path-Traversal —
../..sowie häufige Encodings - Sensible Pfade —
.env,.git,.svn,id_rsa,/etc/passwd - RCE / CGI-Versuche —
cgi-bin,?cmd=,=shell,eval( - SQL-Injection —
or 1=1und konservative Varianten - Login-Loop-Probes — mehrfach kaskadierte
back=-Parameter, auch URL-encoded - Null-Byte-Injection —
%00in URI
Operative Features
- 🔄 Log-Rotation-fest — Erkennt sowohl Rotate (Inode-Wechsel) als auch Copytruncate (
pos > size) und übernimmt sauber ohne Datenverlust. - 🌍 Dual-Stack — Native Unterstützung für IPv4 und IPv6 inkl. CIDR-Whitelisting (z. B.
203.0.113.0/24,2001:db8::/32). - 🛡️ Public-IP-only — Private RFC1918-, Link-Local-, Loopback-, Multicast- und Shared-Address-Space-Adressen werden automatisch übersprungen.
- 🎯 Scoped Matching — Pro Anfrage wird das Matching auf
request,user-agentund optionalreferrerbeschränkt. Referrer-Scope ist standardmäßig aus, um Drive-by-Blocks über fremde Seiten zu verhindern. - 🔒 Atomare Blocklist-Updates —
flock(LOCK_EX)beim Schreiben, In-Memory-Dedup verhindert Doppeleinträge auch bei Neustart. - 📋 Whitelist mit Vorrang — Datei
/etc/abusive_http_whitelistmit einzelnen IPs oder CIDRs, die immer durchgelassen werden. - ⏳ Hit-Schwelle — Erst nach
MIN_HITSTreffern (Standard 3) wird die IP in die Blocklist geschrieben — schützt vor versehentlichen Singletons. - 📡 Syslog-Integration — Strukturierte Events (
tag,facility,prioper Env konfigurierbar) füradded-Aktionen und Diagnose-Meldungen. - 🛑 Sauberer Shutdown — SIGTERM wird abgefangen, der Daemon beendet die aktuelle Iteration und schließt Handles geordnet.
Konfiguration
Vollständig über Umgebungsvariablen steuerbar — keine Code-Änderung nötig.
| Variable | Zweck | Default |
|---|---|---|
ABUSIVE_FAMILY | IP-Familie filtern (v4/v6/any) | any |
ABUSIVE_MIN_HITS | Treffer-Schwelle vor Blocken | 3 |
ABUSIVE_SCOPE | Felder zum Matchen (request,ua,referrer) | request,ua |
ABUSIVE_REFERRER_DOMAINS | Erlaubte Referrer-Hosts | — |
ABUSIVE_SYSLOG_TAG | Syslog-Tag | abusive_http_watch |
ABUSIVE_SYSLOG_FACILITY | Syslog-Facility | daemon |
ABUSIVE_SYSLOG_PRIO | Syslog-Priorität | notice |
ABUSIVE_DEBUG | Debug-Ausgaben aktivieren | 0 |
Technologisches Fundament
Bewusst minimalistisch — nur OpenBSD-Bordmittel und Perl-Standardmodule.
| Komponente | Rolle |
|---|---|
OpenBSD rc.d | Daemon-Lifecycle (start/stop/reload) |
| Perl 5 | Runtime — stdlib-only (Fcntl, IO::Handle, Sys::Syslog, Socket) |
pf | Firewall-Konsument der Blocklist (Tabelle <abusive>) |
syslogd | Zentrale Event-Aggregation |
newsyslog | Log-Rotation — vom Watcher transparent gehandhabt |
Warum das ein CEO-Thema ist
- 🏷️ Compliance-Footprint klein — Tool greift nur auf öffentliche Server-Logs zu, schreibt eine einzige Liste, keine Cloud, keine Telemetrie. DSGVO-konform out-of-the-box.
- 💰 Betriebskosten ~0 € — Single-Datei-Skript, keine Container, keine Abhängigkeiten. Wartung beschränkt auf das Token-Set, das sich selten ändert.
- 🔐 Reduktion der Angriffsfläche — Wiederholt auffällige IPs verschwinden binnen Sekunden aus dem Pool — die Mehrheit der Angreifer probiert nur 3–10 Pfade, bevor die nächste IP an der Reihe ist.
- 📊 Auditierbar — 381 Zeilen Perl, keine externen Dependencies, jede Token-Regel als kommentierte Regex sichtbar. Code-Review in einer Sitzung möglich.
- 🛠️ Niemand wird ausgesperrt — Whitelist mit IPv4/IPv6-CIDR und Hit-Schwelle 3 sorgen dafür, dass weder Suchmaschinen-Bots noch versehentliche Probes Schaden anrichten.
Abusive HTTP Watch — Version 2.1.2 · OpenBSD-rc.d-Daemon · Produktiv im Webshop-Einsatz · ~380 SLOC Pure Perl