Abusive HTTP Watch
Το Abusive HTTP Watch είναι ένας ελαφρύς daemon για OpenBSD που
παρακολουθεί σε πραγματικό χρόνο το access log του web server,
ανιχνεύει κακόβουλες HTTP probes με βάση ένα επιμελημένο σύνολο
tokens και γράφει τις IP-διευθύνσεις πηγής σε ένα αρχείο που μπορεί να
καταναλωθεί απευθείας από το firewall (π.χ. pf). Σε ενεργή
παραγωγική χρήση για την προστασία online καταστημάτων.
| Ιδιότητα | Τιμή |
|---|---|
| Έκδοση | 2.1.2 |
| Πλατφόρμα | OpenBSD (ενσωμάτωση RC script) |
| Γλώσσα | Perl 5 (μόνο standard library) |
| Σενάριο χρήσης | Σκλήρυνση online καταστημάτων |
| Κατάσταση | Σε παραγωγή |
flowchart LR
A[Logs webserver] --> B[Pattern match]
B --> C{"Όριο επιτεύχθηκε;"}
C -->|Ναι| D[Κανόνας PF block]
C -->|Όχι| A
D --> E[(Block table)]
E -->|TTL έληξε| F[Auto release]
Περί τίνος πρόκειται
Τα online καταστήματα και οι παραγωγικοί ιστότοποι ανιχνεύονται
συνεχώς αυτόματα για ευπάθειες — PHP exploits, WordPress login probes,
αναζητήσεις /etc/passwd, path traversal, SQLi, null-byte injection.
Αυτές οι probes αφήνουν ένα ξεκάθαρο μοτίβο tokens στο access log,
ανεξάρτητα από τον HTTP κωδικό κατάστασης.
Το Abusive HTTP Watch ακολουθεί συνεχώς το log, αξιολογεί κάθε γραμμή
έναντι ενός ακριβούς συνόλου tokens και γράφει IPs με επαναλαμβανόμενα
hits σε μια append-only blocklist που συνδέεται απευθείας σε
πίνακες pf του OpenBSD, σε οδηγίες Require του Apache ή σε λίστες
deny του nginx.
Κατηγορίες ανίχνευσης
Το σύνολο tokens στοχεύει κλάσεις επιθέσεων που αποδεδειγμένα εμφανίζονται στα παραγωγικά logs — σκόπιμα συντηρητικό για αποφυγή ψευδώς θετικών.
- Εκμετάλλευση PHP —
allow_url_include,auto_prepend_file,php://input,eval( - WordPress probes —
wp-admin,wp-login.phpκαι παραλλαγές - Path traversal —
../..και συνηθισμένα encodings - Ευαίσθητα paths —
.env,.git,.svn,id_rsa,/etc/passwd - Προσπάθειες RCE / CGI —
cgi-bin,?cmd=,=shell,eval( - SQL injection —
or 1=1και συντηρητικές παραλλαγές - Probes login-loop — πολλαπλά cascaded
back=parameters, συμπεριλαμβανομένων URL-encoded - Null-byte injection —
%00στο URI
Λειτουργικά χαρακτηριστικά
- 🔄 Ανθεκτικό σε log rotation — Ανιχνεύει τόσο rotate (αλλαγή inode) όσο και copytruncate (
pos > size) και ανακάμπτει χωρίς να χάνει γραμμές. - 🌍 Dual stack — Native υποστήριξη IPv4 και IPv6 με whitelisting CIDR (π.χ.
203.0.113.0/24,2001:db8::/32). - 🛡️ Μόνο δημόσιες IPs — Ιδιωτικές διευθύνσεις RFC 1918, link-local, loopback, multicast και shared address space παραλείπονται αυτόματα.
- 🎯 Scoped matching — Ανά αίτημα, το matching περιορίζεται σε
request,user-agentκαι προαιρετικάreferrer. Το referrer scope είναι απενεργοποιημένο εξ ορισμού για αποφυγή drive-by blocks μέσω τρίτων σελίδων. - 🔒 Ατομικές ενημερώσεις blocklist —
flock(LOCK_EX)κατά τη γραφή, in-memory dedup αποτρέπει διπλότυπα μετά από επανεκκινήσεις. - 📋 Whitelist με προτεραιότητα —
/etc/abusive_http_whitelistδέχεται μεμονωμένες IPs ή CIDRs που πάντα περνούν. - ⏳ Κατώφλι hits — Μια IP εισέρχεται στη blocklist μόνο μετά από
MIN_HITShits (default 3) — προστατεύει από τυχαίες μεμονωμένες περιπτώσεις. - 📡 Ενσωμάτωση syslog — Δομημένα events (
tag,facility,prioρυθμιζόμενα μέσω env) για ενέργειεςaddedκαι διαγνωστικά. - 🛑 Καθαρός τερματισμός — Το SIGTERM παρακολουθείται, ο daemon ολοκληρώνει την τρέχουσα επανάληψη και κλείνει τα handles με τάξη.
Διαμόρφωση
Πλήρως ελεγχόμενη μέσω μεταβλητών περιβάλλοντος — χωρίς αλλαγές κώδικα.
| Μεταβλητή | Σκοπός | Default |
|---|---|---|
ABUSIVE_FAMILY | Φίλτρο οικογένειας IP (v4/v6/any) | any |
ABUSIVE_MIN_HITS | Κατώφλι hits πριν τον αποκλεισμό | 3 |
ABUSIVE_SCOPE | Πεδία προς matching (request,ua,referrer) | request,ua |
ABUSIVE_REFERRER_DOMAINS | Επιτρεπόμενοι referrer hosts | — |
ABUSIVE_SYSLOG_TAG | Tag του syslog | abusive_http_watch |
ABUSIVE_SYSLOG_FACILITY | Facility του syslog | daemon |
ABUSIVE_SYSLOG_PRIO | Προτεραιότητα syslog | notice |
ABUSIVE_DEBUG | Ενεργοποίηση debug output | 0 |
Τεχνολογικό θεμέλιο
Σκόπιμα μινιμαλιστικό — μόνο εργαλεία βάσης OpenBSD και standard modules της Perl.
| Συστατικό | Ρόλος |
|---|---|
OpenBSD rc.d | Κύκλος ζωής daemon (start/stop/reload) |
| Perl 5 | Runtime — μόνο stdlib (Fcntl, IO::Handle, Sys::Syslog, Socket) |
pf | Καταναλωτής blocklist firewall (πίνακας <abusive>) |
syslogd | Κεντρική συγκέντρωση events |
newsyslog | Log rotation — διαφανής χειρισμός από τον watcher |
Γιατί αυτό είναι θέμα CEO
- 🏷️ Μικροσκοπικό αποτύπωμα συμμόρφωσης — Διαβάζει μόνο υπάρχοντα server logs, γράφει ένα μόνο αρχείο, χωρίς cloud, χωρίς telemetry. GDPR-φιλικό out-of-the-box.
- 💰 Λειτουργικό κόστος ~0 € — Script ενός αρχείου, χωρίς containers, χωρίς εξαρτήσεις. Η συντήρηση περιορίζεται στο σύνολο tokens, που σπάνια αλλάζει.
- 🔐 Μείωση επιφάνειας επίθεσης — Επαναλαμβανόμενα ύποπτες IPs εξαφανίζονται από το pool μέσα σε δευτερόλεπτα — οι περισσότεροι επιτιθέμενοι δοκιμάζουν μόνο 3–10 paths πριν περάσουν στην επόμενη IP.
- 📊 Ελέγξιμο — 381 γραμμές Perl, χωρίς εξωτερικές εξαρτήσεις, κάθε κανόνας token είναι μια σχολιασμένη regex. Code review χωρά σε μία συνεδρία.
- 🛠️ Κανείς δεν αποκλείεται κατά λάθος — Whitelist με IPv4/IPv6 CIDR και το κατώφλι των 3 hits αποτρέπουν τους bots μηχανών αναζήτησης ή τυχαίες probes από το να προκαλέσουν ζημιά.
Abusive HTTP Watch — Έκδοση 2.1.2 · OpenBSD rc.d daemon · σε παραγωγή σε online καταστήματα · ~380 SLOC Pure Perl