Πηγαίος κώδικας: github.com/Alex0176/odoo-web-rbl — AGPL-3, ελεύθερη χρήση.
Όποιος λειτουργεί έναν διακομιστή Odoo στο διαδίκτυο δέχεται επισκέψεις. Όχι περιστασιακά, αλλά ασταμάτητα. Σε διάστημα δεκαεπτά ημερών καταγράψαμε και αναλύσαμε 731.297 αιτήματα στους πέντε ιστοτόπους μας. Τα 110.511 από αυτά δεν προέρχονταν από επισκέπτες, αλλά από αυτοματοποιημένες αναζητήσεις για ευπάθειες, διαπιστευτήρια πρόσβασης και αρχεία ρυθμίσεων.
Αυτό το άρθρο παρουσιάζει το Web RBL, μια μονάδα ανοιχτού κώδικα για το Odoo 19 Community, η οποία εντοπίζει, αξιολογεί, καταγράφει και απορρίπτει αυτή την κίνηση — και δημοσιεύει τη λίστα αποκλεισμού ως λίστα RBL, δηλαδή στη μορφή που μπορούν να διαβάσουν απευθείας τα τείχη προστασίας και οι αντίστροφοι διαμεσολαβητές. Όλα τα στοιχεία προέρχονται από πραγματική λειτουργία.
Τι μπορεί να κάνει η μονάδα — επισκόπηση λειτουργιών
| Λειτουργία | Τι κάνει | Προεπιλεγμένη ρύθμιση |
|---|---|---|
| Αναγνώριση μοτίβων | Εντοπίζει διερευνητικές απόπειρες βάσει διαδρομής και επέκτασης: .env, .git, αρχεία ρυθμίσεων, κλειδιά πρόσβασης στο cloud, οδηγίες δημιουργίας εκδόσεων CI/CD, WordPress, PHP, διάσχιση διαδρομών, εργαλεία διαχείρισης βάσεων δεδομένων, GraphQL, εκτέλεση εντολών μέσω /api/fs/exec και παρόμοιων διεπαφών | αποκλεισμός |
| Τρεις επιλογές ανά μοτίβο | αποκλεισμός, καταμέτρηση ή αναφορά — ρυθμίζονται ανά μοτίβο, χωρίς κώδικα | ανά μοτίβο |
| Όρια | Πλήθος ανιχνεύσεων του ίδιου μοτίβου πριν από τον αποκλεισμό· δέκα για τις συνδέσεις | 10 κατά τη σύνδεση |
| Προστασία σύνδεσης | Αποτυχημένες συνδέσεις μέσω της φόρμας και μέσω XML-RPC/JSON-RPC, αποτυχημένοι έλεγχοι συνεδρίας, προσβάσεις στο εργαλείο διαχείρισης βάσεων δεδομένων — καταγραφή στη βάση δεδομένων, όχι στη μνήμη RAM | ενεργό |
| Ανίχνευση bot κατά τη σύνδεση | Όποιος αγνοεί το μήνυμα αναμονής μετά από δέκα αποτυχημένες προσπάθειες και συνεχίζει να επιχειρεί σύνδεση αποκλείεται αμέσως | αποκλεισμός |
| Ανίχνευση βάσει συμπεριφοράς | Διευθύνσεις που μέσα σε πέντε λεπτά προκαλούν είκοσι αποκρίσεις σφάλματος και σχεδόν καμία επιτυχημένη απόκριση — δηλαδή μαντεύουν διευθύνσεις αντί να διαβάζουν περιεχόμενο | αναφορά |
| Βαθμολογία 0–100 | Πόσο βέβαιο είναι ότι πίσω από τη διεύθυνση βρίσκεται κάποιος επιτιθέμενος; Η εκτίμηση βασίζεται στη σοβαρότητα του μοτίβου, στο πλήθος διαφορετικών μοτίβων, στις ημέρες με ύποπτη δραστηριότητα, στους επηρεαζόμενους τομείς και στο πλήθος ανιχνεύσεων — με αιτιολόγηση σε απλή γλώσσα | ενεργό |
| Αποκλεισμός σύνδεσης βάσει βαθμολογίας | Από ένα ρυθμιζόμενο όριο βαθμολογίας και πάνω, η σύνδεση απαγορεύεται, ενώ ο ιστότοπος παραμένει διαθέσιμος για ανάγνωση | από 40 |
| Υποψία κλοπής στοιχείων πρόσβασης | Μια επιτυχημένη σύνδεση από ύποπτη διεύθυνση αναφέρεται και, προαιρετικά, ανατίθεται ως εργασία — μία φορά ανά διεύθυνση την ημέρα | ενεργό |
| Λίστες απειλών | Προρυθμισμένες λίστες για κόμβους εξόδου Tor, Spamhaus DROP, FireHOL Level 1 και blocklist.de· δυνατότητα προσθήκης οποιασδήποτε άλλης λίστας RBL μέσω διεύθυνσης, καθημερινός συγχρονισμός, ξεχωριστό επίπεδο για κάθε λίστα | αναφορά |
| Χωρίς πρόσβαση στη σύνδεση | Το τέταρτο επίπεδο για λίστες και χώρες: ο ιστότοπος παραμένει διαθέσιμος για ανάγνωση, ενώ η φόρμα σύνδεσης και οι διεπαφές αποκλείονται — η κατάλληλη αντιμετώπιση για το Tor | Επιλογή |
| Χώρα προέλευσης | Χώρα για κάθε καταγεγραμμένο συμβάν και διεύθυνση μέσω GeoLite2· η μονάδα ενημερώνει αυτόματα τη βάση δεδομένων με ένα δωρεάν κλειδί άδειας χρήσης | εμφάνιση |
| Κανόνες ανά χώρα | Αποκλεισμός, απαγόρευση πρόσβασης στη σύνδεση, αναφορά ή ρητή άδεια πρόσβασης — ανά χώρα, σκόπιμα χωρίς προεπιλογή | κανένας |
| Λανθασμένες ρυθμίσεις | Τα QNAP, Synology, Exchange-Autodiscover, ActiveSync και WebDAV/CalDAV/CardDAV αναγνωρίζονται, δεν αποκλείονται ποτέ και προστίθενται σε λίστα εργασιών με περιγραφή του ευρήματος και το επηρεαζόμενο domain | αναφορά |
| Αίτημα υποστήριξης ανά διεύθυνση | Από ένα εύρημα δημιουργείται προαιρετικά ένα αίτημα υποστήριξης — ακριβώς ένα ανά διεύθυνση· αν έχει κλείσει, ανοίγει ξανά αντί να δημιουργηθεί δεύτερο | ανενεργό |
| Υποχρεωτικές σελίδες και συλλέκτες δεδομένων | Η κανονική διαδρομή της σελίδας νομικών στοιχείων παραμένει πάντα προσβάσιμη· οι αυτοματοποιημένες δοκιμές εναλλακτικών γραφών που δεν χρησιμοποιεί ο ιστότοπος αναγνωρίζονται και, προαιρετικά, αποκλείονται | αναφορά |
| Λίστα επιτρεπόμενων | Διευθύνσεις και δίκτυα που δεν αποκλείονται ποτέ· η λίστα συμπληρώνεται καθημερινά από το τείχος προστασίας (απομακρυσμένα άκρα VPN) και από τα δημοσιευμένα εύρη διευθύνσεων των Googlebot και Bingbot | ενεργό |
| Αντιστοίχιση σε πελάτη | Ένα συμβάν από το δίκτυο ενός πελάτη αντιστοιχίζεται σε αυτόν — βάσει της λίστας επιτρεπόμενων, ποτέ με χειροκίνητες εικασίες | ενεργό |
| Domain και αναγνωριστικό ανά συμβάν | Σε ποιον ιστότοπο απευθύνθηκε το αίτημα και με ποιο User-Agent — και τα δύο λείπουν από το αρχείο καταγραφής πρόσβασης | ενεργό |
| Ανάλυση | Διάγραμμα και συγκεντρωτικός πίνακας για όλα τα συμβάντα: ανά μοτίβο, ημέρα, domain, χώρα και διεύθυνση | ενεργό |
| Δολώματα | Τα διερευνητικά αιτήματα λαμβάνουν κατασκευασμένες απαντήσεις με μια τιμή-δόλωμα· όποιος τη ζητήσει αργότερα έχει διαβάσει αυτές τις απαντήσεις | ανενεργό |
| Διάθεση λίστας RBL | Η λίστα αποκλεισμού ως απλή λίστα διευθύνσεων ή JSON σε ξεχωριστή διεύθυνση που προστατεύεται με token — για HAProxy, OPNsense και κάθε τείχος προστασίας που διαβάζει λίστες από URL | ενεργό |
Όσα παρέχονται με τη ρύθμιση αναφορά, ανενεργό ή Επιλογή έχουν ρυθμιστεί έτσι σκόπιμα: όποιος ενεργοποιεί έναν αποκλεισμό πρέπει να το κάνει επειδή παρακολούθησε για μερικές ημέρες ποιους εντοπίζει — και όχι επειδή έτσι όριζε η προεπιλογή.
Η ανάλυση: συμβάντα ανά μοτίβο σε διάστημα επτά ημερών. Η ψηλότερη στήλη αντιστοιχεί στην αναζήτηση αρχείων .env.
Λίστες RBL: ένας τυποποιημένος τρόπος διάθεσης λιστών αποκλεισμού
Το RBL σημαίνει Real-time Blackhole List. Ο όρος προέρχεται από τον κόσμο του email, όπου η Spamhaus και άλλοι δημοσιεύουν από τη δεκαετία του ενενήντα λίστες κακόβουλων διευθύνσεων αποστολέων. Η αρχή είναι παραπάνω από απλή και γι' αυτό τόσο διαδεδομένη: μία διεύθυνση ανά γραμμή, προσβάσιμη μέσω HTTP, επαναφορτωμένη τακτικά. Καμία μορφή που πρέπει πρώτα να αναλυθεί, καμία διεπαφή για την οποία χρειάζεται εργαλείο.
Σχεδόν κάθε τείχος προστασίας και κάθε αντίστροφος διακομιστής μεσολάβησης μπορεί να διαβάσει μια τέτοια λίστα και να δημιουργήσει κανόνες βάσει αυτής. Οι κατασκευαστές χρησιμοποιούν διαφορετικές ονομασίες, αλλά ο μηχανισμός είναι παντού ο ίδιος:
- OPNsense και pfSense — URL Table Alias: φόρτωση λίστας διευθύνσεων μέσω HTTP, χρήση ως ψευδωνύμου σε κανόνες του τείχους προστασίας, ενημέρωση ανά ώρα ή ημέρα
- HAProxy — αρχεία ACL και Maps:
src -f sperrliste.txtσε κανόναhttp-request deny, με δυνατότητα επαναφόρτωσης μέσω του API χρόνου εκτέλεσης χωρίς επανεκκίνηση - nginx — μονάδα geo με ενσωματωμένο αρχείο διευθύνσεων ή οδηγίες
denyαπό ένα παραγόμενο αρχείοinclude - Fortinet FortiGate — External Block List ή Threat Feed: ένα URL από το οποίο το τείχος προστασίας αντλεί μια λίστα IP και τη χρησιμοποιεί στις πολιτικές του
- Palo Alto Networks — External Dynamic List (EDL): η ίδια αρχή, ως ξεχωριστός τύπος αντικειμένου στις πολιτικές ασφαλείας
- Check Point — Προσαρμοσμένες ροές πληροφοριών απειλών και λίστες αποκλεισμού IP μέσω URL
- Cisco Secure Firewall (Firepower) — Security Intelligence Feeds με δικές σας πηγές λιστών
- Sophos Firewall — Third-Party Threat Feeds: λίστες διευθύνσεων από URL ως πηγή για κανόνες αποκλεισμού
- Juniper SRX — Dynamic Address Entries από ροές δεδομένων
- MikroTik RouterOS — Address Lists, που συμπληρώνονται από URL μέσω σεναρίου και
fetch - CrowdSec — δικές σας λίστες ως πηγή για τα Bouncers σε κάθε υποστηριζόμενο σύστημα
Το Web RBL διαθέτει τη λίστα αποκλεισμού του ακριβώς σε αυτή τη μορφή. Το τείχος προστασίας απορρίπτει τα πακέτα πριν φτάσουν στον διακομιστή ιστού — και μαζί τους κάθε άλλη απόπειρα από την ίδια διεύθυνση, για παράδειγμα προς τον διακομιστή αλληλογραφίας ή την πύλη VPN.
Και προς τις δύο κατευθύνσεις, αλλά στο σωστό σημείο
Η διαδικασία λειτουργεί και αντίστροφα: στο Web RBL μπορεί να προστεθεί οποιαδήποτε λίστα RBL — ένα URL, ένα επίπεδο και τελειώσατε. Οι κόμβοι εξόδου Tor, οι Spamhaus DROP, FireHOL και blocklist.de είναι προρυθμισμένοι, ενώ άλλες λίστες προστίθενται με τρία κλικ. Η μονάδα αναλύει κάθε λίστα σε εύρη διευθύνσεων και ελέγχει κάθε αίτημα βάσει αυτών, μέσα σε λίγα μικροδευτερόλεπτα.
Ωστόσο: είναι προτιμότερο οι λίστες τρίτων να χρησιμοποιούνται στο τείχος προστασίας που προηγείται. Για τρεις λόγους. Το τείχος προστασίας βλέπει όλες τις υπηρεσίες, όχι μόνο το HTTP — μια διεύθυνση από τη λίστα της Spamhaus πρέπει να αποκλείεται και από τον διακομιστή αλληλογραφίας και από το VPN. Απορρίπτει τα πακέτα πριν καν δημιουργηθεί σύνδεση, χωρίς να επιβαρύνει καθόλου τον διακομιστή εφαρμογών. Και είναι το σημείο όπου ούτως ή άλλως συντηρούνται τέτοιες λίστες· ένα δεύτερο αντίγραφο στην εφαρμογή είναι ένα δεύτερο σημείο που μπορεί να μείνει χωρίς ενημέρωση.
Σε τι χρησιμεύουν λοιπόν οι λίστες μέσα στη μονάδα; Σε όσα δεν μπορεί να κάνει ένα τείχος προστασίας. Το τείχος προστασίας δεν αναγνωρίζει τη φόρμα σύνδεσης. Το Web RBL μπορεί να αρνηθεί σε μια διεύθυνση της λίστας Tor την πρόσβαση στη σύνδεση, συνεχίζοντας παράλληλα να προβάλλει τον ιστότοπο — όποιος θέλει να διαβάζει ανώνυμα πρέπει να μπορεί να το κάνει· όποιος θέλει να δοκιμάζει κωδικούς πρόσβασης ανώνυμα, όχι. Μπορεί επίσης να αναφέρει ως ύποπτο περιστατικό μια επιτυχημένη σύνδεση από διεύθυνση που περιλαμβάνεται σε λίστα. Και οι δύο λειτουργίες απαιτούν τη λίστα στο σημείο όπου πραγματοποιείται η σύνδεση.
Βαθμολογία αντί για διαίσθηση
Μια διεύθυνση που ζήτησε μία φορά το /wp-login.php
είναι κάτι διαφορετικό από μια διεύθυνση που σε δύο ημέρες πέρασε με πέντε διαφορετικά
μοτίβα από τρία domains. Το Web RBL το μετατρέπει σε
βαθμολογία από 0 έως 100 — από όσα είδε το ίδιο,
χωρίς εξωτερική υπηρεσία και χωρίς ερώτημα προς τα έξω.
Μία εγγραφή: 99 συμβάντα, βαθμολογία 84 και αιτιολόγηση σε απλή γλώσσα — μοτίβο μέγιστης σοβαρότητας, πέντε διαφορετικά σοβαρά μοτίβα, δύο ημέρες ύποπτης δραστηριότητας, πάνω από είκοσι συμβάντα.
Η βαθμολογία αποφασίζει για δύο πράγματα. Από μια ρυθμιζόμενη τιμή και πάνω η σύνδεση απαγορεύεται — η ιστοσελίδα παραμένει αναγνώσιμη, αλλά όποιος έψαχνε ήδη για διαπιστευτήρια πρόσβασης δεν παίρνει την ευκαιρία να δοκιμάσει όσα βρήκε. Και μια επιτυχής σύνδεση από διεύθυνση με βαθμολογία αναφέρεται: τότε κάποιος δεν μάντεψε πια, αλλά ήξερε. Είτε ο εξουσιοδοτημένος χρήστης ήταν εκτός έδρας, είτε τα διαπιστευτήρια έχουν χαθεί — το module δεν το αποφασίζει, το θέτει ενώπιον κάποιου που μπορεί να ρωτήσει. Ο ίδιος ο κωδικός πρόσβασης δεν αγγίζεται πουθενά.
Η λίστα αποκλεισμού, φιλτραρισμένη για βαθμολογία από 40 και πάνω: πλήθος συμβάντων, ημέρες ύποπτης δραστηριότητας, επηρεαζόμενα domain και η τελευταία διαδρομή ανά διεύθυνση.
Τι προστατεύει το 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 αιτήματα για οδηγίες build όπως
.github/workflows/deploy.ymlή.gitlab-ci.yml, που περιέχουν μητρώα και ονόματα κλειδιών
Το καθοριστικό στοιχείο δεν είναι ο αριθμός των αιτημάτων, αλλά ο αριθμός των διαφορετικών διευθύνσεων: το /credentials.json ζητήθηκε από 98 διευθύνσεις, το /.git-credentials από 92. Δεν πρόκειται για έναν μεμονωμένο σαρωτή, αλλά για ένα καθιερωμένο σύνολο τεχνικών που εφαρμόζεται ταυτόχρονα σε όλο τον κόσμο.
2. Οι απόπειρες σύνδεσης πέφτουν στο κενό — μόνιμα
Το Odoo διαθέτει δικό του μηχανισμό επιβράδυνσης των διαδοχικών δοκιμών κωδικών πρόσβασης. Έχει τρεις περιορισμούς, οι οποίοι τεκμηριώνονται στον ίδιο τον πηγαίο κώδικα του Odoo: ο μετρητής βρίσκεται στη μνήμη RAM της διεργασίας εργασίας και μηδενίζεται σε κάθε επανεκκίνηση, προσθέτει μόνο καθυστέρηση αντί να αποκλείει και μετρά αποκλειστικά τις απόπειρες που φτάνουν μέχρι τον έλεγχο του κωδικού πρόσβασης.
Το Web RBL παρεμβαίνει στα ίδια σημεία, αλλά αποθηκεύει τα δεδομένα στη βάση δεδομένων. Έτσι:
- Η κατάσταση διατηρείται μετά από κάθε επανεκκίνηση και ισχύει σε όλες τις διεργασίες εργασίας
- Καταγράφονται και οι δύο τρόποι πρόσβασης: η φόρμα σύνδεσης
/web/loginκαι οι διεπαφές/xmlrpc/2/commonκαι/jsonrpc - Καταγράφονται επίσης απόπειρες που δεν φτάνουν ποτέ μέχρι τον έλεγχο του κωδικού πρόσβασης — για παράδειγμα, συνδέσεις χωρίς έγκυρο αναγνωριστικό συνεδρίας
- Προσμετράται και η αποτυχημένη πρόσβαση στη διαχείριση βάσεων δεδομένων· πρόκειται για την πιο σοβαρή απόπειρα σύνδεσης
Το όριο για τις συνδέσεις έχει οριστεί στις δέκα απόπειρες, βάσει μιας μέτρησης: από εννέα αποτυχημένες συνδέσεις σε δεκαεπτά ημέρες, οι περισσότερες προέρχονταν από πελάτες που ρύθμιζαν μόνοι τους την πρόσβαση σε μια επιπλέον συσκευή και καταχωρούσαν λάθος domain — σε μία περίπτωση το δικό τους, απλώς με παύλα αντί για τελεία. Επομένως, ένας αποκλεισμός από την πρώτη αποτυχημένη απόπειρα θα έπληττε πελάτες κατά τη ρύθμιση της πρόσβασης, αντί για επιτιθέμενους.
Όποιος, αντίθετα, συνεχίζει τις απόπειρες ενώ ο διακομιστής έχει ήδη απαντήσει «περιμένετε λίγο», αποκλείεται αμέσως. Ένας άνθρωπος διαβάζει αυτό το μήνυμα και περιμένει· όποιος το αγνοεί είναι πρόγραμμα. Ένα ξεχωριστό μοτίβο με μηδενικό όριο καλύπτει ακριβώς αυτή την περίπτωση και δεν μπορεί να πλήξει κάποιον συνάδελφο: σε αυτό το σημείο φτάνει μόνο όποιος έχει ήδη κάνει δέκα αποτυχημένες απόπειρες και συνεχίζει.
3. Η επίθεση δεν επιβαρύνει πλέον τον διακομιστή
Πριν από την εγκατάσταση της μονάδας, ένα διερευνητικό αίτημα σε διαδρομή όπως /@fs/../../.env κόστιζε ακριβά σε πόρους: το Odoo αναζητά τη σελίδα σφάλματος, την αποδίδει, σκοντάφτει στα τμήματα με τελείες κατά τη δημιουργία της διεύθυνσης και στη συνέχεια αποτυγχάνει και στη σελίδα σφάλματος της σελίδας σφάλματος. Δύο καταγραφές στοίβας κλήσεων ανά διερευνητικό αίτημα. Σε δεκαεπτά ημέρες καταγράφηκαν 28.401 τέτοια σφάλματα και επιπλέον 9.467 επακόλουθα σφάλματα.
Το Web RBL παρεμβαίνει στο ir.http._match, δηλαδή πριν από τη δρομολόγηση. Η απάντηση δίνεται χωρίς πρότυπο, χωρίς πρόσβαση στη βάση δεδομένων πέρα από τον έλεγχο αποκλεισμού και χωρίς εγγραφή στο αρχείο καταγραφής. Ο έλεγχος βάσει της λίστας επιτρεπόμενων, των λιστών απειλών και των κανόνων ανά χώρα εκτελείται από την προσωρινή μνήμη σε ταξινομημένα εύρη διευθύνσεων — σε λίγα μικροδευτερόλεπτα, ακόμη και με περισσότερα από τριάντα χιλιάδες εύρη.
4. Το τείχος προστασίας σταματά τον επιτιθέμενο πριν φτάσει
Η λίστα αποκλεισμού δημοσιεύεται ως λίστα RBL, την οποία διαβάζουν απευθείας τα HAProxy και OPNsense. Έτσι, ο επιτιθέμενος δεν φτάνει καν στον διακομιστή ιστού — ούτε σε οποιαδήποτε άλλη υπηρεσία στον ίδιο υπολογιστή. Μια πρόσβαση που αναγνωρίστηκε ως κακόβουλη οδηγεί έτσι εκ των υστέρων στην προστασία ολόκληρου του μηχανήματος.
Τρία επίπεδα: αποκλεισμός, καταμέτρηση, αναφορά
Δεν είναι κάθε αίτημα στο κενό μια επίθεση. Γι' αυτό το Web RBL διακρίνει τρία επίπεδα, και το επίπεδο μπορεί να αλλάξει ανά μοτίβο, χωρίς να αγγίξετε τον κώδικα.
| Επίπεδο | Το αίτημα που ενεργοποιεί τον κανόνα | Συνέπεια για τη διεύθυνση |
|---|---|---|
| αποκλεισμός | απορρίπτεται | Αποκλεισμός για 24 ώρες, μόνιμος μετά από τρεις ημέρες ύποπτης δραστηριότητας |
| καταμέτρηση | διεκπεραιώνεται κανονικά | μόνο καταγραφή, χωρίς αποκλεισμό |
| αναφορά | διεκπεραιώνεται κανονικά | καταγράφεται με περιγραφή του ευρήματος, δεν αποκλείεται ποτέ |
Για τις λίστες απειλών και τις χώρες υπάρχει και τέταρτο επίπεδο: χωρίς πρόσβαση στη σύνδεση. Ο ιστότοπος παραμένει διαθέσιμος για ανάγνωση, ενώ η φόρμα σύνδεσης και οι διεπαφές αποκλείονται. Πρόκειται για την ενδιάμεση λύση για οτιδήποτε είναι ύποπτο, χωρίς να είναι απαραίτητα κακόβουλο — Tor, ένα εύρος διευθύνσεων κέντρου δεδομένων, μια χώρα χωρίς πελάτες.
Ποιες επιθέσεις αναγνωρίζονται
Όλα τα μοτίβα έχουν ελεγχθεί σε πραγματική κίνηση. Ο αριθμός των διαφορετικών διευθύνσεων εμφανίζεται σκόπιμα δίπλα τους — δείχνει αν ένα μοτίβο εντοπίζει έναν μεμονωμένο σαρωτή ή μια ευρέως διαδεδομένη πρακτική.
| Κατηγορία επίθεσης | Αιτήματα | Διευθύνσεις |
|---|---|---|
Υποκλοπή αρχείων .env | 57.721 | 223 |
| Διερευνητικά αιτήματα PHP | 12.237 | 256 |
| Διάσχιση διαδρομών προς στόχους υψηλής αξίας | 10.046 | 64 |
| Αρχεία ρυθμίσεων | 5.535 | 114 |
| Κλειδιά πρόσβασης στο cloud | 4.388 | 152 |
| Διερευνητικά αιτήματα WordPress | 3.366 | 385 |
Υποκλοπή δεδομένων .git | 2.811 | 255 |
| Αναγνώριση Odoo (διαχείριση βάσεων δεδομένων, ερώτημα έκδοσης) | 2.500 | 213 |
Αλυσίδες εργαλείων τεχνητής νοημοσύνης και εκτέλεση εντολών (/mcp, /api/fs/exec) | 2.450 | 74 |
| Οδηγίες build (CI/CD) | 1.907 | 88 |
| Τερματικά σημεία GraphQL | 1.878 | 71 |
Αξιοσημείωτη είναι η νεότερη κατηγορία. Το /api/fs/exec ζητήθηκε 369 φορές από 54 διαφορετικές διευθύνσεις — δεν πρόκειται για πρόσβαση ανάγνωσης, αλλά για απόπειρα εκτέλεσης εντολών. Τέτοιοι στόχοι δεν υπήρχαν πριν από δύο χρόνια· προέρχονται από διεπαφές νέων εργαλείων τεχνητής νοημοσύνης και ουρών εργασιών. Όποιος προσανατολίζει την άμυνά του μόνο στο WordPress και την PHP δεν αντιλαμβάνεται τίποτα από αυτά. Η συγκεκριμένη κατηγορία έχει ανάλογα μεγάλη βαρύτητα στη βαθμολογία.
Λίστες απειλών και χώρα προέλευσης
Τέσσερις λίστες, 32.851 εύρη διευθύνσεων, όλες στη ρύθμιση «μόνο αναφορά». Για κάθε επιπλέον λίστα αρκούν μία διεύθυνση και ένα επίπεδο.
Μια λίστα τρίτου είναι ένας ισχυρισμός κάποιου άλλου, για λόγους που δεν γνωρίζουμε, σχετικά με κίνηση που δεν έχουμε δει ποτέ. Μπορεί να είναι λανθασμένη, παρωχημένη ή προορισμένη για διαφορετικό σκοπό: το blocklist.de συλλέγει κυρίως διευθύνσεις που έχουν δοκιμάσει διαδοχικά στοιχεία σύνδεσης SSH αλλού, κάτι που λέει λίγα για έναν διακομιστή ιστού. Γι’ αυτό το Web RBL διατηρεί τις λίστες τρίτων χωριστά από τη δική του λίστα αποκλεισμού και γι’ αυτό η προεπιλογή είναι αναφορά. Και η δική μας λίστα επιτρεπόμενων υπερισχύει πάντα: ένας πελάτης που γνωρίζουμε έχει μεγαλύτερη βαρύτητα από την εκτίμηση ενός τρίτου.
Η χώρα προέλευσης εμφανίζεται σε κάθε συμβάν και κάθε διεύθυνση. Είναι αναντικατάστατη για την αξιολόγηση — μια απόπειρα σύνδεσης από τη χώρα μας στις δέκα το πρωί διαφέρει από μια απόπειρα από χώρα όπου δεν έχουμε ούτε έναν πελάτη. Προσφέρεται ελάχιστα για γενικευμένους αποκλεισμούς, όπως δείχνουν και τα δικά μας στοιχεία: οι επιτιθέμενοι στη λίστα μας προέρχονταν κυρίως από εύρη διευθύνσεων cloud στο Βέλγιο, τη Φινλανδία και την Ολλανδία. Ένας αποκλεισμός όλων των χωρών εκτός της γερμανόφωνης περιοχής δεν θα τους είχε επηρεάσει — θα είχε όμως πλήξει δικούς μας εργαζομένους σε διακοπές και πελάτες σε επαγγελματικά ταξίδια.
Οι κανόνες ανά χώρα παρέχονται αρχικά κενοί και η προβολή εξηγεί τον λόγο.
Αναφορά λανθασμένων ρυθμίσεων αντί για αποκλεισμό
Η συνηθέστερη περίπτωση στην πραγματική κίνηση δεν είναι ούτε επίθεση ούτε επισκέπτης, αλλά λογισμικό που δυσλειτουργεί και περνά τον διακομιστή ιστού για κάτι άλλο:
- 1.367 κλήσεις στη διαδικτυακή διεπαφή ενός QNAP NAS — ένα πρόγραμμα συγχρονισμού του οποίου ο προορισμός δεν είναι πλέον σωστός. Μία και μόνο σύνδεση δικτύου έκανε 962 απόπειρες.
- 65 ερωτήματα Autodiscover — ένα Outlook που περνά το domain του ιστότοπου για τον δικό του διακομιστή Exchange
Τέτοιες διευθύνσεις δεν αποκλείονται ποτέ. Ένας αποκλεισμός δεν διορθώνει το ελάττωμα, το κρύβει — και πλήττει εκείνον του οποίου η συσκευή είναι ήδη λάθος ρυθμισμένη. Αντί γι' αυτό δημιουργείται μια καταχώριση με κείμενο ευρήματος και τα επηρεαζόμενα domains, από την οποία κατόπιν αιτήματος δημιουργείται αυτόματα ένα ticket: ακριβώς ένα ανά διεύθυνση, και αν κλείσει και η διεύθυνση εμφανιστεί ξανά, ανοίγει πάλι το ίδιο ticket, αντί να δημιουργηθεί δεύτερο.
Αναγνωρίζονται τα QNAP, Synology, Exchange-Autodiscover, ActiveSync, καθώς και προγράμματα-πελάτες WebDAV, CalDAV και CardDAV. Τα μοτίβα προσδιορίζουν ακριβή ονόματα αρχείων και καταλόγους, ποτέ απλές επεκτάσεις: στον ίδιο κατάλογο /cgi-bin/, οι αβλαβείς κλήσεις συγχρονισμού συνυπάρχουν με κλασικά διερευνητικά αιτήματα όπως το printenv.pl.
Η λίστα επιτρεπόμενων: διευθύνσεις που δεν αποκλείονται ποτέ
Το κόστος ενός λάθους δεν είναι ίδιο για όλες τις διευθύνσεις. Στην περίπτωση ενός σαρωτή από κέντρο δεδομένων, ένας ψευδής συναγερμός δεν κοστίζει τίποτα. Στην περίπτωση του απομακρυσμένου άκρου μιας σήραγγας που συνδέει εγκαταστάσεις, κοστίζει τη σύνδεση ολόκληρης της εγκατάστασης.
Γι’ αυτό υπάρχει μια δεύτερη λίστα, η οποία έχει προτεραιότητα έναντι της πρώτης: διευθύνσεις και δίκτυα που δεν αποκλείονται ποτέ. Δεν αποκρύπτει όμως τίποτα — όσοι περιλαμβάνονται σε αυτήν συνεχίζουν να ελέγχονται και να καταγράφονται, απλώς δεν υφίστανται τη συνέπεια. Αυτή είναι η διαφορά από μια εξαίρεση στο τείχος προστασίας: εκείνη καταργεί την ορατότητα, αυτή απλώς προσθέτει ανοχή.
Η λίστα συμπληρώνεται καθημερινά από δύο πηγές: από το ίδιο το τείχος προστασίας, με όλα τα απομακρυσμένα άκρα VPN, ώστε μια νέα σήραγγα να μη βασίζεται στο αν κάποιος θα θυμηθεί τη λίστα αποκλεισμού — και από τα δημοσιευμένα εύρη διευθύνσεων της Google και της Microsoft για τους ανιχνευτές ιστού τους. Μόνο έτσι μπορεί να ξεχωρίσει ένα πραγματικό Googlebot από έναν σαρωτή που χρησιμοποιεί αυτό το όνομα. Οι μηχανές αναζήτησης δεν πρέπει να αποκλείονται ποτέ· όποιος τις αποκλείει αφαιρεί τον ιστότοπό του από την ευρετηρίαση χωρίς επιστροφή.
Εδώ ισχύει ένας κανόνας πιο σημαντικός από την αντιπαραβολή: Μια κενή απάντηση δεν διαγράφει ποτέ. Αν η πηγή δεν απαντά, απαντά με κενό ή ακατανόητο περιεχόμενο, η λίστα μένει αμετάβλητη. Μια λευκή λίστα που αδειάζει μόνη της σε περίπτωση βλάβης παρασύρει, τη χειρότερη δυνατή στιγμή, όλες τις σήραγγες.
Αν μια εγγραφή στη λίστα επιτρεπόμενων συνδέεται με πελάτη, κάθε συμβάν από το δίκτυό του αντιστοιχίζεται σε αυτόν. Έτσι, για κάθε λανθασμένη ρύθμιση υπάρχει αμέσως υπεύθυνος επικοινωνίας, χωρίς να χρειάζεται κανείς να αναζητά διευθύνσεις.
Υποχρεωτικά στοιχεία και αυτοματοποιημένοι συλλέκτες δεδομένων
Η σελίδα νομικών στοιχείων δεν είναι μια συνηθισμένη σελίδα. Πρέπει να παραμένει προσβάσιμη στους ανθρώπους, καθώς ο αποκλεισμός της δημιουργεί ακριβώς την παράβαση που αναζητά ένας συλλέκτης. Ταυτόχρονα, είναι η σελίδα όπου αναγράφονται το όνομα και η διεύθυνση — και επομένως αποτελεί στόχο αυτοματοποιημένης συλλογής δεδομένων.
Στο κύμα εξώδικων απαιτήσεων στην Αυστρία για τη χρήση ενσωματωμένων γραμματοσειρών Google, τα αρχεία καταγραφής έδειξαν ότι οι επιστολές δεν βασίζονταν σε μεμονωμένες επισκέψεις, αλλά σε μια αυτοματοποιημένη μαζική σάρωση: διαφορετικοί, άσχετοι μεταξύ τους εξυπηρετητές δέχονταν επισκέψεις με διαφορά χιλιοστών του δευτερολέπτου.
Το Web RBL το αντιμετωπίζει με υποβάθμιση της σοβαρότητας αντί για εξαίρεση. Η κανονική διαδρομή /impressum δεν αντιστοιχεί σε κανένα μοτίβο και παραμένει πάντα προσβάσιμη. Εναλλακτικές μορφές όπως η /impressum.php — που δεν μπορούν να υπάρχουν σε έναν ιστότοπο Odoo — αναφέρονται, και όποιος δεν θέλει να επιτρέπει την αυτοματοποιημένη συλλογή στοιχείων μπορεί να αλλάξει μία παράμετρο. Τα sitemap και robots εξαιρούνται και δεν μπορούν να αποκλειστούν: δεν περιέχουν προσωπικά δεδομένα και η ανάκτησή τους είναι μέρος της δουλειάς κάθε προγράμματος ανίχνευσης μηχανής αναζήτησης.
Τομέας και αναγνωριστικό: τι λείπει από το αρχείο καταγραφής προσβάσεων
Το αρχείο καταγραφής προσβάσεων του werkzeug δεν καταγράφει ούτε τον εξυπηρετητή στον οποίο απευθύνεται το αίτημα ούτε το αναγνωριστικό του αποστολέα. Το Odoo, φυσικά, λαμβάνει και τα δύο — χωρίς το όνομα του εξυπηρετητή δεν θα μπορούσε καν να επιλέξει τον σωστό ιστότοπο όταν φιλοξενεί περισσότερους από έναν. Εκ των υστέρων, όμως, δεν υπάρχει τρόπος να ανατρέξει κανείς σε αυτά.
Το Web RBL καταγράφει και τα δύο για κάθε αντιστοίχιση. Έτσι απαντά σε δύο ερωτήματα που διαφορετικά θα έμεναν αναπάντητα: ποιον ιστότοπο στοχεύει μια λανθασμένη ρύθμιση — και συνεπώς σε ποιον πελάτη ανήκει ο τομέας — και αν μια διεύθυνση επισκέπτεται έναν ιστότοπο ή όλους. Η πρόσβαση σε πολλούς άσχετους μεταξύ τους τομείς από την ίδια διεύθυνση είναι χαρακτηριστικό μαζικής σάρωσης και αυξάνει τη βαθμολογία.
Το πόσο σημαντικό είναι το αναγνωριστικό φάνηκε σε μια ανάλυση ενός από τους ιστοτόπους μας: πάνω από το εβδομήντα τοις εκατό της συνολικής κίνησης προερχόταν από έναν και μόνο αποστολέα, κατανεμημένο σε περισσότερες από εκατό διευθύνσεις. Χωρίς το αναγνωριστικό, θα έμοιαζε με κατανεμημένο εργαλείο συλλογής δεδομένων. Ήταν το GPTBot, το πρόγραμμα ανίχνευσης της OpenAI — ζητούσε επανειλημμένα το robots.txt και συμπεριφερόταν απολύτως σωστά.
Οι πτυχές της ασφάλειας αναλυτικά
1. Η αναγνώριση proxy — το πιο επικίνδυνο σημείο απ' όλα
Αν το Odoo λειτουργεί πίσω από αντίστροφο διακομιστή μεσολάβησης και το proxy_mode έχει ρυθμιστεί λανθασμένα, το πρόσθετο βλέπει την ίδια διεύθυνση σε κάθε αίτημα: τη διεύθυνση του διακομιστή μεσολάβησης. Ένας αποκλεισμός θα απέκλειε τότε όλους τους επισκέπτες ταυτόχρονα.
Γι’ αυτό το Web RBL ελέγχει πριν από κάθε αποκλεισμό αν ο προσδιορισμός της διεύθυνσης είναι αξιόπιστος. Απαιτεί το proxy_mode μαζί με μια κεφαλίδα προώθησης, αρνείται να λειτουργήσει αν λάβει προωθημένο αίτημα χωρίς proxy_mode και κάνει το ίδιο αν υπάρχουν περισσότεροι από ένας ενδιάμεσοι διακομιστές μεσολάβησης. Σε περίπτωση αμφιβολίας, δεν εφαρμόζεται αποκλεισμός.
2. Ποτέ αποκλεισμός των δικών μας δικτύων
Οι ιδιωτικές περιοχές διευθύνσεων, οι διευθύνσεις loopback και link-local και το CGNAT εξαιρούνται υποχρεωτικά. Δεν μπορούν σε καμία περίπτωση να μπουν στη λίστα, ούτε χειροκίνητα. Το ίδιο ισχύει και για λίστες τρίτων: οι ιδιωτικές και δεσμευμένες περιοχές, καθώς και τα υπερβολικά μεγάλα δίκτυα, απορρίπτονται κατά την εισαγωγή.
3. Ένα σφάλμα του πρόσθετου δεν πρέπει να θέτει εκτός λειτουργίας τον ιστότοπο
Ολόκληρος ο έλεγχος εκτελείται μέσα σε μια ασφαλιστική δικλίδα που πιάνει κάθε σφάλμα. Ό,τι στραβώσει εδώ καταγράφεται, και το αίτημα συνεχίζει αμετάβλητο. Ένα module προστασίας που, σε περίπτωση δικού του σφάλματος, παρασύρει την ιστοσελίδα, είναι χειρότερο από κανένα. Όλα τα ερωτήματα στη διαδρομή του αιτήματος εκτελούνται επιπλέον χωρίς τη γλώσσα του προγράμματος περιήγησης του επισκέπτη και χωρίς ταξινόμηση κατά μεταφρασμένα πεδία — ένας επισκέπτης με μη εγκατεστημένη γλώσσα δεν πρέπει να προκαλεί αποτυχία του ελέγχου.
4. Πρώτα παρακολούθηση, μετά αποκλεισμός
Μετά την εγκατάσταση, ο αποκλεισμός των διευθύνσεων της λίστας για συνηθισμένα αιτήματα είναι απενεργοποιημένος. Τα ανιχνευτικά αιτήματα απορρίπτονται και καταγράφονται, ενώ όλα τα υπόλοιπα περνούν κανονικά. Έτσι μπορείτε να παρακολουθήσετε για μερικές ημέρες ποιες διευθύνσεις καταλήγουν πράγματι στη λίστα, προτού αποκλειστεί κανείς. Το ίδιο ισχύει για την αναγνώριση συμπεριφοράς, τις λίστες απειλών και τους κανόνες ανά χώρα: πρώτα αναφορά, έπειτα έλεγχος και αποκλεισμός.
5. Στοχευμένα μοτίβα αντί για γενικευμένους κανόνες
Ένας λανθασμένα αναγνωρισμένος επισκέπτης κοστίζει περισσότερο από έναν ανιχνευτή που ξέφυγε.
Κάθε μοτίβο φέρει γι' αυτό το επίπεδό του, και αυτό μπορεί να αλλάξει ανά μοτίβο.
Μια κατάληξη αρχείου από μόνη της σπάνια αρκεί: στο
.php αντιστοιχούν 14.012 πραγματικοί ανιχνευτές έναντι μιας χούφτας
παλιών συνδέσμων, στο .asp η αναλογία είναι αντίστροφη. Τέτοιες
αποφάσεις πρέπει να μετριούνται, όχι να εκτιμώνται.
6. Η χειροκίνητη άρση αποκλεισμού παραμένει σε ισχύ
Όποιος επιτρέπει την πρόσβαση από μια διεύθυνση έχει τον λόγο του. Μια νέα αντιστοίχιση δεν αναιρεί σιωπηρά αυτή την απόφαση.
7. Η λίστα προστατεύεται, αλλά δεν είναι μυστική
Το τελικό σημείο απαιτεί διακριτικό πρόσβασης και, χωρίς έγκυρο διακριτικό, απαντά με 404 και όχι με 403 — έτσι δεν επιβεβαιώνει καν την ύπαρξη της διεύθυνσης. Η σύγκριση εκτελείται σε σταθερό χρόνο. Η ίδια η λίστα δεν περιέχει τίποτα εμπιστευτικό: αποτελείται από διευθύνσεις που επικοινώνησαν μαζί μας με δική τους πρωτοβουλία.
8. Κανένα μυστικό στις καταγραφές
Στις αποτυχημένες συνδέσεις καταγράφεται το όνομα χρήστη που δοκιμάστηκε, ποτέ ο κωδικός πρόσβασης. Στον διαχειριστή βάσεων δεδομένων δεν διαβάζεται απολύτως τίποτα από τις τιμές που υποβάλλονται: εκεί περιλαμβάνεται πρώτος απ’ όλα ο κύριος κωδικός πρόσβασης και μια εγγραφή σε λίστα αποκλεισμού μεταφέρεται σε κάθε αντίγραφο ασφαλείας της βάσης δεδομένων. Το κλειδί άδειας χρήσης του GeoLite2 αποθηκεύεται μόνο στην παράμετρο συστήματος και σε καμία γραμμή αρχείου καταγραφής.
9. Το δόλωμα δεν αποκαλύπτει τίποτα αξιοποιήσιμο
Προαιρετικά, το Web RBL απαντά στα ανιχνευτικά αιτήματα με επινοημένο περιεχόμενο που περιέχει μια μοναδική τιμή-δείκτη. Όποιος αργότερα ζητήσει αυτή την τιμή έχει διαβάσει την πλαστή απάντηση και έχει ενεργήσει βάσει αυτής — αποκλείεται επομένως ο ψευδής συναγερμός. Τα δολώματα δεν περιέχουν αξιοποιήσιμα στοιχεία, πραγματικές διαδρομές ή έγκυρα διαπιστευτήρια. Η λειτουργία αυτή παρέχεται απενεργοποιημένη, επειδή αλλάζει τη συμπεριφορά του συστήματος με τρόπο ορατό προς τα έξω.
Τι δεν μπορεί να κάνει το πρόσθετο
Δεν αντικαθιστά ένα τείχος προστασίας ούτε ένα τείχος προστασίας εφαρμογών ιστού. Αναγνωρίζει γνωστά μοτίβα ανίχνευσης σε διαδρομές, αποτυχημένες συνδέσεις και ύποπτη συμπεριφορά — όχι επιθέσεις σε φόρμες ή απόπειρες εισαγωγής κακόβουλου κώδικα σε παραμέτρους.
Επιπλέον, βλέπει μόνο ό,τι επιστρέφει μέσω HTTP. Το τι κάνει ένας εισβολέας με κλεμμένα διαπιστευτήρια βάσεων δεδομένων ή γραμματοκιβωτίων παραμένει αόρατο — και γι’ αυτό ακριβώς οι τιμές-δείκτες είναι διαδρομές και όχι διαπιστευτήρια.
Και δεν υποκαθιστά την προσοχή: ένα πρόσθετο που απορρίπτει ανιχνευτικά αιτήματα για .env δεν καθιστά ακίνδυνο ένα αρχείο .env που διατέθηκε κατά λάθος δημόσια.
Διαθεσιμότητα
Το Web RBL διατίθεται δημόσια με άδεια AGPL-3 και το χρησιμοποιούμε σε παραγωγική λειτουργία σε πέντε ιστοτόπους:
github.com/Alex0176/odoo-web-rbl
Το πρόσθετο απαιτεί το Odoo 19 Community και δεν έχει άλλες εξαρτήσεις πέρα από τα base και web. Η διασύνδεση με σύστημα αιτημάτων υποστήριξης είναι προαιρετική και δεν απαιτεί κάποιο συγκεκριμένο σύστημα· αν δεν υπάρχει τέτοιο σύστημα, απλώς δεν εκτελείται καμία ενέργεια. Για τον προσδιορισμό της χώρας προέλευσης χρειάζεται η δωρεάν βάση δεδομένων GeoLite2 της MaxMind· αν λείπει, το πεδίο παραμένει κενό και όλα τα υπόλοιπα λειτουργούν κανονικά.
Περισσότερα: Πώς εντάσσεται το Web RBL σε μια ολοκληρωμένη αρχιτεκτονική ασφάλειας -- μαζί με τείχος προστασίας, έλεγχο ταυτότητας δύο παραγόντων και δικαιώματα πρόσβασης, με οδηγίες βήμα προς βήμα: Πώς να συνδυάσετε σωστά τα στοιχεία της αρχιτεκτονικής ασφάλειας του Odoo 19.
Δεχόμαστε ευχαρίστως ερωτήσεις, παρατηρήσεις και αναφορές σφαλμάτων — κατά προτίμηση ως Issue στο GitHub.