Skip to Content

Odoo 19 Community: Web RBL – λίστα αποκλεισμού για κίνηση επίθεσης στους δικούς σας ιστότοπους

24 Σεπτεμβρίου 2026 από
Odoo 19 Community: Web RBL – λίστα αποκλεισμού για κίνηση επίθεσης στους δικούς σας ιστότοπους

Πηγαίος κώδικας: github.com/Alex0176/odoo-web-rbl — AGPL-3, ελεύθερα χρησιμοποιήσιμο.

Όποιος λειτουργεί έναν διακομιστή Odoo στο διαδίκτυο, δέχεται επισκέψεις. Όχι περιστασιακά, αλλά αδιάκοπα. Σε δεκαεπτά ημέρες καταγράψαμε και αναλύσαμε στους πέντε ιστότοπούς μας 731.297 αιτήματα. Τα 110.511 από αυτά δεν ήταν επισκέπτες, αλλά αυτοματοποιημένη αναζήτηση αδυναμιών, διαπιστευτηρίων και αρχείων ρυθμίσεων.

Αυτό το άρθρο περιγράφει το Web RBL, μια ενότητα ανοιχτού κώδικα για το Odoo 19 Community, που εντοπίζει, βαθμολογεί, καταγράφει και απορρίπτει αυτή την κίνηση — και που δημοσιεύει τη λίστα αποκλεισμού ως λίστα RBL, δηλαδή στη μορφή που τα τείχη προστασίας και οι reverse proxies διαβάζουν άμεσα. Όλοι οι αριθμοί προέρχονται από πραγματική λειτουργία.

Τι μπορεί να κάνει η ενότητα — οι λειτουργίες με μια ματιά

ΛειτουργίαΤι κάνειΠαράδοση
Αναγνώριση μοτίβωνΕντοπίζει ανιχνεύσεις από τη διαδρομή και την κατάληξη: .env, .git, αρχεία ρυθμίσεων, κλειδιά cloud, οδηγίες κατασκευής CI/CD, WordPress, PHP, path traversal, διαχειριστές βάσεων δεδομένων, GraphQL, εκτέλεση εντολών μέσω /api/fs/exec και παρόμοιων διεπαφώναποκλεισμός
Τρία επίπεδα ανά μοτίβοαποκλεισμός, καταμέτρηση ή αναφορά — μεταβάλλεται ανά μοτίβο, χωρίς κώδικαανά μοτίβο
ΚατώφλιαΤόσες προσβολές του ίδιου μοτίβου πριν από τον αποκλεισμό· για συνδέσεις δέκα10 στη σύνδεση
Άμυνα σύνδεσηςΑποτυχημένες συνδέσεις μέσω φόρμας και XML-RPC/JSON-RPC, αποτυχημένοι έλεγχοι συνεδρίας, προσβάσεις στον διαχειριστή βάσεων δεδομένων — στη βάση δεδομένων, όχι στη μνήμηενεργό
Αναγνώριση bots στη σύνδεσηΌποιος αγνοεί το μήνυμα αναμονής μετά από δέκα αποτυχημένες προσπάθειες και συνεχίζει να χτυπά, αποκλείεται αμέσωςαποκλεισμός
Αναγνώριση συμπεριφοράςΔιευθύνσεις που σε πέντε λεπτά παράγουν είκοσι ανύπαρκτες σελίδες και σχεδόν καμία υπαρκτή σελίδα — δηλαδή μαντεύουν αντί να διαβάζουναναφορά
Βαθμολογία 0–100Πόσο βέβαιο είναι ότι πίσω από τη διεύθυνση βρίσκεται επιτιθέμενος; Από τη σοβαρότητα του μοτίβου, τον αριθμό διαφορετικών μοτίβων, τις ύποπτες ημέρες, τα επηρεαζόμενα domains και τον αριθμό προσβολών — με αιτιολόγηση σε απλό κείμενοενεργό
Αποκλεισμός σύνδεσης βάσει βαθμολογίαςΑπό μια ρυθμιζόμενη βαθμολογία και πάνω η σύνδεση απαγορεύεται, ο ιστότοπος παραμένει αναγνώσιμοςαπό 40
Υποψία κλεμμένων διαπιστευτηρίωνΜια επιτυχής σύνδεση από ύποπτη διεύθυνση αναφέρεται και, κατόπιν αιτήματος, ανατίθεται ως εργασία — μία φορά ανά διεύθυνση και ημέραενεργό
Λίστες απειλώνΠρορυθμισμένα: κόμβοι εξόδου Tor, Spamhaus DROP, FireHOL Level 1, blocklist.de· κάθε άλλη λίστα RBL μπορεί να καταχωριστεί με τη διεύθυνσή της, ημερήσια αντιπαραβολή, ξεχωριστό επίπεδο για κάθε λίστααναφορά
Χωρίς πρόσβαση στη σύνδεσηΤο τέταρτο επίπεδο για λίστες και χώρες: η ιστοσελίδα παραμένει αναγνώσιμη, η φόρμα σύνδεσης και οι διεπαφές είναι κλειστές — η σωστή απάντηση για το TorΠροαιρετικό
Χώρα προέλευσηςΧώρα ανά καταγραφή και διεύθυνση μέσω GeoLite2· το module ενημερώνει μόνο του τη βάση δεδομένων με δωρεάν κλειδί άδειαςεμφάνιση
Κανόνες χωρώνΑποκλεισμός, καμία πρόσβαση στη σύνδεση, αναφορά ή ρητά ελεύθερο — ανά χώρα, σκόπιμα χωρίς προεπιλογήκαμία
Εσφαλμένες ρυθμίσειςΤα QNAP, Synology, Exchange Autodiscover, ActiveSync, WebDAV/CalDAV/CardDAV αναγνωρίζονται, δεν αποκλείονται ποτέ και τοποθετούνται σε λίστα εργασιών με εύρημα και επηρεαζόμενο domainαναφορά
Ticket ανά διεύθυνσηΑπό ένα εύρημα δημιουργείται, κατόπιν αιτήματος, ένα ticket — ακριβώς ένα ανά διεύθυνση· ένα κλειστό ticket ανοίγει ξανά αντί να διπλασιαστείανενεργό
Υποχρεωτικές σελίδες και συλλέκτεςΗ κανονική διαδρομή της νομικής σημείωσης παραμένει πάντα προσβάσιμη· η αυτοματοποιημένη δοκιμή ξένων γραφών αναγνωρίζεται και, κατόπιν αιτήματος, αποκλείεταιαναφορά
Λευκή λίσταΔιευθύνσεις και δίκτυα που δεν αποκλείονται ποτέ· γεμίζει καθημερινά από το firewall (απέναντι άκρα VPN) και από τα δημοσιευμένα εύρη διευθύνσεων του Googlebot και του Bingbotενεργό
Αντιστοίχιση πελάτηΜια καταγραφή από το δίκτυο ενός πελάτη αντιστοιχίζεται σε αυτόν — από τη λευκή λίστα, ποτέ με χειροκίνητη εικασίαενεργό
Domain και αναγνωριστικό ανά καταγραφήΠοια ιστοσελίδα προσεγγίστηκε και με ποιο User-Agent — και τα δύο λείπουν από το αρχείο καταγραφής πρόσβασηςενεργό
ΑνάλυσηΔιάγραμμα και pivot για όλες τις καταγραφές: ανά μοτίβο, ημέρα, domain, χώρα, διεύθυνσηενεργό
ΔόλωμαΟι ανιχνευτές λαμβάνουν επινοημένες απαντήσεις με τιμή καναρινιού· όποιος την ανακτήσει αργότερα, τις έχει διαβάσειανενεργό
Διανομή RBLΗ λίστα αποκλεισμού ως απλή λίστα διευθύνσεων ή JSON σε ιδιαίτερη διεύθυνση προστατευμένη με token — για HAProxy, OPNsense και κάθε firewall που διαβάζει λίστες URLενεργό

Ό,τι παραδίδεται με αναφορά, ανενεργό ή προαιρετικό είναι σκόπιμα έτσι: όποιος ενεργοποιεί έναν αποκλεισμό, ας το κάνει επειδή παρακολούθησε για μερικές ημέρες ποιος πέφτει πάνω του — όχι επειδή το επέβαλε η προεπιλογή.

Web RBL Ανάλυση: καταγραφές ανά μοτίβο σε επτά ημέρες

Η ανάλυση: καταγραφές ανά μοτίβο σε επτά ημέρες. Η ψηλότερη μπάρα είναι η αναζήτηση αρχείων .env.

Λίστες RBL: ένας τυποποιημένος τρόπος διανομής αποκλεισμών

Το RBL σημαίνει Real-time Blackhole List. Ο όρος προέρχεται από τον κόσμο του email, όπου η Spamhaus και άλλοι δημοσιεύουν από τη δεκαετία του ενενήντα λίστες κακόβουλων διευθύνσεων αποστολέων. Η αρχή είναι παραπάνω από απλή και γι' αυτό τόσο διαδεδομένη: μία διεύθυνση ανά γραμμή, προσβάσιμη μέσω HTTP, επαναφορτωμένη τακτικά. Καμία μορφή που πρέπει πρώτα να αναλυθεί, καμία διεπαφή για την οποία χρειάζεται εργαλείο.

Σχεδόν κάθε firewall και κάθε reverse proxy μπορεί να διαβάσει μια τέτοια λίστα και να δημιουργήσει κανόνες από αυτήν. Οι κατασκευαστές την ονομάζουν διαφορετικά, ο μηχανισμός είναι παντού ο ίδιος:

  • OPNsense και pfSense — URL Table Alias: φόρτωση λίστας διευθύνσεων μέσω HTTP, χρήση ως alias σε κανόνες firewall, ενημέρωση ανά ώρες ή ημέρες
  • HAProxy — αρχεία ACL και Maps: src -f sperrliste.txt σε κανόνα http-request deny, επαναφορτώσιμο μέσω του runtime API χωρίς επανεκκίνηση
  • nginx — module geo με ενσωματωμένο αρχείο διευθύνσεων, ή οδηγίες deny από ένα παραγόμενο αρχείο include
  • Fortinet FortiGate — External Block List ή Threat Feed: ένα URL από το οποίο το firewall λαμβάνει μια λίστα IP και τη χρησιμοποιεί σε πολιτικές
  • Palo Alto Networks — External Dynamic List (EDL): η ίδια αρχή, ως ξεχωριστός τύπος αντικειμένου στις πολιτικές ασφαλείας
  • Check Point — Custom Intelligence Feeds και IP Block Lists μέσω URL
  • Cisco Secure Firewall (Firepower) — Security Intelligence Feeds με δικές σας πηγές λιστών
  • Sophos Firewall — Third-Party Threat Feeds: λίστες διευθύνσεων από ένα URL ως πηγή για κανόνες αποκλεισμού
  • Juniper SRX — Dynamic Address Entries από feeds
  • MikroTik RouterOS — Address Lists, που γεμίζουν με script και fetch από ένα URL
  • CrowdSec — δικές σας λίστες ως πηγή για τους bouncers σε κάθε υποστηριζόμενο σύστημα

Σε αυτή ακριβώς τη μορφή διανέμει το Web RBL τη λίστα αποκλεισμού του. Το firewall απορρίπτει τα πακέτα πριν φτάσουν στον web server — και μαζί τους κάθε άλλη προσπάθεια της ίδιας διεύθυνσης, για παράδειγμα στον mail server ή στην πύλη VPN.

Και προς τις δύο κατευθύνσεις, αλλά στο σωστό σημείο

Ο δρόμος λειτουργεί και αντίστροφα: στο Web RBL μπορεί να καταχωριστεί οποιαδήποτε λίστα RBL — ένα URL, ένα επίπεδο, και είναι έτοιμο. Κόμβοι εξόδου Tor, Spamhaus DROP, FireHOL και blocklist.de είναι προρυθμισμένα, άλλες προστίθενται με τρία κλικ. Το module αναλύει κάθε λίστα σε εύρη διευθύνσεων και ελέγχει κάθε αίτημα με βάση αυτά, σε λίγα μικροδευτερόλεπτα.

Παρ' όλα αυτά: είναι πιο λογικό να χρησιμοποιούνται οι ξένες λίστες στο firewall που βρίσκεται μπροστά. Για τρεις λόγους. Το firewall βλέπει όλες τις υπηρεσίες, όχι μόνο το HTTP — μια διεύθυνση από τη λίστα της Spamhaus πρέπει να αποτυγχάνει και στον mail server και στο VPN. Απορρίπτει σε επίπεδο πακέτων, πριν καν δημιουργηθεί σύνδεση, και έτσι δεν κοστίζει τίποτα στον application server. Και είναι το σημείο όπου τέτοιες λίστες συντηρούνται ούτως ή άλλως· ένα δεύτερο αντίγραφο στην εφαρμογή είναι ένα δεύτερο σημείο που μπορεί να παλιώσει.

Σε τι χρησιμεύουν λοιπόν οι λίστες μέσα στο module: σε ό,τι δεν μπορεί να κάνει ένα firewall. Δεν γνωρίζει φόρμα σύνδεσης. Το Web RBL μπορεί να αρνηθεί σε μια διεύθυνση από τη λίστα Tor την πρόσβαση στη σύνδεση και παρ' όλα αυτά να παραδώσει την ιστοσελίδα — όποιος θέλει να διαβάσει ανώνυμα, ας το κάνει· όποιος θέλει ανώνυμα να δοκιμάσει κωδικούς πρόσβασης, όχι. Και μπορεί να αναφέρει μια επιτυχή σύνδεση από μια καταχωρισμένη διεύθυνση ως ύποπτη περίπτωση. Και τα δύο απαιτούν τη λίστα εκεί όπου γίνεται η σύνδεση.

Βαθμολόγηση αντί για προαίσθηση

Μια διεύθυνση που ζήτησε μία φορά το /wp-login.php είναι κάτι διαφορετικό από μια διεύθυνση που σε δύο ημέρες πέρασε με πέντε διαφορετικά μοτίβα από τρία domains. Το Web RBL το μετατρέπει σε βαθμολογία από 0 έως 100 — από όσα είδε το ίδιο, χωρίς εξωτερική υπηρεσία και χωρίς ερώτημα προς τα έξω.

Καταχώριση Web RBL με βαθμολογία 84 και αιτιολόγηση

Μια καταχώριση: 99 καταγραφές, βαθμολογία 84, και η αιτιολόγηση σε καθαρό κείμενο — βαρύτερο μοτίβο, πέντε διαφορετικά σοβαρά μοτίβα, δύο ύποπτες ημέρες, πάνω από είκοσι καταγραφές.

Η βαθμολογία αποφασίζει για δύο πράγματα. Από μια ρυθμιζόμενη τιμή και πάνω η σύνδεση απαγορεύεται — η ιστοσελίδα παραμένει αναγνώσιμη, αλλά όποιος έψαχνε ήδη για διαπιστευτήρια πρόσβασης δεν παίρνει την ευκαιρία να δοκιμάσει όσα βρήκε. Και μια επιτυχής σύνδεση από διεύθυνση με βαθμολογία αναφέρεται: τότε κάποιος δεν μάντεψε πια, αλλά ήξερε. Είτε ο εξουσιοδοτημένος χρήστης ήταν εκτός έδρας, είτε τα διαπιστευτήρια έχουν χαθεί — το module δεν το αποφασίζει, το θέτει ενώπιον κάποιου που μπορεί να ρωτήσει. Ο ίδιος ο κωδικός πρόσβασης δεν αγγίζεται πουθενά.

Λίστα αποκλεισμού Web RBL, φιλτραρισμένη κατά βαθμολογία από 40

Η λίστα αποκλεισμού, φιλτραρισμένη κατά βαθμολογία από 40: αριθμός καταγραφών, ύποπτες ημέρες, επηρεαζόμενα domains και η τελευταία διαδρομή ανά διεύθυνση.

Τι προστατεύει το Web RBL — η προστασία αναλυτικά

1. Τα διαπιστευτήρια παραμένουν αδιάκριτα

Η μεγαλύτερη κατηγορία επιθέσεων που μετρήθηκε δεν αναζητά ευπάθειες στο Odoo, αλλά μυστικά που έμειναν πίσω. Σε δεκαεπτά ημέρες:

  • 57.721 αιτήματα για αρχεία .env — εκεί βρίσκονται κωδικοί βάσης δεδομένων, κλειδιά API και μυστικά συνεδρίας
  • 5.535 αιτήματα για αρχεία ρυθμίσεων
  • 4.388 αιτήματα για διαπιστευτήρια cloud: credentials.json, service-account.json, firebase-adminsdk.json, rclone.conf, .git-credentials
  • 2.811 αιτήματα για καταλόγους .git — όποιος βρει έναν, κατεβάζει ολόκληρο τον πηγαίο κώδικα μαζί με το ιστορικό
  • 1.907 αιτήματα για οδηγίες κατασκευής όπως .github/workflows/deploy.yml ή .gitlab-ci.yml, όπου αναγράφονται registries και ονόματα κλειδιών

Καθοριστικός δεν είναι ο αριθμός των αιτημάτων, αλλά ο αριθμός των διαφορετικών διευθύνσεων: το /credentials.json ζητήθηκε από 98 διευθύνσεις, το /.git-credentials από 92. Αυτό δεν είναι ένας μεμονωμένος σαρωτής, αλλά ένα τυποποιημένο ρεπερτόριο που τρέχει ταυτόχρονα σε όλο τον κόσμο.

2. Οι απόπειρες σύνδεσης πέφτουν στο κενό — μόνιμα

Το Odoo διαθέτει δικό του φρένο κατά της δοκιμής κωδικών πρόσβασης. Έχει τρία όρια, τεκμηριωμένα στον ίδιο τον πηγαίο κώδικα του Odoo: ο μετρητής βρίσκεται στη μνήμη της διεργασίας εργασίας και μηδενίζεται σε κάθε επανεκκίνηση, απλώς καθυστερεί αντί να αποκλείει, και μετράει αποκλειστικά απόπειρες που φτάνουν μέχρι τον έλεγχο του κωδικού.

Το Web RBL παρεμβαίνει στα ίδια σημεία, αλλά γράφει στη βάση δεδομένων. Έτσι ισχύουν τα εξής:

  • Η κατάσταση επιβιώνει σε κάθε επανεκκίνηση και ισχύει για όλες τις διεργασίες εργασίας
  • Καταγράφονται και οι δύο δρόμοι: η φόρμα σύνδεσης /web/login και οι διεπαφές /xmlrpc/2/common και /jsonrpc
  • Καταγράφονται και απόπειρες που δεν φτάνουν ποτέ στον έλεγχο του κωδικού — για παράδειγμα συνδέσεις χωρίς έγκυρο αναγνωριστικό συνεδρίας
  • Μια αποτυχημένη πρόσβαση στον διαχειριστή βάσεων δεδομένων μετράται επίσης· αυτή είναι η σοβαρότερη απόπειρα σύνδεσης απ' όλες

Το όριο για συνδέσεις είναι δέκα, και ο λόγος είναι μια μέτρηση: από εννέα αποτυχημένες συνδέσεις σε δεκαεπτά ημέρες προερχόταν η πλειονότητα από πελάτες που ρύθμιζαν μόνοι τους την πρόσβαση σε μια άλλη συσκευή και δήλωναν το λάθος domain — σε μία περίπτωση το δικό τους, μόνο με παύλα αντί για τελεία. Ένας αποκλεισμός στην πρώτη αποτυχημένη προσπάθεια δεν θα είχε πλήξει επιτιθέμενους, αλλά πελάτες κατά τη ρύθμιση.

Όποιος αντίθετα συνεχίζει να χτυπά την πόρτα, παρότι ο server έχει ήδη απαντήσει «παρακαλώ περιμένετε λίγο», αποκλείεται αμέσως. Αυτό το μήνυμα το διαβάζει ένας άνθρωπος και περιμένει· όποιος το αγνοεί, είναι ένα πρόγραμμα. Ένα ξεχωριστό μοτίβο με όριο μηδέν πιάνει ακριβώς αυτήν την περίπτωση, και δεν μπορεί να πλήξει κάποιον συνάδελφο: εκεί καταλήγει μόνο όποιος έχει ήδη δέκα αποτυχημένες προσπάθειες πίσω του και στη συνέχεια επιμένει.

3. Η επίθεση δεν κοστίζει πια τίποτα στον server

Ένας ανιχνευτής σε διαδρομή όπως /@fs/../../.env ήταν πριν από το module ακριβός: το Odoo αναζητά τη σελίδα σφάλματος, την αποδίδει, σκοντάφτει στην κατασκευή της διεύθυνσης πάνω στα τμήματα με τελείες και αποτυγχάνει εν συνεχεία και στη σελίδα σφάλματος της σελίδας σφάλματος. Δύο stack traces ανά ανιχνευτή. Μετρήθηκαν 28.401 τέτοια σφάλματα σε δεκαεπτά ημέρες, συν 9.467 επακόλουθα σφάλματα.

Το Web RBL παρεμβαίνει στο ir.http._match, δηλαδή πριν από τον προσδιορισμό διαδρομής. Η απάντηση δίνεται χωρίς πρότυπο, χωρίς πρόσβαση στη βάση δεδομένων πέρα από τον έλεγχο αποκλεισμού και χωρίς γραμμή καταγραφής. Ο έλεγχος έναντι της λευκής λίστας, των λιστών απειλών και των κανόνων χωρών εκτελείται από τη μνήμη cache μέσω ταξινομημένων εύρων διευθύνσεων — λίγα μικροδευτερόλεπτα, ακόμη και με πάνω από τριάντα χιλιάδες εύρη.

4. Το firewall πετά τον επιτιθέμενο έξω πριν φτάσει

Η λίστα αποκλεισμού δημοσιεύεται ως λίστα RBL, την οποία το HAProxy και το OPNsense διαβάζουν απευθείας. Ο επιτιθέμενος δεν φτάνει έτσι πια στον web server καθόλου — ούτε σε οποιαδήποτε άλλη υπηρεσία στον ίδιο host. Μια πρόσβαση που αναγνωρίστηκε μία φορά ως κακόβουλη προστατεύει έτσι αναδρομικά ολόκληρο το μηχάνημα.

Τρία επίπεδα: αποκλεισμός, καταμέτρηση, αναφορά

Δεν είναι κάθε αίτημα στο κενό μια επίθεση. Γι' αυτό το Web RBL διακρίνει τρία επίπεδα, και το επίπεδο μπορεί να αλλάξει ανά μοτίβο, χωρίς να αγγίξετε τον κώδικα.

ΕπίπεδοΤο αίτημα που το προκαλείΣυνέπεια για τη διεύθυνση
αποκλεισμόςαπορρίπτεταιαποκλεισμός για 24 ώρες, μόνιμα μετά από τρεις ύποπτες ημέρες
καταμέτρησηπερνά κανονικάμόνο καταγράφεται, χωρίς αποκλεισμό
αναφοράπερνά κανονικάκαταγράφεται με κείμενο ευρήματος, δεν αποκλείεται ποτέ

Για λίστες απειλών και χώρες υπάρχει και ένα τέταρτο: καμία πρόσβαση στη σύνδεση. Η ιστοσελίδα παραμένει αναγνώσιμη, η φόρμα σύνδεσης και οι διεπαφές είναι κλειστές. Είναι η μέση λύση για ό,τι είναι ύποπτο, αλλά δεν χρειάζεται να είναι κακόβουλο — Tor, ένα εύρος data center, μια χώρα χωρίς πελάτες.

Ποιες επιθέσεις αναγνωρίζονται

Όλα τα μοτίβα έχουν ελεγχθεί με πραγματική κίνηση. Ο αριθμός των διαφορετικών διευθύνσεων βρίσκεται σκόπιμα δίπλα τους — δείχνει αν ένα μοτίβο πλήττει έναν μεμονωμένο σαρωτή ή μια διαδεδομένη τακτική.

Κατηγορία επίθεσηςΑιτήματαΔιευθύνσεις
Υφαρπαγή .env57.721223
Ανιχνευτές PHP12.237256
Path traversal με επικερδή στόχο10.04664
Αρχεία ρυθμίσεων5.535114
Κλειδιά πρόσβασης cloud4.388152
Ανιχνευτές WordPress3.366385
Υφαρπαγή .git2.811255
Εξερεύνηση Odoo (διαχειριστής βάσεων δεδομένων, ερώτημα έκδοσης)2.500213
Αλυσίδες εργαλείων ΤΝ και εκτέλεση εντολών (/mcp, /api/fs/exec)2.45074
Οδηγίες κατασκευής (CI/CD)1.90788
Endpoints GraphQL1.87871

Αξιοσημείωτη είναι η νεότερη κατηγορία. Το /api/fs/exec ζητήθηκε 369 φορές από 54 διαφορετικές διευθύνσεις — αυτό δεν είναι πρόσβαση ανάγνωσης, αλλά απόπειρα εκτέλεσης εντολών. Τέτοιοι στόχοι δεν υπήρχαν πριν από δύο χρόνια· προέρχονται από διεπαφές νέων εργαλείων ΤΝ και ουρών εργασιών. Όποιος προσανατολίζει την άμυνά του μόνο στο WordPress και στην PHP, δεν βλέπει τίποτα από αυτά. Στη βαθμολογία αυτή η κατηγορία έχει αντίστοιχα μεγάλο βάρος.

Λίστες απειλών και χώρα προέλευσης

Λίστες απειλών Web RBL: Tor, Spamhaus DROP, FireHOL, blocklist.de

Τέσσερις λίστες, 32.851 εύρη διευθύνσεων, όλες στο «μόνο αναφορά». Κάθε επιπλέον λίστα είναι μια διεύθυνση και ένα επίπεδο.

Μια ξένη λίστα είναι ένας ισχυρισμός που διατυπώνει κάποιος άλλος, για λόγους που δεν γνωρίζουμε, σχετικά με κίνηση που δεν έχουμε δει ποτέ. Μπορεί να είναι λανθασμένη, παλιά ή προορισμένη για άλλο σκοπό: το blocklist.de συλλέγει κυρίως διευθύνσεις που δοκίμασαν αλλού συνδέσεις SSH, και αυτό λέει λίγα για έναν web server. Γι' αυτό το Web RBL κρατά τις ξένες λίστες ξεχωριστά από τη δική του λίστα αποκλεισμού, και γι' αυτό η προεπιλογή είναι αναφορά. Και η δική μας λευκή λίστα κερδίζει πάντα: ένας πελάτης που γνωρίζουμε, βαραίνει περισσότερο από την εκτίμηση ενός τρίτου.

Η χώρα προέλευσης αναγράφεται σε κάθε καταγραφή και κάθε διεύθυνση. Για την αξιολόγηση είναι αναντικατάστατη — μια απόπειρα σύνδεσης από τη δική μας χώρα στις δέκα το πρωί είναι κάτι διαφορετικό από μια από μια χώρα χωρίς ούτε έναν πελάτη. Για γενικό αποκλεισμό δεν ενδείκνυται, και το λένε τα δικά μας στοιχεία: οι επιτιθέμενοι στη λίστα μας προέρχονταν κυρίως από περιοχές cloud στο Βέλγιο, τη Φινλανδία και τις Κάτω Χώρες. Ένας αποκλεισμός για ό,τι βρίσκεται εκτός του γερμανόφωνου χώρου δεν θα τους είχε πετύχει — θα είχε όμως πλήξει δικούς μας συνεργάτες σε διακοπές και πελάτες σε επαγγελματικά ταξίδια.

Κανόνες χωρών Web RBL: παραδίδονται κενοί, με επεξήγηση

Οι κανόνες χωρών παραδίδονται κενοί, και η προβολή εξηγεί γιατί.

Αναφορά εσφαλμένων ρυθμίσεων αντί για αποκλεισμό

Η συχνότερη περίπτωση στην πραγματική κίνηση δεν είναι ούτε επίθεση ούτε επισκέπτης, αλλά ελαττωματικό λογισμικό που περνά τον web server για κάτι άλλο:

  • 1.367 κλήσεις της διεπαφής ιστού ενός NAS QNAP — ένας πελάτης συγχρονισμού, του οποίου ο στόχος δεν ισχύει πια. Μία μόνο σύνδεση χτύπησε 962 φορές.
  • 65 ερωτήματα Autodiscover — ένα Outlook που θεωρεί το domain του ιστότοπου ως τον Exchange του

Τέτοιες διευθύνσεις δεν αποκλείονται ποτέ. Ένας αποκλεισμός δεν διορθώνει το ελάττωμα, το κρύβει — και πλήττει εκείνον του οποίου η συσκευή είναι ήδη λάθος ρυθμισμένη. Αντί γι' αυτό δημιουργείται μια καταχώριση με κείμενο ευρήματος και τα επηρεαζόμενα domains, από την οποία κατόπιν αιτήματος δημιουργείται αυτόματα ένα ticket: ακριβώς ένα ανά διεύθυνση, και αν κλείσει και η διεύθυνση εμφανιστεί ξανά, ανοίγει πάλι το ίδιο ticket, αντί να δημιουργηθεί δεύτερο.

Αναγνωρίζονται QNAP, Synology, Exchange Autodiscover, ActiveSync καθώς και πελάτες WebDAV, CalDAV και CardDAV. Τα μοτίβα αναφέρουν ακριβή ονόματα αρχείων και καταλόγους, ποτέ απλές καταλήξεις: Στον ίδιο κατάλογο /cgi-bin/ βρίσκονται οι αθώες κλήσεις συγχρονισμού ακριβώς δίπλα σε κλασικούς ανιχνευτές όπως το printenv.pl.

Η λευκή λίστα: διευθύνσεις που δεν αποκλείονται ποτέ

Το τίμημα ενός λάθους δεν είναι το ίδιο για όλες τις διευθύνσεις. Σε έναν σαρωτή από data center ένας ψευδής συναγερμός δεν κοστίζει τίποτα. Στο απέναντι άκρο μιας σήραγγας τοποθεσίας κοστίζει την τοποθεσία.

Γι' αυτό υπάρχει μια δεύτερη λίστα, που προηγείται της πρώτης: διευθύνσεις και δίκτυα που δεν αποκλείονται ποτέ. Δεν θέτει τίποτα σε σίγαση — όποιος βρίσκεται σε αυτήν, εξακολουθεί να ελέγχεται και να καταγράφεται, απλώς παραλείπεται η συνέπεια. Αυτή είναι η διαφορά από μια εξαίρεση στο firewall: εκείνη τυφλώνει, αυτή απλώς κάνει υπομονετικό.

Γεμίζει καθημερινά από δύο πηγές: από το ίδιο το firewall με όλα τα απέναντι άκρα VPN, ώστε μια νέα σήραγγα να μην εξαρτάται από το αν κάποιος θα σκεφτεί τη λίστα αποκλεισμού — και από τα δημοσιευμένα εύρη διευθύνσεων της Google και της Microsoft για τους crawlers τους. Μόνο έτσι διακρίνεται ένας αληθινός Googlebot από έναν σαρωτή που αποκαλείται έτσι. Οι μηχανές αναζήτησης δεν πρέπει να αποκλείονται ποτέ· όποιος τις αποκλείει, αποσύρει τον ιστότοπό του από την ευρετηρίαση χωρίς δυνατότητα επιστροφής.

Εδώ ισχύει ένας κανόνας πιο σημαντικός από την αντιπαραβολή: Μια κενή απάντηση δεν διαγράφει ποτέ. Αν η πηγή δεν απαντά, απαντά με κενό ή ακατανόητο περιεχόμενο, η λίστα μένει αμετάβλητη. Μια λευκή λίστα που αδειάζει μόνη της σε περίπτωση βλάβης παρασύρει, τη χειρότερη δυνατή στιγμή, όλες τις σήραγγες.

Αν μια καταχώριση της λευκής λίστας φέρει πελάτη, κάθε καταγραφή από το δίκτυό του αντιστοιχίζεται σε αυτόν. Μια εσφαλμένη ρύθμιση έχει έτσι αμέσως κάποιον υπεύθυνο επικοινωνίας, χωρίς να χρειάζεται να αναζητήσει κανείς διευθύνσεις.

Υποχρεωτικά στοιχεία και αυτοματοποιημένοι συλλέκτες δεδομένων

Η νομική σημείωση (Impressum) δεν είναι μια συνηθισμένη σελίδα. Πρέπει να παραμένει προσβάσιμη σε ανθρώπους, διότι ένας αποκλεισμός σε αυτήν δημιουργεί ακριβώς την παράβαση που αναζητά ένας συλλέκτης. Ταυτόχρονα είναι η σελίδα όπου αναγράφονται όνομα και διεύθυνση — και άρα ο στόχος της μηχανικής συγκομιδής.

Στο αυστριακό κύμα προειδοποιητικών επιστολών (Abmahnwelle) για ενσωματωμένες γραμματοσειρές Google, τα αρχεία καταγραφής έδειξαν ότι οι επιστολές δεν προέρχονταν από μεμονωμένες επισκέψεις, αλλά από μια αυτοματοποιημένη γενική επιδρομή: διαφορετικοί, άσχετοι μεταξύ τους hosts με διαφορά χιλιοστών του δευτερολέπτου.

Το Web RBL το λύνει με υποβάθμιση αντί για εξαίρεση. Η κανονική διαδρομή /impressum δεν ταιριάζει με κανένα μοτίβο και παραμένει πάντα προσβάσιμη. Ξένες γραφές όπως /impressum.php — που δεν μπορούν να υπάρχουν σε μια σελίδα Odoo — αναφέρονται, και όποιος δεν θέλει να ανεχτεί τη μηχανική συγκομιδή, αλλάζει μια παράμετρο. Τα sitemap και robots εξαιρούνται και κατά βάση δεν μπορούν να αποκλειστούν: δεν περιέχουν προσωπικά δεδομένα, και η ανάκτησή τους είναι το έργο κάθε crawler μηχανής αναζήτησης.

Domain και αναγνωριστικό: ό,τι λείπει από το αρχείο καταγραφής πρόσβασης

Το αρχείο καταγραφής πρόσβασης του werkzeug δεν γράφει ούτε τον host που προσεγγίστηκε ούτε το αναγνωριστικό του καλούντος. Το Odoo λαμβάνει φυσικά και τα δύο — χωρίς τον host δεν θα μπορούσε, με πολλές ιστοσελίδες, να επιλέξει τη σωστή. Εκ των υστέρων όμως δεν μπορεί να αναζητηθεί.

Το Web RBL καταγράφει και τα δύο σε κάθε εγγραφή. Αυτό απαντά σε δύο ερωτήματα που αλλιώς δεν απαντώνται: ποια ιστοσελίδα προσεγγίζει μια εσφαλμένη ρύθμιση — και συνεπώς σε ποιον πελάτη ανήκει το domain — και αν μια διεύθυνση επισκέπτεται μία σελίδα ή όλες. Πολλά άσχετα μεταξύ τους domains από την ίδια διεύθυνση είναι το γνώρισμα της γενικής επιδρομής, και αυξάνουν τη βαθμολογία.

Πόσο μετράει το αναγνωριστικό, έδειξε μια ανάλυση σε μία από τις ιστοσελίδες μας: πάνω από εβδομήντα τοις εκατό της συνολικής κίνησης αντιστοιχούσε εκεί σε έναν μόνο καλούντα, κατανεμημένο σε πάνω από εκατό διευθύνσεις. Χωρίς το αναγνωριστικό αυτό θα έμοιαζε με κατανεμημένο scraper. Ήταν ο GPTBot, ο crawler της OpenAI — ζητούσε συνεχώς το robots.txt και συμπεριφερόταν απολύτως σωστά.

Οι πτυχές ασφαλείας αναλυτικά

1. Η αναγνώριση proxy — το πιο επικίνδυνο σημείο απ' όλα

Αν το Odoo τρέχει πίσω από reverse proxy και το proxy_mode είναι λάθος ρυθμισμένο, το module βλέπει σε κάθε αίτημα την ίδια διεύθυνση: του proxy. Ένας αποκλεισμός θα έκλεινε τότε την πόρτα σε όλους τους επισκέπτες ταυτόχρονα.

Γι' αυτό το Web RBL ελέγχει πριν από κάθε αποκλεισμό αν ο προσδιορισμός της διεύθυνσης είναι αξιόπιστος. Απαιτεί το proxy_mode μαζί με κεφαλίδα προώθησης, αρνείται να λειτουργήσει αν φτάσει προώθηση χωρίς proxy_mode, και αρνείται επίσης όταν υπάρχουν περισσότεροι από ένας ενδιάμεσοι proxy. Σε περίπτωση αμφιβολίας δεν γίνεται αποκλεισμός.

2. Ποτέ τα δικά σας δίκτυα

Οι ιδιωτικές περιοχές διευθύνσεων, το loopback, το link-local και το CGNAT εξαιρούνται μόνιμα. Δεν μπορούν υπό καμία συνθήκη να καταλήξουν στη λίστα, ούτε με το χέρι. Το ίδιο ισχύει για ξένες λίστες: ιδιωτικές και δεσμευμένες περιοχές καθώς και παράλογα μεγάλα δίκτυα απορρίπτονται κατά την ανάγνωση.

3. Ένα δικό του σφάλμα δεν πρέπει να παρασύρει την ιστοσελίδα

Ολόκληρος ο έλεγχος εκτελείται μέσα σε μια ασφαλιστική δικλίδα που πιάνει κάθε σφάλμα. Ό,τι στραβώσει εδώ καταγράφεται, και το αίτημα συνεχίζει αμετάβλητο. Ένα module προστασίας που, σε περίπτωση δικού του σφάλματος, παρασύρει την ιστοσελίδα, είναι χειρότερο από κανένα. Όλα τα ερωτήματα στη διαδρομή του αιτήματος εκτελούνται επιπλέον χωρίς τη γλώσσα του προγράμματος περιήγησης του επισκέπτη και χωρίς ταξινόμηση κατά μεταφρασμένα πεδία — ένας επισκέπτης με μη εγκατεστημένη γλώσσα δεν πρέπει να προκαλεί αποτυχία του ελέγχου.

4. Παρατήρηση πριν από αποκλεισμό

Μετά την εγκατάσταση ο αποκλεισμός καταχωρισμένων διευθύνσεων σε συνηθισμένα αιτήματα είναι απενεργοποιημένος. Οι ανιχνευτές απορρίπτονται και καταγράφονται, όλα τα άλλα περνούν. Έτσι μπορείτε να παρακολουθείτε για μερικές ημέρες ποιος πράγματι καταλήγει στη λίστα, πριν αποκλειστεί κάποιος. Ισχύει το ίδιο για την ανίχνευση συμπεριφοράς, τις λίστες απειλών και τους κανόνες χωρών: πρώτα αναφορά, αποκλεισμός μετά από εκτίμηση.

5. Στενά μοτίβα αντί για πλατιά δίχτυα

Ένας λανθασμένα αναγνωρισμένος επισκέπτης κοστίζει περισσότερο από έναν ανιχνευτή που ξέφυγε. Κάθε μοτίβο φέρει γι' αυτό το επίπεδό του, και αυτό μπορεί να αλλάξει ανά μοτίβο. Μια κατάληξη αρχείου από μόνη της σπάνια αρκεί: στο .php αντιστοιχούν 14.012 πραγματικοί ανιχνευτές έναντι μιας χούφτας παλιών συνδέσμων, στο .asp η αναλογία είναι αντίστροφη. Τέτοιες αποφάσεις πρέπει να μετριούνται, όχι να εκτιμώνται.

6. Μια χειροκίνητη άρση αποκλεισμού παραμένει

Όποιος απελευθερώνει μια διεύθυνση, είχε λόγο. Μια ακόμη καταγραφή δεν ακυρώνει σιωπηρά αυτή την απόφαση.

7. Η λίστα είναι προστατευμένη, αλλά όχι μυστική

Το endpoint απαιτεί token και, χωρίς έγκυρο token, απαντά με 404, όχι με 403 — έτσι δεν επιβεβαιώνεται καν η ύπαρξη της διεύθυνσης. Η σύγκριση γίνεται σε σταθερό χρόνο. Η ίδια η λίστα δεν περιέχει τίποτα εμπιστευτικό: αποτελείται από διευθύνσεις που χτύπησαν μόνες τους την πόρτα μας.

8. Κανένα μυστικό στο ημερολόγιο καταγραφών

Στις αποτυχημένες συνδέσεις καταγράφεται το όνομα χρήστη που δοκιμάστηκε, ποτέ ο κωδικός πρόσβασης. Στον διαχειριστή βάσεων δεδομένων δεν διαβάζεται από τις παρεχόμενες τιμές απολύτως τίποτα: εκεί βρίσκεται πρώτος ο κύριος κωδικός πρόσβασης, και μια καταχώριση σε λίστα αποκλεισμού μεταφέρεται σε κάθε αντίγραφο ασφαλείας της βάσης δεδομένων. Το κλειδί άδειας για το GeoLite2 βρίσκεται μόνο στην παράμετρο συστήματος και σε καμία γραμμή καταγραφής.

9. Το δόλωμα δεν προδίδει τίποτα αξιοποιήσιμο

Προαιρετικά το Web RBL απαντά στους ανιχνευτές με επινοημένο περιεχόμενο που περιέχει μια μοναδική τιμή καναρινιού. Όποιος ανακτήσει αργότερα αυτή την τιμή, έχει διαβάσει την πλαστή απάντηση και έχει δράσει με βάση αυτήν — ένας ψευδής συναγερμός αποκλείεται. Τα δολώματα δεν περιέχουν αξιοποιήσιμα στοιχεία, πραγματικές διαδρομές ή έγκυρα διαπιστευτήρια. Αυτή η λειτουργία παραδίδεται απενεργοποιημένη, διότι αλλάζει τη συμπεριφορά προς τα έξω με ορατό τρόπο.

Τι δεν μπορεί να κάνει το module

Δεν αντικαθιστά ούτε firewall ούτε Web Application Firewall. Αναγνωρίζει γνωστά μοτίβα ανίχνευσης σε διαδρομές, αποτυχημένες συνδέσεις και ύποπτη συμπεριφορά — όχι επιθέσεις σε φόρμες, ούτε απόπειρες έγχυσης σε παραμέτρους.

Βλέπει επίσης μόνο ό,τι επιστρέφει μέσω HTTP. Ό,τι κάνει ένας επιτιθέμενος με αποσπασμένες προσβάσεις σε βάση δεδομένων ή γραμματοκιβώτιο, παραμένει αόρατο — και ακριβώς γι' αυτό οι τιμές καναρινιού είναι διαδρομές και όχι διαπιστευτήρια.

Και δεν αντικαθιστά τη σχολαστικότητα: ένα module που απορρίπτει ανιχνευτές .env δεν κάνει ακίνδυνο ένα αρχείο .env που παραδόθηκε κατά λάθος.

Διαθεσιμότητα

Το Web RBL διατίθεται δημόσια υπό την AGPL-3 και τρέχει σε παραγωγή σε πέντε ιστοσελίδες μας:

github.com/Alex0176/odoo-web-rbl

Το module απαιτεί Odoo 19 Community και δεν έχει εξαρτήσεις πέρα από τα base και web. Η σύνδεση με ticket είναι προαιρετική και δεν απαιτεί συγκεκριμένο σύστημα ticket· χωρίς τέτοιο σύστημα απλώς δεν συμβαίνει τίποτα. Η χώρα προέλευσης χρειάζεται τη δωρεάν βάση δεδομένων GeoLite2 της MaxMind· αν λείπει, το πεδίο μένει κενό και όλα τα υπόλοιπα λειτουργούν αμετάβλητα.

Για περισσότερα: Πώς εντάσσεται το Web RBL σε μια ολοκληρωμένη αρχιτεκτονική ασφαλείας -- μαζί με firewall, έλεγχο ταυτότητας δύο παραγόντων και δικαιώματα, με οδηγό βήμα προς βήμα: Odoo 19: συνδυάστε σωστά την αρχιτεκτονική ασφαλείας.

Ερωτήσεις, παρατηρήσεις και αναφορές σφαλμάτων δεχόμαστε ευχαρίστως — κατά προτίμηση ως Issue στο GitHub.