Używam fail2ban na wszystkich serwerach z publicznie widocznymi usługami i zastanawiam się:
- Czy istnieje prosty sposób udostępniania zabronionych adresów IP między kontrolowanymi przeze mnie hostami?
- Czy istnieje usługa gromadząca i publikująca te dane?
Dostaję niezliczoną liczbę prób logowania od pierwszego dnia konfiguracji tego serwera.
Odpowiedzi:
Kiedyś widziałem system centralizacji danych fail2ban na tej stronie i stworzyłem zmodyfikowaną wersję. Baza danych jest taka sama, ale zmieniłem i stworzyłem kilka skryptów.
Mój system ma 4 elementy:
baza danych fail2ban
Jest to baza danych MySQL zawierająca tylko jedną tabelę
erp_core_fail2ban
:fail2ban.php
Za każdym razem, gdy host jest zbanowany, zapełni bazę danych:
cron2ban
Każdą minutę uruchamiasz na crontabie. Pobierze ostatnio dodane hosty i zablokuje je.
phpconfig
Ten plik trafia do / etc / fail2ban i ma konfigurację bazy danych oraz wybór więzienia.
Utwórz te pliki i zmień konfigurację z fail2ban:
Po wierszu z
actionban = .....
wstawionym nowym wierszem, aby wywołać skrypt PHP:/root/fail2ban.php <name> <protocol> <port> <ip>
Używanie tej struktury na wszystkich serwerach zapewni, że za każdym razem, gdy jeden host zostanie zbanowany na jednym serwerze, wszystkie inne serwery również go zbanują.
źródło
Zrobiłem więc wiele badań, jak to zrobić po tym, jak ten sam adres IP uderzył w mój klaster serwerów sieciowych jeden po drugim. Ponieważ korzystam z AWS, pomyślałem, że może być prosty sposób, który działa pięknie w pierwszych dwóch dniach testowania 5 serwerów.
Pierwszą rzeczą, którą polecam, jest tymczasowe wyłączenie SELinux, poradzimy sobie z tym na końcu. Nie jestem ekspertem SELinux, ale to, co zrobiłem, działa do tej pory.
Podstawowym wymaganiem jest udostępnione źródło plików, używam AWS EFS. Po udostępnieniu i zamontowaniu nowego dysku zmieniłem logtarget w /etc/fail2ban/fail2ban.conf na podfolder na dysku EFS.
Potem napisałem prosty filtr i umieściłem go w /etc/fail2ban/filter.d/fail2ban-log.conf
Dodano filtr do /etc/fail2ban/jail.local
Następnie ponownie uruchomiłem fail2ban
Jak na razie dobrze! Nie, bolesną częścią jest SELinux. Po tym, jak pozwoliłem trochę uruchomić fail2ban, uruchomiłem tę komendę, która pozwoliłaby fail2ban przez filtry.
Audit2allow powie Ci, aby uruchomić to polecenie
Nadal sprawdzam moje dzienniki SELinuksa tu i tam, aby sprawdzić, czy są jakieś odmowy. Jeśli ktoś ma wskazówkę, jak uzyskać czysty SELinux za pomocą innej metody, która byłaby niesamowita.
W tym momencie wciąż pojawiały się błędy podczas restartowania fail2ban. Wystąpił błąd podczas używania action = action_mwl w jail.local. Po trochę googlingu znalazłem to, które działa do tej pory. Z tego, co przeczytałem, z powodu podziałów linii w dyrektywie logpath wskazujących na wiele plików. Próbowałem z przecinkami, spacjami itp. Nic innego nie działało z Action_mwl.
Nie zapomnij ponownie włączyć SELinux!
źródło
Właśnie to zaimplementowałem i do tej pory wydaje się, że działa dobrze. Musiałem jednak zaktualizować część php, ponieważ skrypty w oryginalnej odpowiedzi używają przestarzałych funkcji.
Oto zaktualizowane skrypty
phpconfig.php
fail2ban.php
cron2ban.php
Ponadto, gdziekolwiek umieścisz akcję fail2ban.php, musi być wcięta tak samo jak linia powyżej. Na przykład:
W przeciwnym razie fail2ban nie uruchomi się. Mam nadzieję, że pomoże to każdemu, kto spróbuje to wdrożyć.
źródło
Alternatywą
fail2ban
jest DenyHosts która pochodzi z funkcji synchronizacji. Instalacja jest dość podobna dofail2ban
, zobacz więcej informacji w tutorialu Cyberciti .Problem polega na tym, że usługa synchronizacji jest scentralizowana, a kod źródłowy po stronie serwera wydaje się być niedostępny, więc nie możesz łatwo uruchomić własnej usługi DenyHosts i musisz polegać na firmach trzecich (co może być w porządku dla niektórych przypadków użycia).
źródło
Tak i tak. Oba można zrobić.
Musisz znaleźć odpowiedni mechanizm do udostępniania listy adresów IP. Jeśli na przykład używasz AWS, możesz skorzystać z s3. Możesz użyć rsync między hostami Linux lub bazą danych wspólną dla wszystkich hostów. Możesz uruchomić usługę z ulubionym językiem programowania, który zapewnia spokojny interfejs API, wybór należy do Ciebie.
Jeśli udostępnisz listę publicznie sojusznikowi, możesz stworzyć stronę internetową i hostować prosty plik tekstowy, niektórzy już udostępniają takie listy (nie wiem, czy pochodzą z tłumu). Jak stworzyć własną stronę / usługę, nie można znaleźć odpowiedzi, jednak nie powinno to być trudne.
źródło
Dość ręczna konfiguracja polegałaby na zmianie konfiguracji wywołującej
iptables
aktualizację reguł, tak aby wywoływał własny skrypt, który zapętla listę hostów (czyta z pliku?) I wykonujeiptables
połączenia na każdym za pośrednictwem SSH. Potrzebujesz uwierzytelnienia opartego na kluczach między wszystkimi skonfigurowanymi hostami, aby to działało. Narzędzia do automatyzacji administracji, takie jak marionetka, mogą ułatwić konfigurację i konserwację. Nie byłoby to zbyt wydajne, ale jeśli nie zobaczysz ogromnej ilości sondującego ruchu (i / lub masz ogromną liczbę hostów), to jestem pewien, że byłoby wystarczająco dobre. Jeśli masz tylko kilka hostów, nie musisz nawet zapętlać pliku: skonfiguruj każdy z nich, aby po prostu wywoływał pozostałe. Nakład skryptów będzie minimalny.Bez wątpienia jest wiele sposobów. Poproś skrypty o upuszczenie danych do bazy danych i poproś klientów, aby z nich odczytali, przeszukując nowe reguły i uruchamiając je w miarę wchodzenia. Proste „uruchom regułę tak, jak widzisz” nie będzie idealne, jeśli wielu gospodarze przesyłają informacje, na przykład ten przypadek:
ale nie powinno to stanowić poważnego problemu, a jeśli staniesz się nieco bardziej sprytny z bazą danych, możesz lepiej zarządzać wieloma zgłoszeniami, jeśli zdecydujesz, że warto.
Uruchomienie tego jako usługi publicznej otworzyłoby cię w świecie problemów administracyjnych:
źródło