Εν ολίγοις: Το Fail2ban διαβάζει αρχεία καταγραφής και αποκλείει στο firewall διευθύνσεις που εμφανίζονται υπερβολικά συχνά μέσα σε ένα χρονικό παράθυρο. Για το Nginx και τον Apache διαθέτει έτοιμα jails όπως nginx-botsearch ή apache-noscript· δικά σας φίλτρα τα δοκιμάζετε με fail2ban-regex. Οι ρυθμίσεις ανήκουν στο jail.local, οι δικές σας διευθύνσεις στο ignoreip, τους επαναλαμβανόμενους δράστες τους πιάνει το jail recidive. Κατά μεμονωμένων στοχευμένων επιθέσεων το Fail2ban δεν βοηθά, κατά μαζικών σαρώσεων ναι.
Όταν τα logs είναι γεμάτα σαρωτές
Όποιος κοιτάζει αυτές τις ημέρες τα πρωτόκολλα πρόσβασης των διακομιστών ιστού του, τα βρίσκει συχνά γεμάτα αιτήματα σε διαδρομές που δεν υπάρχουν καθόλου: παλιά περιβάλλοντα διαχείρισης, δοκιμαστικά αρχεία, γνωστές αδυναμίες άλλων προϊόντων. Σε μια κατάσταση όπως το PHP2Shell προστίθεται η στοχευμένη αναζήτηση ευάλωτων διακομιστών: η Cloudflare και η Patchstack ανέφεραν απόπειρες επίθεσης, η Unit 42 μέτρησε περισσότερες από 22,6 εκατομμύρια εκτεθειμένες, δυνητικά ευάλωτες εγκαταστάσεις.
Το Fail2ban είναι ένα δοκιμασμένο εργαλείο κατά αυτού του όγκου. Διαβάζει αρχεία καταγραφής, αναγνωρίζει με φίλτρα ύποπτες εγγραφές και αποκλείει τη διεύθυνση του αποστολέα για καθορισμένο χρόνο στο firewall. Αυτό ανακουφίζει τον διακομιστή, μειώνει τον θόρυβο στα logs και κάνει πιο κοπιαστική τη συστηματική δοκιμή από μία πηγή.
Τι δεν μπορεί να κάνει το Fail2ban είναι εξίσου σημαντικό: ένα μεμονωμένο αίτημα που εκμεταλλεύεται μια ευπάθεια δεν εμποδίζεται. Κατά του PHP2Shell βοηθά μόνο η ενημέρωση της PHP. Πώς εξελίσσονται οι αυτοματοποιημένες επιθέσεις, περιγράφει το Μαζικές σαρώσεις για PHP χωρίς patch.
Fail2ban για Nginx και Apache: τα jails που συνοδεύουν το πακέτο
Ένα jail συνδέει ένα φίλτρο με ένα αρχείο καταγραφής και μια ενέργεια αποκλεισμού. Το jail.conf που συνοδεύει το πακέτο περιέχει ήδη jails για διακομιστές ιστού. Είναι από προεπιλογή απενεργοποιημένα και ενεργοποιούνται ένα προς ένα.
| Jail | Διακομιστής ιστού | Εντοπίζει |
|---|---|---|
nginx-http-auth |
Nginx | αποτυχημένες συνδέσεις HTTP Basic |
nginx-limit-req |
Nginx | αιτήματα που υπερβαίνουν το rate limit του Nginx |
nginx-botsearch |
Nginx | αναζήτηση τυπικών, ανύπαρκτων διαδρομών |
nginx-bad-request |
Nginx | ελαττωματικά αιτήματα |
apache-auth |
Apache | αποτυχημένες συνδέσεις |
apache-badbots |
Apache | γνωστά αναγνωριστικά κακόβουλων bots |
apache-noscript |
Apache | κλήσεις ανύπαρκτων σεναρίων |
apache-overflows |
Apache | υπερβολικά μακριά αιτήματα |
apache-botsearch |
Apache | αναζήτηση τυπικών, ανύπαρκτων διαδρομών |
php-url-fopen |
και οι δύο | ορισμένα μοτίβα απόπειρας ενσωμάτωσης URL |
recidive |
και οι δύο | διευθύνσεις που έχει αποκλείσει επανειλημμένα το Fail2ban |
Οι προεπιλεγμένες τιμές της προεγκατεστημένης διαμόρφωσης είναι μάλλον ήπιες: αποκλεισμός για 10 λεπτά μετά από 5 εμφανίσεις σε 10 λεπτά. Για διακομιστές ιστού με πολλή κίνηση σάρωσης αξίζει ένας μεγαλύτερος αποκλεισμός και ένας αυξανόμενος συντελεστής για επαναλήψεις.
Η βασική διαμόρφωση στο jail.local
Το jail.conf δηλώνει το ίδιο ότι δεν πρέπει να αλλάζεται, επειδή οι ενημερώσεις το αντικαθιστούν. Οι δικές σας τιμές ανήκουν στο /etc/fail2ban/jail.local. Το παρακάτω παράδειγμα για το Nginx ορίζει λογικές προεπιλογές και ενεργοποιεί κατάλληλα jails:
# /etc/fail2ban/jail.local
[DEFAULT]
# Καταχωρίστε δικές σας σταθερές διευθύνσεις (αντικαταστήστε τη διεύθυνση του παραδείγματος)
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
bantime = 1h
findtime = 10m
maxretry = 5
bantime.increment = true
[nginx-http-auth]
enabled = true
[nginx-botsearch]
enabled = true
[recidive]
enabled = true
bantime = 1w
findtime = 1d
Για τον Apache ενεργοποιείτε αντί γι' αυτό π.χ. τα apache-auth, apache-noscript και apache-botsearch. Τις διαδρομές των logs τις φέρνει το Fail2ban ανάλογα με τη διανομή· αν οι δικές σας διαδρομές διαφέρουν, ορίστε το logpath στο εκάστοτε jail. Αν το σύστημά σας διαβάζει logs μόνο μέσω journal, βοηθά το backend = systemd.
Ένα δικό σας φίλτρο για μαζικά αιτήματα σε αρχεία PHP
Ένα τυπικό μοτίβο στην τρέχουσα κατάσταση είναι πολλά αιτήματα σε σύντομο χρόνο σε αρχεία PHP που δεν υπάρχουν. Ένα δικό σας φίλτρο το αναγνωρίζει από τον κωδικό κατάστασης 404. Περιγράφει μόνο ό,τι βρίσκεται στο δικό σας log:
# /etc/fail2ban/filter.d/nginx-php-404.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD) [^"]*\.php[^"]*" 404
ignoreregex =
# Προσθήκη στο /etc/fail2ban/jail.local
[nginx-php-404]
enabled = true
port = http,https
filter = nginx-php-404
logpath = /var/log/nginx/access.log
maxretry = 20
findtime = 1m
bantime = 1h
Προτού ενεργοποιήσετε το φίλτρο, το ελέγχετε έναντι του πραγματικού log. Έτσι βλέπετε πόσες γραμμές πιάνει και αν περιλαμβάνει θεμιτές προσβάσεις:
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-php-404.conf
sudo systemctl restart fail2ban
sudo fail2ban-client status
sudo fail2ban-client status nginx-php-404
# Άρση αποκλεισμού μιας διεύθυνσης που αποκλείστηκε κατά λάθος
sudo fail2ban-client set nginx-php-404 unbanip 203.0.113.25
Επιλέξτε το όριο γενναιόδωρα. Ένας crawler που επεξεργάζεται παρωχημένους συνδέσμους ή μια υπηρεσία παρακολούθησης δεν πρέπει να καταλήξει στον αποκλεισμό.
Οι συχνότερες παγίδες
Το Fail2ban εγκαθίσταται γρήγορα, αλλά χρησιμοποιείται εύκολα λανθασμένα. Αυτά τα σημεία πρέπει να ελέγξετε πριν από την παραγωγική χρήση:
- Αυτοαποκλεισμός: Οι διευθύνσεις γραφείου, VPN και παρακολούθησης ανήκουν στο
ignoreipπροτού ενεργοποιηθούν τα jails. - Υπηρεσίες που προηγούνται: Πίσω από CDN ή load balancer το Fail2ban, χωρίς προσαρμογή, βλέπει μόνο τις διευθύνσεις τους. Περισσότερα στον οδηγό Προστασία συνδέσεων διαχειριστή από brute force.
- Περιστροφή logs: Μετά την αλλαγή του αρχείου καταγραφής, το Fail2ban πρέπει να διαβάζει το νέο αρχείο. Ελέγξτε μετά την πρώτη περιστροφή αν τα jails συνεχίζουν να μετρούν εμφανίσεις.
- Συνεργασία με το firewall: Το Fail2ban καταχωρίζει αποκλεισμούς στο firewall. Όποιος διαχειρίζεται το firewall του με πλήρη επαναφόρτωση του συνόλου κανόνων, μπορεί να διαγράψει αυτές τις εγγραφές. Πώς δομείτε το ίδιο το firewall, αναφέρεται στο Firewall για διακομιστές ιστού: άνοιγμα μόνο των απαραίτητων θυρών.
- IPv6: Οι επιθέσεις έρχονται και μέσω IPv6. Ελέγξτε αν η ενέργεια αποκλεισμού καλύπτει και τα δύο πρωτόκολλα.
Αξιολογείτε τακτικά τις λίστες αποκλεισμών. Αν συσσωρεύονται αποκλεισμοί από συγκεκριμένα δίκτυα ή σε συγκεκριμένες διαδρομές, είναι ένδειξη στοχευμένης αναζήτησης και αφορμή να εξετάσετε πιο προσεκτικά την επηρεαζόμενη εφαρμογή.
Συμπέρασμα: ένα εργαλείο κατά του όγκου, όχι κατά των πάντων
Το Fail2ban ρυθμίζεται γρήγορα και απαλλάσσει τους διακομιστές ιστού από ένα μέρος του διαρκούς βομβαρδισμού. Τα jails που συνοδεύουν το πακέτο καλύπτουν τυπικά μοτίβα, τα δικά σας φίλτρα μπορούν να δοκιμαστούν χωρίς κίνδυνο έναντι πραγματικών logs με fail2ban-regex και το jail recidive φροντίζει ώστε οι επίμονες πηγές να μένουν περισσότερο έξω.
Δεν πρέπει να το υπερεκτιμάτε. Το Fail2ban αντιδρά στην επανάληψη, όχι στην πρώτη εμφάνιση, και βλέπει μόνο ό,τι υπάρχει στα logs. Κατά μιας ευπάθειας όπως το PHP2Shell βοηθά μόνο η ενημέρωση, κατά κατανεμημένων επιθέσεων από πολλές διευθύνσεις το Fail2ban βοηθά ελάχιστα. Αναπτύσσει την αξία του ως ένα στρώμα ανάμεσα σε πολλά: δίπλα σε ένα λιτό firewall, μια σκληρυμένη διαμόρφωση διακομιστή ιστού, σύνδεση δύο παραγόντων και μια παρακολούθηση που δεν αποκλείει μόνο τις ανωμαλίες αλλά και τις αναφέρει.
Πώς βοηθά συγκεκριμένα η PHP SOS;
- Αξιολόγηση logs: Εξετάζουμε ποια μοτίβα εμφανίζονται στα πρωτόκολλα πρόσβασής σας και επιλέγουμε κατάλληλα jails.
- Ρύθμιση και δοκιμή: Ρυθμίζουμε το Fail2ban με δικά του φίλτρα, δοκιμάζουμε κάθε φίλτρο έναντι πραγματικών logs και καταχωρίζουμε τις σταθερές διευθύνσεις σας ως εξαίρεση.
- Διευκρίνιση της συνεργασίας: CDN, load balancer, firewall και περιστροφή logs τα συντονίζουμε ώστε οι αποκλεισμοί να πλήττουν τις σωστές διευθύνσεις.
- Παρακολούθηση: Στο πλαίσιο της παρακολούθησης ασφαλείας αξιολογούμε διαρκώς αποκλεισμούς και ανωμαλίες.
Συχνές ερωτήσεις
Προστατεύει το Fail2ban από το PHP2Shell;
Όχι. Το Fail2ban αντιδρά μόνο αφού μια διεύθυνση έχει εμφανιστεί επανειλημμένα στα logs. Μια μεμονωμένη επιτυχημένη επίθεση δεν εμποδίζεται έτσι. Το Fail2ban μειώνει όμως το φορτίο από σαρωτές και κάνει πιο δαπανηρές τις επαναλαμβανόμενες απόπειρες από την ίδια πηγή.
Γιατί να μην αλλάξω απευθείας το jail.conf;
Το αρχείο αντικαθίσταται σε ενημερώσεις πακέτων και το δηλώνει το ίδιο. Οι δικές σας ρυθμίσεις ανήκουν σε ένα jail.local ή σε αρχεία κάτω από το jail.d. Εκεί αντικαθιστούν στοχευμένα τις προεπιλεγμένες τιμές.
Τι είναι το jail recidive;
Ένα jail που αξιολογεί το πρωτόκολλο του ίδιου του Fail2ban. Όποιος αποκλείεται ξανά και ξανά λαμβάνει σημαντικά μεγαλύτερο αποκλεισμό. Στην προεγκατεστημένη διαμόρφωση είναι μία εβδομάδα.
Λειτουργεί το Fail2ban πίσω από Cloudflare ή load balancer;
Μόνο με πρόσθετη διαμόρφωση. Χωρίς αυτήν στα logs εμφανίζεται η διεύθυνση της υπηρεσίας που προηγείται και ένας αποκλεισμός θα έπληττε όλους τους επισκέπτες. Ο διακομιστής ιστού πρέπει τότε να αναγνωρίζει την πραγματική διεύθυνση του επισκέπτη και οι αποκλεισμοί τοποθετούνται καλύτερα στην υπηρεσία που προηγείται.