Przejdź do treści

Ustawienia plików cookie

Prosimy wybrać, na które rodzaje plików cookie Państwo zezwalają. Wybór można zmienić w dowolnym momencie w Ustawieniach plików cookie na dole każdej strony. Polityka prywatności

Niezbędne

Zawsze włączone

Potrzebne do logowania, zachowania koszyka i zapamiętania wyborów. Są zawsze włączone.

Jakie pliki cookie?
  • weboke_sessie, weboke_klant, weboke_remember: sesja i pozostanie zalogowanym
  • weboke_basket: koszyk
  • wkBtwIncl: wyświetlanie cen z VAT lub bez VAT
  • wok_cookies: wybór dotyczący plików cookie, 12 miesięcy

Mierzą, która reklama prowadzi do odwiedzin lub zamówienia, abyśmy nie płacili za reklamy, które nic nie dają.

Jakie pliki cookie?
  • Google Ads przez Google Tag Manager (_gcl_au, _gcl_aw), do 90 dni
  • OpenAI Ads, reklamy w ChatGPT
  • wok_aff: przez którego partnera trafili Państwo do nas (program partnerski), 60 dni

4,6

Kraj i język

Każdy kraj ma własną stronę z cenami i stawką VAT tego kraju.

Wyświetl

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 fail2ban

W 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 = systemd

Co 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 pakietu python3-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:   sshd

Odczytywanie 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.20

Log 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.77

Recydywiś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 = true

Co 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.local lub jail.d/*.local, nigdy w jail.conf; prosimy używać backend = systemd (konieczne w Debianie 12).
  • fail2ban-client status sshd pokazuje zablokowane adresy, set sshd unbanip je odblokowuje; recidive i bantime.increment radzą 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

1. Zainstalowali Państwo fail2ban w Debianie 12 i nie uruchamia się, zgłaszając brak pliku logu dla jaila sshd. Jaka jest przyczyna?



2. Dlaczego ustawienia umieszcza się w jail.local, a nie w jail.conf?



3. Ustawienia domyślne to maxretry = 5, findtime = 10m, bantime = 10m. Pewien adres wykonuje nieudaną próbę o 14:00, 14:03, 14:05, 14:08 i 14:09. Co się dzieje?



4. Państwa serwer codziennie otrzymuje tysiące prób logowania, rozłożonych na dziesiątki tysięcy adresów, każdy z jedną próbą. Co fail2ban może z tym zrobić?



5. Zablokowali Państwo samych siebie, kilka razy wpisując niewłaściwą nazwę użytkownika. Jakie jest właściwe rozwiązanie?



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.

Zadanie Z5.3: Odczytywanie logu włamania

Plik do tego zadania: ssh-journal-1.txt








Wprowadzone dane i wyniki sprawdzania nie są zapisywane. Przeglądarka zapamiętuje udzielone odpowiedzi oraz informację, czy zadanie zostało zaliczone. Po zalogowaniu w Moje kursy zapisywana jest jedynie informacja, że zadanie zostało zaliczone (lub prawie zaliczone); tam można ją również usunąć.

Przeczytaj więcej

Chwileczkę…

Konfiguracja domen

Dla każdej domeny można ustawić serwery nazw, powiązanie z hostingiem oraz to, kto zostanie właścicielem.

Wczytywanie domen…