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.
| Cecha | Wartość |
|---|---|
| Wersja | 2.1.2 |
| Platforma | OpenBSD (integracja RC-Script) |
| Język | Perl 5 (tylko moduły standardowe) |
| Obszar użycia | Hardening webshopów |
| Status | Produkcyjnie 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 PHP —
allow_url_include,auto_prepend_file,php://input,eval( - WordPress-Probes —
wp-admin,wp-login.phpi warianty - Path-Traversal —
../..oraz częste kodowania - Wrażliwe ścieżki —
.env,.git,.svn,id_rsa,/etc/passwd - Próby RCE / CGI —
cgi-bin,?cmd=,=shell,eval( - SQL-Injection —
or 1=1i konserwatywne warianty - Login-Loop-Probes — wielokrotnie kaskadowane parametry
back=, także URL-encoded - Null-Byte-Injection —
%00w 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-agenti opcjonalniereferrer. Referrer-scope jest domyślnie wyłączony, by zapobiec drive-by-blocks przez obce strony. - 🔒 Atomowe aktualizacje blocklisty —
flock(LOCK_EX)przy zapisie, in-memory-dedup zapobiega duplikatom również po restarcie. - 📋 Whitelista z pierwszeństwem — plik
/etc/abusive_http_whitelistz pojedynczymi IP lub CIDR, które zawsze są przepuszczane. - ⏳ Próg trafień — dopiero po
MIN_HITStrafieniach (domyślnie 3) IP jest zapisywane do blocklisty — chroni przed przypadkowymi singletonami. - 📡 Integracja syslog — strukturyzowane eventy (
tag,facility,priokonfigurowalne przez Env) dla akcjiaddedi 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.
| Zmienna | Cel | Domyślne |
|---|---|---|
ABUSIVE_FAMILY | Filtrowanie rodziny IP (v4/v6/any) | any |
ABUSIVE_MIN_HITS | Próg trafień przed blokadą | 3 |
ABUSIVE_SCOPE | Pola do matchingu (request,ua,referrer) | request,ua |
ABUSIVE_REFERRER_DOMAINS | Dozwolone hosty referrera | — |
ABUSIVE_SYSLOG_TAG | Tag syslog | abusive_http_watch |
ABUSIVE_SYSLOG_FACILITY | Facility syslog | daemon |
ABUSIVE_SYSLOG_PRIO | Priorytet syslog | notice |
ABUSIVE_DEBUG | Aktywacja outputów debug | 0 |
Fundament technologiczny
Celowo minimalistyczny — tylko narzędzia OpenBSD bordmittel i moduły standardowe Perla.
| Komponent | Rola |
|---|---|
OpenBSD rc.d | Daemon-Lifecycle (start/stop/reload) |
| Perl 5 | Runtime — stdlib-only (Fcntl, IO::Handle, Sys::Syslog, Socket) |
pf | Konsument firewall blocklisty (tabela <abusive>) |
syslogd | Centralna agregacja eventów |
newsyslog | Log-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