
Jeśli korzystasz z Fail2Ban przy Nginx i WordPress, to prędzej czy później zauważysz jedną rzecz: te same adresy IP wracają. Dostają bana na kilka minut albo godzinę, znikają… i po chwili znowu próbują /.env, /wp-login.php, /phpmyadmin czy inne popularne ścieżki ataku.
Rozwiązaniem nie jest agresywne podkręcanie filtrów. Rozwiązaniem jest recidive — drugi poziom ochrony w Fail2Ban, który analizuje historię banów i długoterminowo blokuje recydywistów.
Nawiązanie do wcześniejszej konfiguracji
Jeśli nie masz jeszcze podstawowej konfiguracji Fail2Ban dla Nginx i WordPress, opisałem ją tutaj:
Fail2Ban + Nginx + WordPress – konfiguracja podstawowa
W tamtym artykule konfigurujemy jail’e typu nginx-exploit, nginx-secure czy sshd. Recidive nie zastępuje tej konfiguracji — on ją wzmacnia.
Jak znaleźć recydywistów w logach
Najpierw warto sprawdzić, czy problem faktycznie występuje. Wyciągamy z logów Fail2Ban listę IP, które były banowane najczęściej:
|
1 |
grep "Ban " /var/log/fail2ban.log | awk '{print $NF}' | sort | uniq -c | sort -nr | head |
Przykładowy wynik (adresy częściowo anonimizowane):
|
1 2 3 4 5 6 7 8 9 10 |
13 204.76.203.18 9 41.142.XXX.XXX 8 64.89.XXX.XXX 8 50.82.XXX.XXX 8 35.243.XXX.XXX 8 34.24.XXX.XXX 7 45.166.XXX.XXX 7 34.83.XXX.XXX 7 176.42.XXX.XXX 6 49.36.XXX.XXX |
Jeśli widzisz liczby typu 8, 9, 13 — to znaczy, że te IP wracają po zdjęciu bana. Krótki bantime jest dla nich tylko przerwą techniczną.
Dlaczego recidive jest lepszy niż zwiększanie bantime
- Nie musisz banować każdego na 24h za jedną literówkę w URL.
- Nie zwiększasz ryzyka blokady normalnych użytkowników.
- Kara jest progresywna i dotyczy tylko powracających adresów.
Recidive analizuje /var/log/fail2ban.log i liczy, ile razy dane IP zostało zbanowane przez inne jail’e. Dzięki temu “dobić” można tylko tych, którzy już wcześniej wielokrotnie trafiali na blokadę.
Konfiguracja recidive (5 banów w 24h = 7 dni bana)
Dodaj poniższy blok do /etc/fail2ban/jail.local:
|
1 |
nano /etc/fail2ban/jail.local |
Na końcu pliku wklej:
|
1 2 3 4 5 6 |
[recidive] enabled = true logpath = /var/log/fail2ban.log bantime = 7d findtime = 1d maxretry = 5 |
Zapisz plik i zrestartuj Fail2Ban:
|
1 |
systemctl restart fail2ban |
Sprawdź status jaila:
|
1 |
fail2ban-client status recidive |
Jak sprawdzić kto jest blisko progu recidive
Jeśli chcesz zobaczyć IP, które już mają kilka banów i zbliżają się do progu recidive:
|
1 |
grep "Ban " /var/log/fail2ban.log | awk '{print $NF}' | sort | uniq -c | awk '$1 >= 3 {print}' | sort -nr |
Podsumowanie
Recidive to jeden z najprostszych i najbardziej skutecznych sposobów na ograniczenie powracających skanerów i botów. Zamiast agresywnie banować wszystkich — blokujesz tylko tych, którzy wracają wielokrotnie.
W środowisku z wieloma domenami, Nginx reverse proxy i WordPress to praktycznie obowiązkowy element konfiguracji: mniej szumu w logach, mniej powtarzalnych ataków i mniej ręcznej analizy.