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.

EigenschaftWert
Version2.1.2
PlattformOpenBSD (RC-Script-Integration)
SprachePerl 5 (nur Standardmodule)
EinsatzgebietWebshop-Hardening
StatusProduktiv 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-Exploitationallow_url_include, auto_prepend_file, php://input, eval(
  • WordPress-Probeswp-admin, wp-login.php und Varianten
  • Path-Traversal../.. sowie häufige Encodings
  • Sensible Pfade.env, .git, .svn, id_rsa, /etc/passwd
  • RCE / CGI-Versuchecgi-bin, ?cmd=, =shell, eval(
  • SQL-Injectionor 1=1 und konservative Varianten
  • Login-Loop-Probes — mehrfach kaskadierte back=-Parameter, auch URL-encoded
  • Null-Byte-Injection%00 in 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-agent und optional referrer beschränkt. Referrer-Scope ist standardmäßig aus, um Drive-by-Blocks über fremde Seiten zu verhindern.
  • 🔒 Atomare Blocklist-Updatesflock(LOCK_EX) beim Schreiben, In-Memory-Dedup verhindert Doppeleinträge auch bei Neustart.
  • 📋 Whitelist mit Vorrang — Datei /etc/abusive_http_whitelist mit einzelnen IPs oder CIDRs, die immer durchgelassen werden.
  • ⏳ Hit-Schwelle — Erst nach MIN_HITS Treffern (Standard 3) wird die IP in die Blocklist geschrieben — schützt vor versehentlichen Singletons.
  • 📡 Syslog-Integration — Strukturierte Events (tag, facility, prio per Env konfigurierbar) für added-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.

VariableZweckDefault
ABUSIVE_FAMILYIP-Familie filtern (v4/v6/any)any
ABUSIVE_MIN_HITSTreffer-Schwelle vor Blocken3
ABUSIVE_SCOPEFelder zum Matchen (request,ua,referrer)request,ua
ABUSIVE_REFERRER_DOMAINSErlaubte Referrer-Hosts
ABUSIVE_SYSLOG_TAGSyslog-Tagabusive_http_watch
ABUSIVE_SYSLOG_FACILITYSyslog-Facilitydaemon
ABUSIVE_SYSLOG_PRIOSyslog-Prioritätnotice
ABUSIVE_DEBUGDebug-Ausgaben aktivieren0

Technologisches Fundament

Bewusst minimalistisch — nur OpenBSD-Bordmittel und Perl-Standardmodule.

KomponenteRolle
OpenBSD rc.dDaemon-Lifecycle (start/stop/reload)
Perl 5Runtime — stdlib-only (Fcntl, IO::Handle, Sys::Syslog, Socket)
pfFirewall-Konsument der Blocklist (Tabelle <abusive>)
syslogdZentrale Event-Aggregation
newsyslogLog-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