Ενότητα 5 · 5.3
fail2ban κατά των προσπαθειών μαντέματος κωδικών
Ενότητα 5: Προστασία του δικτύου · Χρόνος ανάγνωσης: 10 λεπτά
Στόχος μαθήματος: Μετά από αυτό το μάθημα μπορείτε να ρυθμίσετε το fail2ban για SSH, να διαβάσετε την κατάσταση και το αρχείο καταγραφής του, να απελευθερώσετε ξανά μια διεύθυνση και να εξηγήσετε τι προστατεύει και τι δεν προστατεύει το fail2ban.
Βασικές έννοιες: brute force, jail, filter, ενέργεια (banaction), maxretry, findtime, bantime, bantime.increment, ignoreip, backend systemd, jail.conf, jail.local και jail.d, fail2ban-client, recidive
Αυτοί που δοκιμάζουν τα πόμολα του internet
Ρίξτε μια ματιά στο αρχείο καταγραφής του SSH μία ημέρα μετά την εγκατάσταση και θα το δείτε: εκατοντάδες προσπάθειες σύνδεσης, με ονόματα όπως root, admin, test, ubuntu και oracle, από διευθύνσεις σε όλο τον κόσμο.
anna@web1:~$ sudo journalctl -u ssh --since today | grep -c "Invalid user"
412
anna@web1:~$ sudo journalctl -u ssh --since today | grep "Invalid user" | tail -n 3
nov 09 14:02:11 web1 sshd-session[20311]: Invalid user admin from 203.0.113.77 port 51522
nov 09 14:02:13 web1 sshd-session[20313]: Invalid user oracle from 203.0.113.77 port 51544
nov 09 14:02:16 web1 sshd-session[20315]: Invalid user test from 203.0.113.77 port 51560(Στο Ubuntu η υπηρεσία ονομάζεται ssh, στο AlmaLinux και στο Rocky sshd. Το όνομα της διεργασίας μπορεί να είναι sshd ή sshd-session, ανάλογα με την έκδοση του OpenSSH.) Αυτή είναι μια επίθεση brute force: bots που απλώς δοκιμάζουν όλα τα συνηθισμένα ονόματα και κωδικούς πρόσβασης. Με σύνδεση μέσω κλειδιών και απενεργοποιημένη σύνδεση με κωδικό πρόσβασης (μάθημα 2.2) δεν μπαίνουν ποτέ, όσες φορές κι αν προσπαθήσουν. Γεμίζουν όμως το αρχείο καταγραφής σας, καταναλώνουν λίγη υπολογιστική ισχύ και, σε υπηρεσίες όπου απαιτείται κωδικός πρόσβασης (ένα webmail, ένας πίνακας διαχείρισης), μπορεί να γίνουν πραγματικά επικίνδυνα.
Το fail2ban διαβάζει αρχεία καταγραφής, αναγνωρίζει αποτυχημένες προσπάθειες και κλειδώνει για λίγο στο firewall μια διεύθυνση που αποτυγχάνει πολλές φορές.
Πώς σκέφτεται το fail2ban: jails
Το fail2ban λειτουργεί με jails (κελιά). Ένα jail συνδυάζει τρία πράγματα:
- ένα filter: κανονικές εκφράσεις που αναγνωρίζουν αποτυχημένες προσπάθειες σε ένα αρχείο καταγραφής (για παράδειγμα τη γραμμή "Invalid user ... from <adres>")·
- μια ενέργεια: τι συμβαίνει όταν οι προσπάθειες είναι πάρα πολλές, συνήθως ένας κανόνας firewall που αποκλείει τη διεύθυνση (
banaction, στο Debian 13 από προεπιλογή μέσω nftables)· - όρια: πόσες αποτυχημένες προσπάθειες (
maxretry) μέσα σε πόσο χρόνο (findtime) οδηγούν σε αποκλεισμό και για πόσο διάστημα (bantime).
Οι προεπιλεγμένες τιμές στο jail.conf είναι: maxretry = 5, findtime = 10m, bantime = 10m. Δηλαδή: πέντε αποτυχημένες προσπάθειες μέσα σε δέκα λεπτά φέρνουν αποκλεισμό δέκα λεπτών.
Εγκατάσταση και η παγίδα του Debian 12
anna@web1:~$ sudo apt install fail2ban
anna@web1:~$ sudo systemctl status fail2banΣτο Debian και στο Ubuntu το jail για SSH ([sshd]) είναι ήδη ενεργό μετά την εγκατάσταση, μέσω του αρχείου /etc/fail2ban/jail.d/defaults-debian.conf.
Υπάρχει μία γνωστή παγίδα. Το fail2ban πρέπει να γνωρίζει πού βρίσκεται το αρχείο καταγραφής. Παλαιότερα ήταν το αρχείο κειμένου /var/log/auth.log. Από το Debian 12 και μετά το rsyslog δεν εγκαθίσταται πλέον από προεπιλογή και τα μηνύματα βρίσκονται μόνο στο journal του systemd (μάθημα 6.2). Το πακέτο fail2ban του Debian 12 έψαχνε ακόμη το /var/log/auth.log, δεν το έβρισκε και δεν ξεκινούσε. Το Debian 13 το διόρθωσε ορίζοντας στο defaults-debian.conf για το SSH backend = systemd. Στο Debian 12 το διορθώνετε μόνοι σας (δείτε παρακάτω) κάνοντας το ίδιο. Το Ubuntu έχει ακόμη το rsyslog από προεπιλογή, αλλά το backend = systemd λειτουργεί κι εκεί.
Οι δικές σας ρυθμίσεις: jail.local
Μην τροποποιείτε ποτέ το jail.conf: το αρχείο αυτό αντικαθίσταται σε κάθε ενημέρωση. Βάλτε τις δικές σας ρυθμίσεις στο /etc/fail2ban/jail.local ή σε ένα αρχείο μέσα στο /etc/fail2ban/jail.d/ με την κατάληξη .local:
# /etc/fail2ban/jail.d/eigen.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
bantime.increment = true
ignoreip = 127.0.0.1/8 ::1 198.51.100.20
[sshd]
enabled = true
backend = systemdΤι κάνουν οι γραμμές:
bantime = 1h: αποκλεισμός μίας ώρας αντί για δέκα λεπτά.bantime.increment = true: όποιος επιστρέφει μετά από αποκλεισμό, δέχεται κάθε φορά μεγαλύτερο αποκλεισμό.ignoreip: διευθύνσεις που δεν αποκλείονται ποτέ. Βάλτε εδώ τη σταθερή διεύθυνση IP του γραφείου σας, αν έχετε. Μη βάζετε εδώ μεγάλα εύρη διευθύνσεων "για σιγουριά".backend = systemd: ανάγνωση του journal αντί για αρχείο κειμένου (απαραίτητο στο Debian 12, συνιστάται παντού). Για αυτό πρέπει να είναι εγκατεστημένο το πακέτοpython3-systemd· συνήθως είναι ήδη, ως εξάρτηση.
Επαναφόρτωση και έλεγχος:
anna@web1:~$ sudo fail2ban-client -t # έλεγχος ρυθμίσεων
OK: configuration test is successful
anna@web1:~$ sudo systemctl reload fail2ban
anna@web1:~$ sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshdΑνάγνωση κατάστασης, αποκλεισμός και απελευθέρωση
anna@web1:~$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 3
| |- Total failed: 1288
| `- Journal matches: _SYSTEMD_UNIT=ssh.service + _COMM=sshd
`- Actions
|- Currently banned: 2
|- Total banned: 117
`- Banned IP list: 203.0.113.77 198.51.100.140Το "Currently failed" αφορά διευθύνσεις που έχουν ήδη κάνει προσπάθειες αλλά δεν έχουν ξεπεράσει ακόμη το όριο. Το "Currently banned" αφορά τις διευθύνσεις που είναι αποκλεισμένες αυτή τη στιγμή.
Αν αποκλείσατε τον εαυτό σας (για παράδειγμα δοκιμάζοντας μερικές φορές με λάθος κλειδί ή όνομα χρήστη), συνδεθείτε από άλλο δίκτυο ή μέσω της κονσόλας και απελευθερώστε τη διεύθυνσή σας:
anna@web1:~$ sudo fail2ban-client set sshd unbanip 198.51.100.20Το αρχείο καταγραφής του ίδιου του fail2ban βρίσκεται στο /var/log/fail2ban.log και δείχνει πότε αποκλείστηκε και πότε απελευθερώθηκε κάθε διεύθυνση:
2026-11-09 14:02:16,903 fail2ban.actions [811]: NOTICE [sshd] Ban 203.0.113.77
2026-11-09 15:02:17,120 fail2ban.actions [811]: NOTICE [sshd] Unban 203.0.113.77Όσοι επανέρχονται: recidive
Ορισμένα bots απλώς επιστρέφουν μετά από κάθε αποκλεισμό. Για αυτό υπάρχουν δύο μέσα. Το bantime.increment (παραπάνω) κάνει τον αποκλεισμό κάθε φορά μεγαλύτερο. Επιπλέον υπάρχει το jail recidive: διαβάζει το αρχείο καταγραφής του ίδιου του fail2ban και αποκλείει για μία εβδομάδα, σε όλες τις θύρες, μια διεύθυνση που έχει αποκλειστεί πολλές φορές μέσα σε μία ημέρα. Ενεργοποιήστε το στο αρχείο σας .local:
[recidive]
enabled = trueΤι κάνει και τι δεν κάνει το fail2ban
Το fail2ban είναι χρήσιμο, αλλά δεν είναι η κλειδαριά της πόρτας. Η κλειδαριά είναι η σύνδεση με κλειδί, με απενεργοποιημένους τους κωδικούς πρόσβασης (μάθημα 2.2). Γι' αυτό καλό είναι να γνωρίζετε και τι δεν μπορεί να κάνει το fail2ban:
- Μια κατανεμημένη επίθεση από χιλιάδες διευθύνσεις, με μία ή δύο προσπάθειες η καθεμία, δεν ξεπερνά ποτέ το
maxretry. - Ένας αδύναμος κωδικός πρόσβασης παραμένει αδύναμος. Το fail2ban απλώς επιβραδύνει το μάντεμα, τίποτα περισσότερο.
- Μόνο ό,τι υπάρχει σε ένα log: μια υπηρεσία που δεν καταγράφει αποτυχημένες προσπάθειες, ή ένα log που το fail2ban δεν διαβάζει, δεν το βλέπει.
- Docker: οι αποκλεισμοί στην κανονική αλυσίδα του firewall δεν ισχύουν για δημοσιευμένες θύρες container (μάθημα 9.3). Για υπηρεσίες σε containers χρειάζεται ξεχωριστή ρύθμιση (ενέργεια στην αλυσίδα
DOCKER-USER).
Τι κάνει καλά το fail2ban: κρατά ήσυχο το αρχείο καταγραφής, μειώνει το φορτίο από τα bots και προστατεύει υπηρεσίες όπου χρησιμοποιείτε (ακόμη) κωδικούς πρόσβασης, όπως ένα webmail ή έναν πίνακα διαχείρισης. Για τέτοιες υπηρεσίες υπάρχουν filters για nginx, Postfix, Dovecot και πολλές άλλες.
Στο AlmaLinux και στο Rocky Linux
Εκεί το fail2ban προέρχεται από το EPEL: dnf install epel-release και μετά dnf install fail2ban. Το πακέτο fail2ban εγκαθιστά επίσης τη σύνδεση με το firewalld. Η υπηρεσία SSH ονομάζεται sshd. Ενεργοποιήστε το jail μόνοι σας σε ένα αρχείο .local· σε αντίθεση με το Debian, δεν είναι ενεργό αυτόματα.
Σύνοψη
- Τα bots προσπαθούν να συνδεθούν όλη την ημέρα· με κλειδιά και απενεργοποιημένη σύνδεση με κωδικό πρόσβασης δεν μπαίνουν, και το fail2ban επιπλέον τα κρατά σε απόσταση.
- Ένα jail είναι filter + ενέργεια + όρια (
maxretry,findtime,bantime)· από προεπιλογή 5 προσπάθειες σε 10 λεπτά, αποκλεισμός 10 λεπτών. - Οι δικές σας ρυθμίσεις μπαίνουν στο
jail.localή στοjail.d/*.local, ποτέ στοjail.conf· χρησιμοποιήστεbackend = systemd(απαραίτητο στο Debian 12). - Το
fail2ban-client status sshdδείχνει τις αποκλεισμένες διευθύνσεις, τοset sshd unbanipτις απελευθερώνει· το recidive και τοbantime.incrementαντιμετωπίζουν όσους επανέρχονται. - Το fail2ban δεν σταματά κατανεμημένες επιθέσεις ή αδύναμους κωδικούς πρόσβασης και δεν βλέπει από μόνο του τις θύρες του Docker.
Κουίζ
Άσκηση
Άσκηση Z5.3: Ανάγνωση αρχείου καταγραφής εισβολής. Στο αρχείο παραδείγματος ssh-journal-1.txt υπάρχει ένα απόσπασμα από το journal ενός SSH server με fail2ban, μαζί με την έξοδο του fail2ban-client status sshd. Απαντήστε: ποια διεύθυνση δοκίμασε τα περισσότερα ονόματα χρήστη, ποια διεύθυνση κατάφερε να συνδεθεί με κλειδί και ως ποιος χρήστης, ποια διεύθυνση αποκλείστηκε και τι ώρα, και θα είχε αποκλειστεί αυτή η διεύθυνση και με τις προεπιλεγμένες ρυθμίσεις (maxretry = 5, findtime = 10m); Το πρόγραμμα συγκρίνει με το σταθερό κλειδί απαντήσεων. Αν έχετε δικό σας server με fail2ban, δείτε εκεί επίσης το fail2ban-client status sshd.
Για περαιτέρω μελέτη
- Ασφάλεια του VPS σας: τα πρώτα πέντε λεπτά
- Είμαι μπλοκαρισμένος; Η διεύθυνση IP σας και το firewall μας
- fail2ban, προεπιλεγμένη διαμόρφωση
jail.conf: https://github.com/fail2ban/fail2ban/blob/master/config/jail.conf - Εγχειρίδιο
jail.conf(5): https://manpages.debian.org/trixie/fail2ban/jail.conf.5.en.html
