Abusive HTTP Watch

Abusive HTTP Watch to lekki daemon OpenBSD, który śledzi access-log webserwera w czasie rzeczywistym, wykrywa złośliwe HTTP-probes na podstawie kuratowanego zbioru tokenów i przenosi źródłowe IP do pliku, który może być bezpośrednio konsumowany przez firewall (np. pf). W produkcyjnym użyciu do zabezpieczania webshopów.

CechaWartość
Wersja2.1.2
PlatformaOpenBSD (integracja RC-Script)
JęzykPerl 5 (tylko moduły standardowe)
Obszar użyciaHardening webshopów
StatusProdukcyjnie w użyciu
  flowchart LR
    A[Logi webserwera] --> B[Pattern-Match]
    B --> C{"Próg osiągnięty?"}
    C -->|Tak| D[Reguła blokująca PF]
    C -->|Nie| A
    D --> E[(Tabela blokad)]
    E -->|TTL wygasł| F[Auto-Release]

O co chodzi

Webshopy i produkcyjne strony internetowe są nieustannie automatycznie skanowane pod kątem podatności — exploity PHP, login-probes WordPress, lookupy /etc/passwd, path-traversal, SQLi, null-byte-injections. Te probes pozostawiają wyraźny wzorzec tokenów w access-logu, niezależnie od kodu HTTP-status.

Abusive HTTP Watch czyta log ciągle, sprawdza każdą linię przeciwko precyzyjnemu zbiorowi tokenów i zapisuje IP z powtórnymi trafieniami do append-only blocklisty, która może być bezpośrednio podpięta do tabel pf OpenBSD, dyrektyw Apache Require lub list deny nginx.

Kategorie wykrywania

Zbiór tokenów adresuje klasy ataków, które udowodniono występują w produkcyjnych logach — celowo konserwatywne, aby uniknąć false-positives.

  • Eksploatacja PHPallow_url_include, auto_prepend_file, php://input, eval(
  • WordPress-Probeswp-admin, wp-login.php i warianty
  • Path-Traversal../.. oraz częste kodowania
  • Wrażliwe ścieżki.env, .git, .svn, id_rsa, /etc/passwd
  • Próby RCE / CGIcgi-bin, ?cmd=, =shell, eval(
  • SQL-Injectionor 1=1 i konserwatywne warianty
  • Login-Loop-Probes — wielokrotnie kaskadowane parametry back=, także URL-encoded
  • Null-Byte-Injection%00 w URI

Cechy operacyjne

  • 🔄 Odporne na log-rotation — wykrywa zarówno rotate (zmiana inode) jak i copytruncate (pos > size) i czysto przejmuje bez utraty danych.
  • 🌍 Dual-Stack — natywne wsparcie dla IPv4 i IPv6 włącznie z CIDR-Whitelisting (np. 203.0.113.0/24, 2001:db8::/32).
  • 🛡️ Tylko publiczne IP — adresy prywatne RFC1918, link-local, loopback, multicast i shared-address-space są automatycznie pomijane.
  • 🎯 Scoped Matching — per żądanie matching jest ograniczony do request, user-agent i opcjonalnie referrer. Referrer-scope jest domyślnie wyłączony, by zapobiec drive-by-blocks przez obce strony.
  • 🔒 Atomowe aktualizacje blocklistyflock(LOCK_EX) przy zapisie, in-memory-dedup zapobiega duplikatom również po restarcie.
  • 📋 Whitelista z pierwszeństwem — plik /etc/abusive_http_whitelist z pojedynczymi IP lub CIDR, które zawsze są przepuszczane.
  • ⏳ Próg trafień — dopiero po MIN_HITS trafieniach (domyślnie 3) IP jest zapisywane do blocklisty — chroni przed przypadkowymi singletonami.
  • 📡 Integracja syslog — strukturyzowane eventy (tag, facility, prio konfigurowalne przez Env) dla akcji added i komunikatów diagnostycznych.
  • 🛑 Czyste shutdown — SIGTERM jest przechwytywany, daemon kończy bieżącą iterację i zamyka handles uporządkowanie.

Konfiguracja

W pełni sterowane przez zmienne środowiskowe — bez konieczności zmian w kodzie.

ZmiennaCelDomyślne
ABUSIVE_FAMILYFiltrowanie rodziny IP (v4/v6/any)any
ABUSIVE_MIN_HITSPróg trafień przed blokadą3
ABUSIVE_SCOPEPola do matchingu (request,ua,referrer)request,ua
ABUSIVE_REFERRER_DOMAINSDozwolone hosty referrera
ABUSIVE_SYSLOG_TAGTag syslogabusive_http_watch
ABUSIVE_SYSLOG_FACILITYFacility syslogdaemon
ABUSIVE_SYSLOG_PRIOPriorytet syslognotice
ABUSIVE_DEBUGAktywacja outputów debug0

Fundament technologiczny

Celowo minimalistyczny — tylko narzędzia OpenBSD bordmittel i moduły standardowe Perla.

KomponentRola
OpenBSD rc.dDaemon-Lifecycle (start/stop/reload)
Perl 5Runtime — stdlib-only (Fcntl, IO::Handle, Sys::Syslog, Socket)
pfKonsument firewall blocklisty (tabela <abusive>)
syslogdCentralna agregacja eventów
newsyslogLog-rotation — transparentnie obsługiwana przez watcher

Dlaczego to jest tematem dla CEO

  • 🏷️ Mały compliance-footprint — narzędzie korzysta tylko z publicznych logów serwera, zapisuje pojedynczą listę, bez chmury, bez telemetrii. RODO-zgodne out-of-the-box.
  • 💰 Koszty operacyjne ~0 € — pojedynczy plik-skrypt, bez kontenerów, bez zależności. Utrzymanie ograniczone do zbioru tokenów, który rzadko się zmienia.
  • 🔐 Redukcja powierzchni ataku — wielokrotnie podejrzane IP znikają z puli w ciągu sekund — większość atakujących próbuje tylko 3–10 ścieżek, zanim nadejdzie kolejne IP.
  • 📊 Audytowalny — 381 linii Perla, bez zewnętrznych zależności, każda reguła tokenowa jako komentowane regex widoczna. Code-review możliwe w jednej sesji.
  • 🛠️ Nikt nie zostaje zablokowany przypadkiem — whitelista z IPv4/IPv6-CIDR i próg trafień 3 dbają o to, że ani boty wyszukiwarek, ani przypadkowe probes nie wyrządzają szkody.

Abusive HTTP Watch — Wersja 2.1.2 · daemon OpenBSD rc.d · w produkcyjnym użyciu u webshopów · ~380 SLOC Pure Perl