fail2ban przeciwko próbom zgadywania haseł
Moduł 5: Zabezpieczanie sieci · Czas czytania: 10 min
Cel lekcji: Po tej lekcji potrafią Państwo skonfigurować fail2ban dla SSH, odczytać jego status i log, ponownie odblokować adres oraz wyjaśnić, przed czym fail2ban chroni, a przed czym nie.
Kluczowe pojęcia: brute force, jail, filtr, akcja (banaction), maxretry, findtime, bantime, bantime.increment, ignoreip, backend systemd, jail.conf, jail.local i jail.d, fail2ban-client, recidive
Internetowi „sprawdzacze klamek”
Wystarczy dzień po instalacji zajrzeć do logu SSH, aby to zobaczyć: setki prób logowania z nazwami takimi jak root, admin, test, ubuntu i oracle, z adresów na całym świecie.
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(W Ubuntu usługa nazywa się ssh, w AlmaLinux i Rocky sshd. Nazwa procesu może brzmieć sshd lub sshd-session, w zależności od wersji OpenSSH.) To jest atak typu brute force: boty, które po prostu próbują wszystkich popularnych nazw użytkowników i haseł. Jeśli logują się Państwo kluczami, a logowanie hasłem jest wyłączone (lekcja 2.2), boty nigdy nie wejdą, niezależnie od liczby prób. Zapełniają jednak log, zużywają trochę mocy obliczeniowej, a w usługach, w których hasło jest nadal potrzebne (poczta przez przeglądarkę, panel administracyjny), mogą być naprawdę niebezpieczne.
fail2ban czyta logi, rozpoznaje nieudane próby i na pewien czas blokuje w zaporze adres, który zbyt często się myli.
Jak myśli fail2ban: jails
fail2ban pracuje z jails (celami). Jail łączy trzy elementy:
- filtr: wyrażenia regularne, które rozpoznają w logu nieudane próby (na przykład wiersz "Invalid user ... from <adres>", czyli nieistniejący użytkownik z danego adresu);
- akcję: co się dzieje przy zbyt wielu próbach, zwykle reguła zapory blokująca adres (
banaction, w Debian 13 domyślnie przez nftables); - progi: ile nieudanych prób (
maxretry) w jakim czasie (findtime) prowadzi do blokady na jak długo (bantime).
Wartości domyślne z jail.conf to: maxretry = 5, findtime = 10m, bantime = 10m. Oznacza to: pięć nieudanych prób w ciągu dziesięciu minut daje dziesięć minut blokady.
Instalacja i pułapka Debiana 12
anna@web1:~$ sudo apt install fail2ban
anna@web1:~$ sudo systemctl status fail2banW Debianie i Ubuntu jail dla SSH ([sshd]) jest włączony od razu po instalacji, za pomocą pliku /etc/fail2ban/jail.d/defaults-debian.conf.
Istnieje jedna znana pułapka. fail2ban musi wiedzieć, gdzie znajduje się log. Dawniej był to plik tekstowy /var/log/auth.log. Od Debiana 12 rsyslog nie jest już instalowany domyślnie, a komunikaty trafiają wyłącznie do journala systemd (lekcja 6.2). Pakiet fail2ban w Debianie 12 nadal szukał /var/log/auth.log, nie znajdował go i nie uruchamiał się. Debian 13 rozwiązał to, ustawiając w defaults-debian.conf dla SSH backend = systemd. W Debianie 12 rozwiązują to Państwo sami (patrz niżej) w ten sam sposób. Ubuntu nadal ma domyślnie rsyslog, ale backend = systemd działa tam również.
Własne ustawienia: jail.local
Prosimy nigdy nie zmieniać jail.conf: ten plik jest zastępowany przy aktualizacji. Własne ustawienia prosimy umieszczać w /etc/fail2ban/jail.local lub w pliku w katalogu /etc/fail2ban/jail.d/ z rozszerzeniem .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 = systemdCo robią poszczególne wiersze:
bantime = 1h: godzina blokady zamiast dziesięciu minut.bantime.increment = true: kto po blokadzie wraca, za każdym razem dostaje dłuższą blokadę.ignoreip: adresy, które nigdy nie są blokowane. Prosimy wpisać tu stały adres IP swojego biura, jeśli Państwo taki mają. Nie należy wpisywać tu dużych zakresów „na wszelki wypadek”.backend = systemd: czytanie journala zamiast pliku tekstowego (konieczne w Debianie 12, zalecane wszędzie). Wymaga to zainstalowanego pakietupython3-systemd; zwykle jest on już zainstalowany jako zależność.
Przeładowanie i sprawdzenie:
anna@web1:~$ sudo fail2ban-client -t # przetestuj konfigurację
OK: configuration test is successful
anna@web1:~$ sudo systemctl reload fail2ban
anna@web1:~$ sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshdOdczytywanie statusu, blokowanie i odblokowywanie
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" to adresy, które wykonały już próby, ale nie przekroczyły jeszcze progu. "Currently banned" to adresy, które są w tej chwili zablokowane.
Jeśli zablokowali Państwo samych siebie (na przykład kilkukrotnie próbując z niewłaściwym kluczem lub nazwą użytkownika), prosimy zalogować się z innej sieci lub przez konsolę i odblokować swój adres:
anna@web1:~$ sudo fail2ban-client set sshd unbanip 198.51.100.20Log samego fail2ban znajduje się w /var/log/fail2ban.log i pokazuje, kiedy który adres został zablokowany i odblokowany:
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.77Recydywiści: recidive
Niektóre boty po każdej blokadzie po prostu wracają. Są na to dwa środki. bantime.increment (powyżej) za każdym razem wydłuża blokadę. Dodatkowo istnieje jail recidive: czyta on log samego fail2ban i blokuje adres, który w ciągu doby był wielokrotnie blokowany, na tydzień na wszystkich portach. Włącza się go w pliku .local:
[recidive]
enabled = trueCo fail2ban robi, a czego nie
fail2ban jest przydatny, ale nie jest zamkiem w drzwiach. Zamkiem jest logowanie kluczem przy wyłączonych hasłach (lekcja 2.2). Dlatego warto wiedzieć, czego fail2ban nie potrafi:
- Rozproszony atak z tysięcy adresów, każdy z jedną lub dwiema próbami, nigdy nie przekroczy
maxretry. - Słabe hasło pozostaje słabe. fail2ban spowalnia zgadywanie, nic więcej.
- Tylko to, co jest w logu: usługi, która nie zapisuje nieudanych prób, lub logu, którego fail2ban nie czyta, on nie widzi.
- Docker: blokady w zwykłym łańcuchu zapory nie obowiązują dla opublikowanych portów kontenerów (lekcja 9.3). Dla usług w kontenerach potrzebne jest osobne ustawienie (akcja na łańcuchu
DOCKER-USER).
Co fail2ban robi dobrze: utrzymuje porządek w logu, zmniejsza obciążenie przez boty i chroni usługi, w których (jeszcze) używają Państwo haseł, takie jak poczta przez przeglądarkę czy panel administracyjny. Dla takich usług istnieją filtry dla nginx, Postfix, Dovecot i wielu innych.
W AlmaLinux i Rocky Linux
Tam fail2ban pochodzi z EPEL: dnf install epel-release, a następnie dnf install fail2ban. Pakiet fail2ban instaluje również integrację z firewalld. Usługa SSH nazywa się sshd. Jail należy włączyć samodzielnie w pliku .local; inaczej niż w Debianie nie jest on włączony automatycznie.
Podsumowanie
- Boty przez cały dzień próbują się logować; przy kluczach i wyłączonym logowaniu hasłem nie wejdą, a fail2ban dodatkowo trzyma je na dystans.
- Jail to filtr + akcja + progi (
maxretry,findtime,bantime); domyślnie 5 prób w 10 minut, 10 minut blokady. - Własne ustawienia w
jail.locallubjail.d/*.local, nigdy wjail.conf; prosimy używaćbackend = systemd(konieczne w Debianie 12). fail2ban-client status sshdpokazuje zablokowane adresy,set sshd unbanipje odblokowuje; recidive ibantime.incrementradzą sobie z recydywistami.- fail2ban nie zatrzymuje rozproszonych ataków ani nie naprawia słabych haseł i sam z siebie nie widzi portów Dockera.
Quiz
Zadanie
Zadanie Z5.3: Odczytywanie logu włamania. W przykładowym pliku ssh-journal-1.txt znajduje się fragment journala serwera SSH z fail2ban oraz wynik polecenia fail2ban-client status sshd. Prosimy odpowiedzieć: który adres próbował najwięcej nazw użytkowników, który adres zdołał zalogować się kluczem i jako który użytkownik, który adres został zablokowany i o której godzinie oraz czy ten adres zostałby zablokowany także przy ustawieniach domyślnych (maxretry = 5, findtime = 10m)? Program porównuje odpowiedzi ze stałym kluczem. Jeśli mają Państwo własny serwer z fail2ban, prosimy sprawdzić tam również fail2ban-client status sshd.
Przeczytaj więcej
- Zabezpieczanie VPS: pierwsze pięć minut
- Czy jestem zablokowany? Adres IP i nasza zapora sieciowa
- fail2ban, domyślna konfiguracja
jail.conf: https://github.com/fail2ban/fail2ban/blob/master/config/jail.conf - Podręcznik
jail.conf(5): https://manpages.debian.org/trixie/fail2ban/jail.conf.5.en.html
