Wyszukiwanie w witrynie

Chroń Apache przed atakami Brute Force lub DDoS za pomocą modułów Mod_Security i Mod_evasive


Dla tych z Was, którzy zajmują się hostingiem lub hostują własne serwery i wystawiają je na działanie Internetu, zabezpieczenie systemów przed atakami musi być wysokim priorytetem.

mod_security (silnik wykrywania i zapobiegania włamaniom typu open source dla aplikacji internetowych, który płynnie integruje się z serwerem WWW) i mod_evasive to dwa bardzo ważne narzędzia, których można użyć do ochrony serwera WWW przed atakami typu brute-force lub (D)DoS.

mod_evasive, jak sama nazwa wskazuje, zapewnia możliwości uniknięcia ataku, działając jako parasol chroniący serwery internetowe przed takimi zagrożeniami.

W tym artykule omówimy, jak je zainstalować, skonfigurować i uruchomić wraz z Apache na RHEL/CentOS 8 i 7 jako a także Fedora. Dodatkowo przeprowadzimy symulację ataków, aby sprawdzić, czy serwer odpowiednio reaguje.

Zakłada się, że masz zainstalowany serwer LAMP w swoim systemie. Jeśli nie, zapoznaj się z tym artykułem, zanim przejdziesz dalej.

  • Jak zainstalować serwer LAMP na CentOS 8
  • Jak zainstalować stos LAMP w RHEL/CentOS 7

Będziesz także musiał skonfigurować iptables jako domyślny front-end zapory sieciowej zamiast firewalld, jeśli używasz RHEL/CentOS 8/7 lub Fedora mocny>. Robimy to, aby używać tego samego narzędzia zarówno w RHEL/CentOS 8/7, jak i Fedorze.

Krok 1: Instalowanie zapory Iptables na RHEL/CentOS 8/7 i Fedorze

Aby rozpocząć, zatrzymaj i wyłącz zaporę sieciową:

systemctl stop firewalld
systemctl disable firewalld

Następnie zainstaluj pakiet iptables-services przed włączeniem iptables:

yum update && yum install iptables-services
systemctl enable iptables
systemctl start iptables
systemctl status iptables

Krok 2: Instalacja Mod_Security i Mod_evasive

Oprócz posiadania już skonfigurowanej konfiguracji LAMP, będziesz musiał także włączyć repozytorium EPEL w RHEL/CentOS 8/7, aby aby zainstalować oba pakiety. Użytkownicy Fedory nie muszą włączać żadnego repozytorium, ponieważ epel jest już częścią Projektu Fedora.

yum update && yum install mod_security mod_evasive

--------------- CentOS/RHEL 8 --------------- 
dnf install https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-1.el8.noarch.rpm
dnf --enablerepo=raven-extras install mod_evasive

Po zakończeniu instalacji pliki konfiguracyjne obu narzędzi znajdziesz w pliku /etc/httpd/conf.d.

ls -l /etc/httpd/conf.d

Teraz, aby zintegrować te dwa moduły z Apache i załadować je po uruchomieniu, upewnij się, że w sekcji najwyższego poziomu pliku mod_evasive.conf pojawiają się następujące wiersze i odpowiednio mod_security.conf:

LoadModule evasive20_module modules/mod_evasive24.so
LoadModule security2_module modules/mod_security2.so

Pamiętaj, że modules/mod_security2.so i modules/mod_evasive24.so to ścieżki względne z katalogu /etc/httpd do pliku źródłowego modułu. Możesz to sprawdzić (i zmienić, jeśli zajdzie taka potrzeba), wypisując zawartość katalogu /etc/httpd/modules:

cd /etc/httpd/modules
pwd
ls -l | grep -Ei '(evasive|security)'

Następnie zrestartuj Apache i sprawdź, czy ładuje mod_evasive i mod_security:

systemctl restart httpd 	

Zrzuć listę załadowanych modułów statycznych i współdzielonych.

httpd -M | grep -Ei '(evasive|security)'				

Krok 3: Instalacja podstawowego zestawu reguł i konfiguracja Mod_Security

W kilku słowach Podstawowy zestaw reguł (inaczej CRS) dostarcza serwerowi WWW instrukcje dotyczące zachowania w określonych warunkach. Firma deweloperska mod_security udostępnia bezpłatny CRS o nazwie OWASP (Open Web Application Security Project) ModSecurity CRS, który można pobrać i zainstalować w następujący sposób.

1. Pobierz OWASP CRS do utworzonego w tym celu katalogu.

mkdir /etc/httpd/crs-tecmint
cd /etc/httpd/crs-tecmint
wget -c https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.2.0.tar.gz -O master

2. Rozpakuj plik CRS i zmień nazwę katalogu dla naszej wygody.

tar xzf master
mv owasp-modsecurity-crs-3.2.0 owasp-modsecurity-crs

3. Teraz czas skonfigurować mod_security. Skopiuj przykładowy plik z regułami (owasp-modsecurity-crs/modsecurity_crs_10_setup.conf.example) do innego pliku bez rozszerzenia .example:

cd owasp-modsecurity-crs/
cp crs-setup.conf.example crs-setup.conf

i powiedz Apache, aby używał tego pliku wraz z modułem, wstawiając następujące linie do głównego pliku konfiguracyjnego serwera WWW. Plik /etc/httpd/conf/httpd.conf. Jeśli zdecydujesz się rozpakować archiwum tar w innym katalogu, będziesz musiał edytować ścieżki zgodnie z dyrektywami Include:

<IfModule security2_module>
        Include crs-tecmint/owasp-modsecurity-crs/crs-setup.conf
        Include crs-tecmint/owasp-modsecurity-crs/rules/*.conf
</IfModule>

Na koniec zaleca się utworzenie własnego pliku konfiguracyjnego w katalogu /etc/httpd/modsecurity.d, w którym umieścimy nasze dostosowane dyrektywy (nazwiemy go tecmint.conf b> w poniższym przykładzie) zamiast bezpośrednio modyfikować pliki CRS. Umożliwi to łatwiejszą aktualizację systemów CRS po wydaniu nowych wersji.

<IfModule mod_security2.c>
	SecRuleEngine On
	SecRequestBodyAccess On
	SecResponseBodyAccess On 
	SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream 
	SecDataDir /tmp
</IfModule>

Pełny przewodnik objaśniający dyrektywy konfiguracyjne mod_security można znaleźć w repozytorium ModSecurity GitHub firmy SpiderLabs.

Krok 4: Konfiguracja Mod_Evasive

mod_evasive konfiguruje się za pomocą dyrektyw w /etc/httpd/conf.d/mod_evasive.conf. Ponieważ nie ma żadnych reguł aktualizacji podczas aktualizacji pakietu, nie potrzebujemy osobnego pliku, aby dodać dostosowane dyrektywy, w przeciwieństwie do mod_security.

Domyślny plik mod_evasive.conf ma włączone następujące dyrektywy (zwróć uwagę, że plik ten zawiera liczne komentarze, dlatego usunęliśmy komentarze, aby podkreślić poniższe dyrektywy konfiguracyjne):

<IfModule mod_evasive24.c>
    DOSHashTableSize    3097
    DOSPageCount        2
    DOSSiteCount        50
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10
</IfModule>

Wyjaśnienie dyrektyw:

  • DOSHashTableSize: ta dyrektywa określa rozmiar tablicy mieszającej używanej do śledzenia aktywności na podstawie adresu IP. Zwiększenie tej liczby zapewni szybsze wyszukiwanie witryn, które klient odwiedził w przeszłości, ale może mieć wpływ na ogólną wydajność, jeśli zostanie ustawiona zbyt wysoko.
  • DOSPageCount: uzasadniona liczba identycznych żądań do określonego URI (na przykład dowolnego pliku udostępnianego przez Apache), które użytkownik może wykonać w interwale DOSPageInterval.
  • DOSSiteCount: podobny do DOSPageCount, ale odnosi się do ogólnej liczby żądań, które można wysłać do całej witryny w przedziale DOSSiteInterval.
  • DOSBlockingPeriod: jeśli odwiedzający przekroczy limity ustawione przez DOSSPageCount lub DOSSiteCount, jego źródłowy adres IP zostanie umieszczony na czarnej liście przez określony czas DOSBlockingPeriod. Podczas DOSBlockingPeriod wszelkie żądania przychodzące z tego adresu IP będą napotykały błąd 403 Forbidden.

Możesz poeksperymentować z tymi wartościami, aby Twój serwer WWW był w stanie obsłużyć wymaganą ilość i rodzaj ruchu.

Tylko małe zastrzeżenie: jeśli te wartości nie zostaną ustawione prawidłowo, istnieje ryzyko zablokowania legalnych gości.

Możesz także rozważyć inne przydatne dyrektywy:

DOSEmailPowiadom

Jeśli masz działający serwer pocztowy, możesz wysyłać komunikaty ostrzegawcze za pośrednictwem Apache. Pamiętaj, że będziesz musiał przyznać użytkownikowi Apache SELinux uprawnienia do wysyłania wiadomości e-mail, jeśli SELinux jest ustawiony na wymuszanie. Możesz to zrobić biegając

setsebool -P httpd_can_sendmail 1

Następnie dodaj tę dyrektywę do pliku mod_evasive.conf wraz z resztą pozostałych dyrektyw:

DOSEmailNotify [email 

Jeśli ta wartość jest ustawiona, a Twój serwer pocztowy działa prawidłowo, wiadomość e-mail zostanie wysłana na podany adres za każdym razem, gdy adres IP zostanie umieszczony na czarnej liście.

Polecenie systemu DOS

Wymaga to prawidłowego polecenia systemowego jako argumentu,

DOSSystemCommand </command>

Ta dyrektywa określa polecenie, które ma zostać wykonane, gdy adres IP zostanie umieszczony na czarnej liście. Często jest używany w połączeniu ze skryptem powłoki, który dodaje regułę zapory sieciowej blokującą dalsze połączenia przychodzące z tego adresu IP.

Napisz skrypt powłoki, który obsługuje czarną listę adresów IP na poziomie zapory ogniowej

Kiedy adres IP znajdzie się na czarnej liście, musimy zablokować przyszłe połączenia z niego przychodzące. Będziemy używać następującego skryptu powłoki, który wykonuje to zadanie. Utwórz katalog o nazwie scripts-tecmint (lub dowolną inną nazwę) w /usr/local/bin i plik o nazwie ban_ip.sh w tym katalogu.

#!/bin/sh
IP that will be blocked, as detected by mod_evasive
IP=$1
Full path to iptables
IPTABLES="/sbin/iptables"
mod_evasive lock directory
MOD_EVASIVE_LOGDIR=/var/log/mod_evasive
Add the following firewall rule (block all traffic coming from $IP)
$IPTABLES -I INPUT -s $IP -j DROP
Remove lock file for future checks
rm -f "$MOD_EVASIVE_LOGDIR"/dos-"$IP"

Nasza dyrektywa DOSSystemCommand powinna brzmieć następująco:

DOSSystemCommand "sudo /usr/local/bin/scripts-tecmint/ban_ip.sh %s"

W powyższym wierszu %s oznacza adres IP powodujący naruszenie wykryty przez mod_evasive.

Dodaj użytkownika Apache do pliku sudoers

Pamiętaj, że to wszystko nie zadziała, jeśli nie zezwolisz użytkownikowi Apache na uruchomienie naszego skryptu (i tylko tego skryptu!) bez terminala i hasła. Jak zwykle możesz po prostu wpisać visudo jako root, aby uzyskać dostęp do pliku /etc/sudoers, a następnie dodać następujące 2 linie, jak pokazano na obrazku poniżej:

apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh
Defaults:apache !requiretty

WAŻNE: zgodnie z domyślną polityką bezpieczeństwa możesz uruchomić sudo tylko w terminalu. Ponieważ w tym przypadku musimy użyć sudo bez tty, musimy skomentować linię podświetloną na poniższym obrazku:

#Defaults requiretty

Na koniec zrestartuj serwer WWW:

systemctl restart httpd

Krok 4: Symulacja ataków DDoS na Apache

Istnieje kilka narzędzi, których można użyć do symulacji ataku zewnętrznego na serwer. Możesz po prostu wpisać w Google „narzędzia do symulowania ataków DDos”, aby znaleźć kilka z nich.

Pamiętaj, że Ty i tylko Ty będziesz odpowiedzialny za wyniki swojej symulacji. Nawet nie myśl o przeprowadzeniu symulowanego ataku na serwer, którego nie hostujesz w swojej własnej sieci.

Jeśli chcesz zrobić to samo z VPS hostowanym przez kogoś innego, musisz odpowiednio ostrzec swojego dostawcę usług hostingowych lub poprosić o pozwolenie na przepływ takiego zalewu ruchu przez jego sieci. linux-console.net w żadnym wypadku nie jest odpowiedzialna za Twoje czyny!

Ponadto uruchomienie symulowanego ataku DoS tylko z jednego hosta nie stanowi ataku w rzeczywistości. Aby to zasymulować, należy jednocześnie kierować serwer do kilku klientów.

Nasze środowisko testowe składa się z serwera CentOS 7 [IP 192.168.0.17] i hosta Windows, z którego przeprowadzimy atak [IP 192.168.0.103]:

Odtwórz poniższy film i wykonaj kroki opisane we wskazanej kolejności, aby zasymulować prosty atak DoS:

Następnie niewłaściwy adres IP jest blokowany przez iptables:

Wniosek

Przy włączonych mod_security i mod_evasive symulowany atak powoduje, że CPU i RAM eksperymentują z tymczasowym szczytem użycia przez tylko kilka sekund, zanim źródłowe adresy IP zostaną umieszczone na czarnej liście i zablokowane przez zaporę. Bez tych narzędzi symulacja z pewnością bardzo szybko powali serwer i sprawi, że nie będzie on nadawał się do użytku w trakcie ataku.

Chętnie dowiemy się, czy planujesz używać (lub korzystałeś w przeszłości) tych narzędzi. Zawsze czekamy na wiadomość od Ciebie, więc nie wahaj się zostawić swoich komentarzy i pytań, jeśli takie masz, korzystając z poniższego formularza.

Linki referencyjne

https://www.modsecurity.org/