Liczba ataków na serwery i usługi internetowe rośnie lawinowo. Nowe serwery skanowane są pod względem podatności, pozostawionych domyślnych haseł oraz słabych konfiguracji zaledwie po kilku minutach po podłączeniu do sieci. Zarówno samo skanowanie jak i późniejsze ataki wykonywane są o każdej godzinie dnia i nocy, automatyczne i bez udziału człowieka.
W związku z tym skuteczna ochrona przed atakami brute force poprzez zastosowanie odpowiednich narzędzi IDS/IPS, stanowi kluczowy element w dzisiejszym cyfrowym świecie. Jednym z takich narzędzi jest Fail2Ban, które skutecznie chroni serwery przed atakami typu brute force i wieloma innymi rodzajami prób złamania zabezpieczeń. W tym artykule omówimy, czym jest Fail2Ban i jak go zainstalować oraz skonfigurować, aby poprawić bezpieczeństwo twojego systemu.
Skuteczna ochrona przed atakami brute force. Część 1 – fail2ban
Fail2Ban jest pewnego rodzaju nakładką na IPtables, która blokuje ruch jeśli nastąpiła jakieś niewłaściwe zachowanie np próby skanowania, nieudane logowania itd. Fail2Ban potrafi analizować logi różnych usług w systemach Linux. Jest to możliwe dzięki mechanizmowi konfigurowalnych filtrów oraz zasad działania opartych na wyrażeniach regularnych.
„Bezpieczeństwo zaczyna się od przygotowania na najgorsze scenariusze.”
— Anonymous
1. Zasada działania
- Konfigurowalne filtry: Fail2Ban używa konfigurowalnych filtrów do określenia, jakie logi ma monitorować oraz jakie wzorce w nich szukać. Każdy filtr jest dostosowany do konkretnej usługi lub aplikacji. Na przykład, istnieją gotowe filtry dla popularnych usług takich jak SSH, Apache, Nginx, Postfix itp. Możesz także tworzyć własne filtry, jeśli obsługiwana usługa nie jest uwzględniona w domyślnych filtrach. W tym artykule pokażemy jak dodać własny filtr do obrony Nextcloud.
- Wyrażenia regularne: Filtry Fail2Ban opierają się na wyrażeniach regularnych, które pozwalają na precyzyjne określenie wzorców w logach. Wyrażenia regularne to zestawy reguł, które definiują, jakie ciągi znaków są uważane za pasujące do określonego wzorca. Na przykład, aby wykryć nieudane próby logowania w logach SSH, filtr może używać wyrażenia regularnego do znalezienia linii, które zawierają informacje o nieudanych próbach logowania.
- Zasady działania: Po zdefiniowaniu filtrów Fail2Ban określa, ile prób nieudanego logowania lub innych działań jest wymagane do zablokowania adresu IP oraz przez ile czasu ma być on zablokowany. Możesz dostosować te zasady w plikach konfiguracyjnych Fail2Ban.
- Monitorowanie logów: Fail2Ban regularnie monitoruje określone logi systemowe lub aplikacyjne, sprawdzając, czy jakiekolwiek linie odpowiadają zdefiniowanym filtrom i wyrażeniom regularnym. Jeśli zostanie spełniony warunek, czyli na przykład zostanie wykryta określona liczba prób nieudanego logowania, Fail2Ban podejmuje odpowiednie działania, takie jak tymczasowe zablokowanie adresu IP źródłowego ataku.
Dzięki tym mechanizmom Fail2Ban jest w stanie monitorować i reagować na różne rodzaje działań w logach różnych usług. Jest to szczególnie przydatne do ochrony serwerów przed próbami ataków typu brute force, które mogą występować w wielu różnych aplikacjach i usługach.
2. Instalacja
2.1 Instalacja Debian/Ubuntu
sudo apt-get update sudo apt-get install fail2ban systemctl status fail2ban.service
2.2 Instalacja CentOS/Red Hat/Rocky
ym update yum install fail2ban fail2ban-systemd yum update -y selinux-policy* systemctl enable fail2ban systemctl start fail2ban
3. Konfiguracja
Pliki konfiguracyjne i katalogi File2Ban:
/etc/fail2ban/filter.d/
– Zawiera zestaw predefiniowanych filtrów (regex). Przeważnie nie musimy się tym przejmować, chyba że chcemy napisać swój filtr./etc/fail2ban/jail.conf
– Główny plik konfiguracyjny, jednak nie zaleca się jego bezpośredniej modyfikacji./etc/fail2ban/jail.local
– Twój dostosowany plik konfiguracyjny. Służy do konfigurowania reguł i filtrowania, które „fail2ban” ma zastosować do konkretnych usług i logów. W tym pliku definiowane są konkretne reguły dla usług, takie jak SSH, Apache, czy inne. Możesz dostosować parametry dla każdej reguły, takie jak maksymalna liczba nieudanych prób, czas blokady, itp./etc/fail2ban/fail2ban.conf
– Ten plik zawiera ogólne ustawienia konfiguracyjne dla „fail2ban”. Możesz w nim znaleźć globalne opcje konfiguracyjne dotyczące działania samego „fail2ban” których raczej nie zmieniamy.
Po zainstalowaniu „fail2ban” skopiuj domyślny plik konfiguracyjny do folderu /etc/fail2ban
. Utworzenie pliku jail.local
nie jest konieczne, a wynika raczej z dobrych praktyk, pozwoli na dokonywanie niestandardowych konfiguracji, które nie zostaną nadpisane podczas aktualizacji „fail2ban”.
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Teraz otwórz plik /etc/fail2ban/jail.local
w edytorze tekstowym, aby skonfigurować reguły banowania i inne parametry
3.1 Obrona SSH
sudo nano /etc/fail2ban/jail.local
Przykład konfiguracji, w którym „fail2ban” będzie monitorować próby logowania SSH i blokować adresy IP po 3 nieudanych próbach w ciągu 10 minut. Blokada wyniesie 10 minut.
[sshd] enabled = true port = ssh # port usługi z /etc/services filter = sshd logpath = /var/log/auth.log maxretry = 3 #maksymalna ilość prób findtime = 600 #czas znalezienia bantime = 600 #czas bana backend = systemd #integracja z systemem dzienników systemd
po zmianie konfiguracji należy oczywiście zrestartować usługę i sprawdzić jej status:
sudo systemctl restart fail2ban sudo systemctl status fail2ban
W razie potrzeby możemy dodać konkretne adresy IP do białej listy, aby nie były nigdy blokowane:
ignoreip = 127.0.0.1/8
3.2 Obrona PhpMyAdmin
Fail2ban nie posiada domyślnie zdefiniowanych filtrów i akcji dla PhpMyAdmin dlatego też musimy stworzyć je ręcznie. Najpierw potrzebujemy skonfigurować nowe „więzienie” w naszym pliku jail.local
lub dla przejrzystości konfiguracji tworzymy osobny plik w katalogu z dynamicznymi konfiguracjami:
vim /etc/fail2ban/jail.d/phpmyadmin.local
[phpmyadmin] enabled = true port = http,https filter = phpmyadmin action = iptables-multiport[name=PHPMYADMIN, port="http,https", protocol=tcp] logpath = /var/log/nginx/access.log bantime = 3600 findtime = 60 maxretry = 3
Załóżmy, że mam serwer Nginx na którym działa nasze PhpMyAdmin. W logach widzimy następujące wpisy
/var/log/nginx/access.log.1:218.65.30.61 - - [19/Sep/2023:01:41:23 +0000] "GET /phpmyadmin/index.php?pma_username=root&pma_password=qwerty&server=1 HTTP/1.1" 200 10050 "-" "Mozilla/5.0" /var/log/nginx/access.log.1:218.65.30.61 - - [19/Sep/2023:01:41:23 +0000] "GET /phpmyadmin/index.php?pma_username=root&pma_password=toor&server=1 HTTP/1.1" 200 10050 "-" "Mozilla/5.0" /var/log/nginx/access.log.1:218.65.30.61 - - [19/Sep/2023:01:41:23 +0000] "GET /phpmyadmin/index.php?pma_username=root&pma_password=r00t&server=1 HTTP/1.1" 200 10050 "-" "Mozilla/5.0"
Adres IP 218.65.30.61 próbuje się włamać wykorzystując bruteforce. Postaramy się nieco utrudnić mu życie. Tworzymy filtr /etc/fail2ban/filter.d/phpmyadmin.conf
o zawartości:
[Definition] failregex = ^<HOST> -.*"(GET|POST).*/phpmyadmin/index\.php\?pma_username=root&pma_password=.*$ ignoreregex =
Po zakończeniu tworzenia filtra warto go przetestować przed aktywacją. Do tego mamy fail2ban-regex
:
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/phpmyadmin.conf Running tests ============= Use failregex filter file : phpmyadmin, basedir: /etc/fail2ban Use log file : /var/log/nginx/access.log Use encoding : UTF-8 Results ======= Failregex: 6 total |- #) [# of hits] regular expression | 1) [56] ^<HOST> -.*"(GET|POST).*/phpmyadmin/index\.php\?pma_username=root&pma_password=.*$ `- Ignoreregex: 0 total
dodanie nowej konfiguracji wymaga oczywiście restartu usługi:
sudo systemctl restart fail2ban fail2ban-client status phpmyadmin
3.3 Obrona Nextcloud
W przypadku Nextcloud sytuacja wygląda podobnie jak w przypadku PhpMyAdmin – sami musimy stworzyć odpowiednie filtry oraz dodać konfigurację. W tym celu dodajemy kolejną sekcję w naszym pliku jail.local
lub dla przejrzystości konfiguracji tworzymy osobny plik w katalogu z dynamicznymi konfiguracjami:
vim /etc/fail2ban/jail.d/nextcloud.local
[nextcloud] backend = auto enabled = true port = 80,443 protocol = tcp filter = nextcloud maxretry = 3 bantime = 86400 findtime = 43200 logpath = /path/to/data/directory/nextcloud.log
teraz tworzymy filtr:
vim /etc/fail2ban/filter.d/nextcloud.conf
zawartość:
[Definition] _groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*) failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed: ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Trusted domain error. datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"
restartujemy i sprawdzamy status
sudo systemctl restart fail2ban fail2ban-client status nextcloud
4. Obsługa
4.1 Sprawdzanie uruchomionych więzień
Do sprawdzania stanu poszczególnych więzień służy polecenie fail2ban-client
:
sudo fail2ban-client status Status |- Number of jail: 2 `- Jail list: sshd, nextcloud
4.2 Sprawdzanie statusu konkretnego więzienia
sudo fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 0 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:
4.3 Odblokowywanie konkretnego IP
W przypadku gdy przez przypadek nastąpiła blokada jakiegoś adresu IP, możemy ją oczywiście usunąć:
fail2ban-client set nextcloud unbanip 185.202.58.98
5. Hints and tips
5.1 Ubuntu UFW
Domyślną wartością dla opcji „banaction” w „fail2ban” jest „iptables-multiport”. Opcja „banaction” określa narzędzie lub akcję, które „fail2ban” używa do blokowania adresów IP po przekroczeniu określonych próg. W przypadku „iptables-multiport”, „fail2ban” korzysta z narzędzia iptables, aby dodać regułę do zapory sieciowej i zablokować adres IP. Natomiast jeśli korzystamy z UFW możemy zintegrować z nim „fail2ban” tak aby wszystkie blokady były widoczne po wydaniu polecenia:
sudo ufw status
w tym celu w jail.local
w sekcji globalnej ustawiamy:
banaction = ufw banaction_allports = ufw
5.3 Sprawdzanie zbanowanych IP
Wszystkie historycznie zbanowane adresy IP zapisane są w logach, dlatego też w łatwy sposób możemy je przefiltrować i wykorzystać do dalszych celów:
zgrep 'Ban' /var/log/fail2ban.log*
Podsumowanie
Fail2Ban to potężne narzędzie do ochrony serwerów przed atakami typu brute force i wieloma innymi zagrożeniami. Instalacja i konfiguracja Fail2Ban na systemach Debian i RedHat są stosunkowo proste i mogą znacząco poprawić bezpieczeństwo twojego systemu. Pamiętaj, że skuteczność Fail2Ban zależy od odpowiedniej konfiguracji, więc warto poświęcić czas na dostosowanie go do własnych potrzeb. Dzięki temu możesz spać spokojnie, wiedząc, że twoje serwery są lepiej chronione przed potencjalnymi atakami. Jeśli masz jakieś pytanie zostaw komentarz.