Potrzebuję reguł, aby porzucić złośliwe połączenie Apache

10

Zrzucam cały ruch na porty z wyjątkiem 80 dla mojego serwera WWW.

Mam kilka takich zasad na iptables:

iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "cgi" --algo bm --to 1000 -j DROP

Ktoś, kto ma więcej, może udostępnić? Wiem, że źli hakerzy ciągle się aktualizują, ale niektórzy z nich zawsze zaczynają od tego samego kodu. Muszę porzucić połączenie na podstawie niektórych kryteriów. Oto niektóre dzienniki Apache (usuwam ips, ale każdy atak pochodzi z tego samego):

Atak 1: Nie wiem, co próbuję zrobić, ale 50 razy z tego samego adresu IP

GET / HTTP/1.1  301 224 -   Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22
GET / HTTP/1.1  302 3387    -   Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22

Atak 2: ta próba uzyskania informacji tylko o serwerze.

GET / HTTP/1.1  301 224 http://myip:80/ Go-http-client/1.1
GET / HTTP/1.1  302 3228    http mywebsite  Go-http-client/1.1
GET /es/ HTTP/1.1   200 40947   https mywebsite Go-http-client/1.1

Atak 3: próbują uzyskać dostęp do podatności na stronie logowania

GET /userlogin/login.aspx HTTP/1.1  302 186 -   -

Atak 4: ta próba uzyskania dostępu do cgi na pierwsze żądanie (zobacz moją pierwszą zasadę iptables, aby to upuścić)

GET /hndUnblock.cgi HTTP/1.0    302 186 -   Wget(linux)
GET /tmUnblock.cgi HTTP/1.0 302 186 -   Wget(linux)

Jestem bardzo nowy z serwerem, te 4 ataki pochodzą z ostatnich 12 godzin ... Mają tysiące tygodniowo.

Javier Palmero
źródło
Nie widzę żadnego konkretnego wzorca w tych żądaniach HTTP. Skąd wiesz, że są złośliwe? Nie rozumiem, co próbujesz tutaj osiągnąć. Czy możesz edytować swoje pytanie w celu wyjaśnienia? Dzięki.
David Foerster,
Cześć David, jakiś czas temu, kiedy otwieram porty takie jak ftp, otrzymałem log od brutalnej siły, kiedy widzę, że fail2ban w ciągu 24 godzin ma ponad 100 IPS upuszczonych na iptables. Zamykam wszystkie porty oprócz 80. Teraz próbuję stworzyć reguły takie jak fail2ban, ale dla apache.
Javier Palmero
2
Czy wiesz o mod_security i mod_evasive dla Apache?
pa4080
tak, czy masz zasady do dzielenia się? lub gdzie znaleźć? Jestem zablokowany ips z blocklist.de
Javier Palmero
Zapisałem prawie wszystko, co wiem o bezpieczeństwie Apache2.
pa4080

Odpowiedzi:

18

Aktualizacja: aktualna odpowiedź jest całkowicie zaktualizowana.

Zgodnie z tą dyskusją utworzyłem repozytorium GitHub o nazwie WWW Security Assistant . Istnieje gałąź, zwana ask_ubuntu, poświęcona tej odpowiedzi. Wszystkie odniesienia, wcześniej dostępne tutaj , są usuwane ze względu na limit znaków - są one dostępne w GitHub.

Oto kilka omówionych na kilka sposobów, związanych z pełnym mechanizmem, w jaki sposób zwiększyć bezpieczeństwo Apache2 w systemie Ubuntu 16.04.

Spis treści:

  • WWW Security Assistant Script (WSAS) ► Iptables
  • Iptables - Konfiguracja podstawowa - Zapisz i przywróć
  • ModEvasive dla Apache2
  • ModEvasive ► WSAS ► Iptables
  • ModSecurity 2.9 dla Apache2
  • Zestaw podstawowych reguł ModSecurity OWASP 3.x
  • Listy reguł ModSecurity
  • ModSecurity Rules ► WSAS ► Iptables
  • Pliki dziennika ModSecurity i Apache
  • Pliki dziennika ModSecurity ► Fail2Ban ► Iptables
  • ModSecurity GuardianLog ► HTTPD Guardian ► WSAS ► Iptables
  • ModSecurity GuardianLog ► Niestandardowa analiza HTTPD ► WSAS ► Iptables

Ponadto powiedzmy, że zawsze dobrze jest używać HTTPS:


Skrypt asystenta bezpieczeństwa WWW ► Iptables

Oto skrypt www-security-assistant.bash. Może ci pomóc w obsłudze złośliwych adresów IP. Skrypt ma dwa tryby.

Tryb automatyczny

Gdy program zewnętrzny, taki jak Apache mod_security, podaje złośliwy $IPadres. W takim przypadku składnia, która wywołuje skrypt, powinna wyglądać następująco:

www-security-assistant.bash <ip-address> Guardian
www-security-assistant.bash <ip-address> ModSecurity
www-security-assistant.bash <ip-address> ModEvasive
www-security-assistant.bash <ip-address> a2Analyst

W tym trybie skrypt zapewnia dwa etapy akcji i dla każdej akcji wyśle ​​wiadomość e-mail do administratora (administratorów).

  • Pierwszy etap: w przypadku pierwszych kilku „wykroczeń” źródło $IPzostanie zakazane na okres równy wartości $BAN_TIME. W tym trybie używana jest komenda at.

  • Drugi etap: gdy liczba wykroczeń od niektórych stanie $IPsię równa wartości $LIMIT, $IPadres ten zostanie trwale zablokowany przez Iptables i zostanie dodany do $BAN_LIST.

Tryb ręczny

Ten tryb akceptuje następujące opcje:

  • www-security-assistant.bash <ip-address> --DROP "log notes"

    Tworzy wpis do pliku /var/www-security-assistant/iptables-DROP.listi generuje regułę jako:

    iptables -A GUARDIAN -s $IP -j DROP
    
  • www-security-assistant.bash <ip-address> --DROP-CLEAR "log notes"

    Tworzy wpis do pliku /var/www-security-assistant/iptables-DROP-CLEAR.list, usuwa pewną regułę Iptables, usuwa $IPz historii oraz z $BAN_LIST:

    iptables -D GUARDIAN -s $IP -j DROP
    
  • www-security-assistant.bash <ip-address> --ACCEPT "log notes"

    Tworzy tylko wpis do pliku /var/www-security-assistant/iptables-ACCEPT.list.

  • www-security-assistant.bash <ip-address> --ACCEPT-CHAIN "log notes"

    Tworzy wpis do pliku /var/www-security-assistant/iptables-ACCEPT.listi generuje regułę jako:

    iptables -A GUARDIAN -s $IP -j ACCEPT
    

Zależności

Używa skryptu iptables-save.shi iptablesłańcucha GUARDIAN, wyjaśnione w następnej sekcji. Stworzy i utrzyma kilka plików w $WORK_DIR:

  • www-security-assistant.history - zawiera dane dotyczące przekroczeń poprzednich adresów IP.
  • www-security-assistant.mail - treść ostatniego e-maila wysłanego przez skrypt.
  • iptables-ACCEPT.list; iptables-DROP.lista iptables-DROP-CLEAR.list.

Skrypt wymaga minimalnej konfiguracji, aby wysyłać e-maile:

sudo apt install s-nail mutt mailutils postfix
sudo dpkg-reconfigure postfix  # For General type: Internet Site
echo 'Test passed.' | mail -s Test-Email email@example.com

Jeśli istnieje jakakolwiek skonfigurowana usługa HTTPS, jej certyfikat TLS może być używany w ramach usługi Postfix.

Ponadto skrypt korzysta at: sudo apt install at.

Instalacja

  • Utwórz katalog roboczy, nazwijmy go /var/www-security-assistant. Pobierz www-security-assistant.bashi spraw, aby był wykonywalny:

    sudo mkdir /var/www-security-assistant
    sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/www-security-assistant.bash -O /var/www-security-assistant/www-security-assistant.bash
    sudo chmod +x /var/www-security-assistant/www-security-assistant.bash
    
  • Udostępnij www-security-assistant.bashjako polecenie niestandardowe:

    sudo ln -s /var/www-security-assistant/www-security-assistant.bash /usr/local/bin/
  • Zezwól www-datana uruchamianie www-security-assistant.bashbez hasła przez sudo. Użyj następującego polecenia, aby bezpiecznie utworzyć i edytować nowy plik z dodatkową sudoersregułą:

    sudo visudo -f /etc/sudoers.d/www-security-assistant

    Dodaj następujący wiersz do pliku - zapisz plik i zakończ:

    www-data ALL=(ALL) NOPASSWD: /var/www-security-assistant/www-security-assistant.bash
  • Tweak www-security-assistant.bash. Zmień przynajmniej wartość zmiennej $EMAIL_TO.

Badanie kontrolne

  • Przedstaw się jako $AGENTi sprawdź, czy tryb automatyczny działa poprawnie:

    www-security-assistant.bash 192.168.1.177 Guardian

    Następnie sprawdź swój e-mail, wpisz iptables -L GUARDIAN -n, przejrzyj pliki www-security-assistant.historyi www-security-assistant.mail. Uruchom powyższe polecenie 5 razy i sprawdź pliki iptables-DROP.listi iptables-CURRENT.conf.

  • Sprawdź, czy TRYB ręczny działa poprawnie - dodaj lokalnego hosta do Białej listy:

    www-security-assistant.bash 127.0.0.1 --ACCEPT "Server's localhost IP"

    Następnie sprawdź plik iptables-ACCEPT.list.


Pozostała część tego samouczka dotyczy sposobu integracji www-security-assistantz systemem.


Iptables - Konfiguracja podstawowa - Zapisz i przywróć

Podstawowa konfiguracja

Przeczytaj tę instrukcję przed dodaniem następujących zasad.

sudo iptables -F

sudo iptables -I INPUT 1 -i lo -j ACCEPT
sudo iptables -I INPUT 2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# This rule may lock you out of the system!
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT

Przed wykonaniem kolejnych czynności otwórz nowe połączenie SSH i spróbuj zalogować się do systemu, aby sprawdzić, czy wszystko działa poprawnie!

Zapisz i przywróć

Można to osiągnąć za pomocą niestandardowych skryptów, które będą zapisywać i przywracać iptablesstożek podczas procesu zatrzymania (lub ponownego uruchomienia) systemu. (Jeśli używamy UFW do konfiguracji reguł Iptables, ten krok nie jest potrzebny).

printf '#!/bin/sh\n/sbin/iptables-save > /var/www-security-assistant/iptables-CURRENT.conf\nexit 0\n' | sudo tee /var/www-security-assistant/iptables-save.sh
printf '#!/bin/sh\n/sbin/iptables-restore < /var/www-security-assistant/iptables-CURRENT.conf\nexit 0\n' | sudo tee /var/www-security-assistant/iptables-restore.sh
sudo chmod +x /var/www-security-assistant/iptables-restore.sh /var/www-security-assistant/iptables-save.sh
sudo ln -s /var/www-security-assistant/iptables-save.sh /etc/network/if-post-down.d/iptables-save
sudo ln -s /var/www-security-assistant/iptables-restore.sh /etc/network/if-pre-up.d/iptables-restore

Utwórz nowy łańcuch

Utwórz nowy łańcuch o nazwie GUARDIANi wstaw go jako numer 3 do INPUTłańcucha:

sudo iptables -N GUARDIAN
sudo iptables -I INPUT 3 -j GUARDIAN

Badanie kontrolne

Uruchom ponownie system i sprawdź konfigurację. Użyj sudo systemctl reboot(nie używaj opcji wymuszenia reboot -f). Kiedy system jest ponownie online, możemy sprawdzić, czy nowo utworzony łańcuch istnieje:

sudo iptables -L GUARDIAN -n


ModEvasive dla Apache2

ModEvasive to moduł manewrów wymijających dla Apache, zapewniający unikanie akcji w przypadku ataku HTTP DoS lub DDoS lub ataku brute force. Czytaj więcej...

Instalacja

  • Zainstaluj i włącz moduł:

    sudo apt install libapache2-mod-evasive
    sudo a2enmod evasive
    
  • Utwórz katalog dziennika i udostępnij go dla www-data:

    sudo mkdir -p /var/log/apache2_mod_evasive
    sudo chown www-data /var/log/apache2_mod_evasive
    
  • Dostosuj podstawową konfigurację - odznacz i edytuj niektóre dyrektywy w pliku konfiguracyjnym:

    /etc/apache2/mods-enabled/evasive.conf
  • Restart Apache: sudo systemctl restart apache2.service.

Badanie kontrolne

  • Otwórz stronę internetową ze swojego serwera i kilkakrotnie intensywnie odśwież okno przeglądarki (naciśnij F5) - musisz otrzymać komunikat o błędzie 403 Forbidden . W katalogu dziennika zostanie wygenerowany nowy plik blokady. Ten plik należy usunąć w celu dalszego wykrycia przekroczeń z tego adresu IP.


ModEvasive ► WSAS ► Iptables

Tutaj skonfigurujemy mod_evasiverozmowę iptablesprzez www-security-assistant.bash, utworzoną w powyższej sekcji.

  • Edytuj /etc/apache2/mods-available/evasive.confw ten sposób:

    <IfModule mod_evasive20.c>
        DOSHashTableSize    3097
        DOSPageCount        9
        DOSSiteCount        70
        DOSPageInterval     2
        DOSSiteInterval     2
        DOSBlockingPeriod   10
    
        #DOSEmailNotify     [email protected]
        DOSLogDir           "/var/log/apache2_mod_evasive"
        DOSSystemCommand    "sudo /var/www-security-assistant/www-security-assistant.bash %s 'ModEvasive' 'AutoMode' >> /var/www-security-assistant/www-security-assistant.execlog 2>&1"
    </IfModule>
    
  • Utwórz plik dziennika i uruchom ponownie Apache:

    sudo touch /var/www-security-assistant/www-security-assistant.execlog && sudo chown www-data /var/www-security-assistant/www-security-assistant.execlog

Aby przetestować tę konfigurację możemy symulować atak DDoS za pomocą F5metody, o których mowa powyżej, lub możemy użyć polecenia jako ab, hping3itp

Uwaga: bądź ostrożny, ponieważ iptablesreguła używana w WSAS usunie wszystkie nowe połączenia ze źródła $IP, w tym połączenia SSH. Dobrze jest mieć zapasowy sposób na połączenie się z serwerem podczas testów. Możesz zmienić tę regułę, aby działała tylko z portami HTTP / HTTPS.


ModSecurity 2.9 dla Apache2

ModSecurity to silnik zapory sieciowej, który sam w sobie zapewnia bardzo niewielką ochronę. Aby stać się użytecznym, ModSecurity musi być skonfigurowany z regułami. Aby umożliwić użytkownikom pełne korzystanie z ModSecurity po wyjęciu z pudełka, Trustwave's Spider Labs zapewnia bezpłatny certyfikowany zestaw reguł ... Czytaj więcej ...

Instalacja

  • Zainstaluj i włącz moduł:

    sudo apt install libapache2-mod-security2
    sudo a2enmod security2
    
  • Utwórz plik konfiguracyjny:

    sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

    Przeczytaj i edytuj /etc/modsecurity/modsecurity.confuważnie! Dodaj lub zmień przynajmniej następujące dyrektywy:

    # -- Rule engine initialization ----------------------------------------------
    SecRuleEngine On
    
    # -- Debug log configuration -------------------------------------------------
    SecDebugLogLevel 2
    SecDebugLog "/var/log/apache2_mod_security/modsec_debug.log"
    
    # -- Audit log configuration -------------------------------------------------
    SecAuditLog "/var/log/apache2_mod_security/modsec_audit.log"
    
    # -- Guardian log configuration -------------------------------------------------
    SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
    
  • Plik /etc/apache2/mods-enabled/security2.confdotyczy /etc/modsecurity/modsecurity.confkonfiguracji Apache. Na tym etapie security2.confbędzie wyglądać następująco:

    <IfModule security2_module>
        SecDataDir /var/cache/modsecurity
        IncludeOptional /etc/modsecurity/*.conf
    </IfModule>
    
  • Utwórz katalog dziennika:

    sudo mkdir -p /var/log/apache2_mod_security
  • Ustaw rotację dziennika. Najpierw utwórz plik konfiguracyjny:

    sudo cp /etc/logrotate.d/apache2 /etc/logrotate.d/apache2-modsec

    Następnie edytuj nowy plik w ten sposób:

    /var/log/apache2_mod_security/*.log {  }
  • Uruchom ponownie Apache.

Badanie kontrolne

  • Utwórz dodatkowy plik konfiguracyjny w /etc/modsecurity, wywołaj go na przykład z-customrules.confi dodaj następującą regułę jako jego zawartość:

    # Directory traversal attacks
    SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109"
    

    Zrestartować serwer: sudo systemctl restart apache2.service. Otwórz przeglądarkę i wpisz https://example.com/?abc=../. Wynik będzie: 403 Zabronione . Sprawdź pliki dziennika, /var/log/apache2_mod_securityaby uzyskać więcej informacji.

  • Aby było przyjemniej, umieść skrypt issues.phpw odpowiednim miejscu w swoim DocumentRoot(tutaj zakładam, że to miejsce /var/www/html):

    sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/appendix/var/www/html/issues.php -O /var/www/html/issues.php

    Następnie zmodyfikuj powyższą regułę w następujący sposób:

    # Directory traversal attacks with redirection (or use URL instead of URI: redirect:'https://example.com/issues.php')
    SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109, redirect:'/issues.php'"
    

    Uruchom ponownie Apache, a następnie otwórz przeglądarkę i wpisz https://example.com/?abc=../;-) Pomysł zapożyczono ze skryptu SE BotLovin.cs.

  • Edytuj /etc/modsecurity/z-customrules.confponownie i komentuj (wyłącz) regułę - to był tylko przykładowy test i jest objęty OWASP CRS, opisanym w następnej sekcji.

  • Oto kolejny przykład, w którym przekierujemy wszystkie wp-adminżądania strony, ale z wyjątkiem tych z niektórych adresów IP (zwróć uwagę na chain):

    # Block wp-admin access
    SecRule REQUEST_URI "^/wp-admin" "id:108, log, deny, status:403, t:lowercase, chain, redirect:'/issues.php'"
        SecRule REMOTE_ADDR "!@ipMatch 192.168.1.11,99.77.66.12"
    

    Tutaj mamy dwa zakłócające działania: (1) deny, status:403i (2) redirect:'/issues.php'. W rzeczywistości nie potrzebujemy denyakcji, ponieważ zostanie ona zastąpiona przez redirectakcję.


Zestaw podstawowych reguł ModSecurity OWASP 3.x

W Ubuntu 16.04 można zainstalować CSR 2.x: apt install modsecurity-crs. Tutaj zainstalujemy CSR 3.x , szczegółowe instrukcje znajdują się w instrukcji instalacji ( gitjest wymagana).

Instalacja

  • Klonuj CSR w folderze /usr/share/modsecurity-crs.3:

    sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs /usr/share/modsecurity-crs.3
  • Uaktualnij i automatycznie odnów bazę danych GeoIP. (GeoIP DB nie jest już dołączony do CRS. Zamiast tego zaleca się regularne pobieranie). Skrypt util/upgrade.pyzapewnia tę funkcjonalność. Możesz użyć go w cron w następujący sposób sudo crontab -e:

    0 2 * * * /usr/share/modsecurity-crs.3/util/upgrade.py --geoip --crs --cron >> /var/log/apache2_mod_security/owasp-crs-upgrade.log 2>&1
  • Utwórz pliki konfiguracyjne:

    sudo cp /usr/share/modsecurity-crs.3/crs-setup.conf{.example,}
    sudo cp /usr/share/modsecurity-crs.3/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf{.example,}
    sudo cp /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf{.example,}
    

    Przeczytaj i edytuj te pliki ostrożnie! Odkomentowanie przynajmniej SecGeoLookupDBdyrektywy:

    SecGeoLookupDB util/geo-location/GeoIP.dat
  • Zastosuj konfigurację Apache. Edytuj /etc/apache2/mods-available/security2.confw ten sposób:

    <IfModule security2_module>
        SecDataDir /var/cache/modsecurity
        IncludeOptional /etc/modsecurity/*.conf
        IncludeOptional /usr/share/modsecurity-crs.3/crs-setup.conf
        IncludeOptional /usr/share/modsecurity-crs.3/rules/*.conf
    </IfModule>
    

    Zapisz plik, a następnie uruchom ponownie Apache.


Listy reguł ModSecurity

Dodanie do białej listy reguł ModSecurity można wykonać za pomocą następujących dyrektyw ModSec, które mogą być używane w całym systemie lub w konfiguracji wirtualnego hosta, także globalnie, dla określonych katalogów lub dopasowań lokalizacji:

SecRuleRemoveById
SecRuleRemoveByMsg
SecRuleRemoveByTag
SecRuleUpdateTargetById
SecRuleUpdateTargetByMsg
SecRuleUpdateTargetByTag
SecRuleUpdateActionById

Wyłącz mod_security2dla PhpMyAdmin. Zmień /etc/phpmyadmin/apache.confw ten sposób:

<Directory /usr/share/phpmyadmin>
    <IfModule security2_module>
        SecRuleEngine Off
    </IfModule>
</Directory>

Wyłącz określone reguły dla niektórych katalogów:

<Directory /var/www/html>
    <IfModule security2_module>
        SecRuleRemoveById 973301
    </IfModule>
</Directory>

Wyłącz reguły globalnie. W tym celu musimy dodać nasze dyrektywy gdzieś w plikach konfiguracyjnych Apache: /etc/modsecurity/z-customrules.confto dobre miejsce.

  • Wyłącz reguły w całej konfiguracji Apache:

    SecRuleRemoveById 973301 950907
  • Umieść adres IP na białej liście, aby mógł przechodzić przez ModSecurity:

    SecRule REMOTE_ADDR "@ipMatch 192.168.110.1" "phase:1,nolog,allow,ctl:ruleEngine=Off,ctl:auditEngine=Off"
  • Wyłącz reguły w obrębie katalogu:

    <Directory /var/www/mediawiki/core>
        SecRuleRemoveById 973301 950907
    </Directory>
    
  • Zaktualizuj działanie reguły według jej identyfikatora w dopasowaniu lokalizacji:

    <LocationMatch "/index.php.*">
        SecRuleUpdateActionById 973301 "pass"
        SecRuleUpdateActionById 950907 "pass"
    </LocationMatch>
    

W powyższych przykładach zakładamy, że 973301i 950907są identyfikatory zasada, że przeszkadzają normalną pracę naszych aplikacji internetowych. Możemy znaleźć takie reguły, analizując modsec_audit.log.


ModSecurity Rules ► WSAS ► Iptables

Oto kilka innych przykładów, jak tworzyć niestandardowe SecRule, a także jak wywołać za ich pośrednictwem WWW Security Assistant Script (WSAS).

Początkowe ustawienia

Potrzebujemy dodatkowego skryptu startowego - modsecurity-assistant.sh. Powodem jest to, że execdziałanie ModSecurity ma zbyt prostą i ograniczoną składnię.

sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/modsecurity-assistant.sh -O /var/www-security-assistant/modsecurity-assistant.sh
sudo chmod +x /var/www-security-assistant/modsecurity-assistant.sh

Jeśli zajrzysz do skryptu, zobaczysz kilka zmiennych eksportowanych przez ModSecurity. Są to: $REQUEST_URI, $ARGS, $SERVER_NAME, $REMOTE_ADDR, $REMOTE_HOSTi $UNIQUE_ID. Pozostałe zmienne są wyjaśnione w skrypcie.

Utwórz niestandardową regułę i wywołaj za jej pośrednictwem nasze skrypty

Najpierw stwórzmy regułę, która zostanie wykonana modsecurity-assistant.sh(i zadzwoni www-security-assistant.bash), gdy identyfikator URI żądania zawiera słowo, które znajduje się na naszej czarnej liście. Otwórz /etc/modsecurity/z-customrules.confi dodaj następujące linie na dole:

# REQUEST_URI words blacklist
#
SecRule REQUEST_URI "@pmFromFile /var/www-security-assistant/modsecurity-uri-black.list" \
    "id:150, log, t:lowercase, chain, \
    drop, deny, status:403, redirect:'/issues.php'"
    SecRule REMOTE_ADDR "!@ipMatchFromFile /var/www-security-assistant/modsecurity-ip-white.list" \
        "setenv:REMOTE_HOST=%{REMOTE_HOST}, \
         setenv:ARGS=%{ARGS}, \
         exec:/var/www-security-assistant/modsecurity-assistant.sh"
  • REQUEST_URI- ta zmienna zawiera pełny identyfikator URI z bieżącego żądania. Zasada może być szersza:SecRule REQUEST_URI|ARGS|REQUEST_BODY ...

  • @pmFromFileodczyta plik modsecurity-uri-black.listzawierający listę fraz, w którym każda konkretna fraza lub słowo zostanie umieszczone w nowym wierszu. Możesz zbierać ciekawe słowa i frazy z plików dziennika. Jeśli istnieje określone dopasowanie pomiędzy REQUEST_URInaszą listą wzorców, reguła zostanie zastosowana. Plik może być pusty, ale musisz go utworzyć ( touch).

  • logDziałania będą tworzyć wpisy dziennika w plikach dziennika dla tej reguły z id:150.

  • drop, deny(with status) i redirectakcje należą do destrukcyjnej grupy akcji, muszą znajdować się na początku reguły chain(jeśli istnieje łańcuch). Druga akcja zastąpi pierwszą, a trzecia zastąpi drugą, więc musisz wybrać, który chcesz wykonać, i możesz usunąć pozostałe.

  • chainakcja wywoła kolejną regułę łańcucha, zauważ, że druga reguła nie ma id.

  • REMOTE_ADDR zawiera adres IP żądania.

  • @ipMatchFromFilebędzie plik modsecurity-ip-white.listzawierający białą listę adresów IP, oddzielonych w nowych wierszach. Wpisy CIDR są również dopuszczalne. Ponieważ działanie zakłócające zawsze znajduje się w regule wiodącej łańcucha, zostanie zastosowane, ale gdy określone IP znajduje się na białej liście, execdziałanie nie zostanie zastosowane. Plik może być pusty, ale musisz go utworzyć ( touch).

  • execakcja wywoła nasz zewnętrzny skrypt. Ta akcja nie powoduje zakłóceń i zostanie wykonana, gdy bieżąca reguła zwróci wartość true. Po zastosowaniu tej akcji zdalne IP zostanie przetworzone za pomocą naszych skryptów.

  • setenvto działanie spowoduje wyeksportowanie niektórych zmiennych wewnętrznych =%{...} jako envvars, wyeksportowane nazwy mogą różnić się od wewnętrznych. Niektóre zmienne muszą być eksportowane ręcznie, inne są eksportowane automatycznie - prawdopodobnie jest to mały błąd (w niektórych przypadkach ręczny eksport o tych samych nazwach setenv:REQUEST_URI=%{REQUEST_URI}spowoduje na przykład pustą wartość eksportowanej zmiennej).

Badanie kontrolne

Załóżmy, że nie masz Joomla na serwerze, edytuj plik modsecurity-uri-black.listi dodaj wiersz z zawartością /joomla. Następnie wpisz w przeglądarce https://exemple.com/joomla. Powinieneś zostać przekierowany i zablokowany przez Iptables. Wyczyść zapisy sudo www-security-assistant.bash <your-ip> --DROP-CLEAR 'some note', dodaj swój adres IP modsecurity-ip-white.listi ponownie wykonaj ćwiczenie. Teraz powinieneś zostać przekierowany, ale nie zablokowany.

Połącz nasze skrypty z zestawem podstawowych reguł OWASP 3.x

W tym celu zaktualizujemy domyślne działanie Reguł trybu Anomalii (949110 i 959100). W tym celu edytuj plik /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.confi dodaj kolejne wiersze na dole:

# -- Anomaly Mode - Update actions by ID -----
#

SecRuleUpdateActionById 949110 "t:none, drop, deny, status:403, redirect:'/issues.php', \
     setenv:REMOTE_HOST=%{REMOTE_HOST}, setenv:ARGS=%{ARGS}, \
     exec:/var/www-security-assistant/modsecurity-assistant.sh"

SecRuleUpdateActionById 959100 "t:none, drop, deny, status:403, redirect:'/issues.php', \
     setenv:REMOTE_HOST=%{REMOTE_HOST}, setenv:ARGS=%{ARGS}, \
     exec:/var/www-security-assistant/modsecurity-assistant.sh"

# -- Anomaly Mode - Whitelist some URI and IP addresses -----
#

SecRule REQUEST_URI "^/wp-admin/admin-ajax.php*|^/index\.php\?title=.*&action=(submit|raw&ctype=text/javascript|raw&ctype=text/css)$" \
    "id:'999010', t:none, phase:1, pass, \
     ctl:ruleRemoveById=949110, \
     ctl:ruleRemoveById=959100"

SecRule REMOTE_ADDR "@ipMatchFromFile /var/www-security-assistant/modsecurity-ip-white.list" \
    "id:'999020', t:none, phase:1, pass, \
     ctl:ruleRemoveById=949110, \
     ctl:ruleRemoveById=959100"

Badanie kontrolne

Nie zapomnij zrestartować (lub ponownie załadować) Apache, aby zastosować zmiany konfiguracji. Nie zapomnij okresowo czyścić zapisów podczas testów, w przeciwnym razie możesz zostać trwale zablokowany :-)

Symuluj atak katalogu:

https://example.com/?abc=../../../                         # This should be redirected and blocked
https://example.com/wp-admin/admin-ajax.php?abc=../../../  # This should pass because of the whitelist rule

Symuluj atak SQL Injection:

https://example.com/?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20'1
https://example.com/index.php?username=1'%20or%20'1'%20=%20'1'))/*&password=foo


Pliki dziennika ModSecurity i Apache

Serwer WWW Apache można skonfigurować tak, aby przekazywał administratorowi serwera ważne informacje na temat jego działania ... Główną drogą przekazywania administratorowi informacji zwrotnych są pliki dziennika. Czytaj więcej...

ModSecurity ma potężny mechanizm rejestrowania. Dyrektywa SecGuardianLogzapewnia kanał dziennika specjalnie zaprojektowany do pracy ze skryptami zewnętrznymi.

Obecnie jedynym narzędziem pracy znany z wyrębu opiekun jest httpd-guardian, który jest częścią projektu narzędzi httpd Apache . httpd-guardianNarzędzie jest przeznaczone do obrony przed atakami typu DoS. Wykorzystuje blacklist tooldo interakcji z firewallem opartym na iptables, dynamicznie umieszczając na czarnej liście szkodliwe adresy IP. Czytaj więcej...


Pliki dziennika ModSecurity ► Fail2Ban ► Iptables

Możliwe jest skonfigurowanie Fail2Ban do analizowania danych plików dziennika Apache. modsec_audit.logjest prawdopodobnie najlepszym wyborem, ale zobacz także sekcje, o których mówimy SecGuardianLog.

Uważaj, że SecAuditLogRelevantStatusw /etc/modsecurity/modsecurity.confto skomentował. W przeciwnym razie wszyscy, którzy otrzymają stronę błędu 404, zostaną zablokowani przez fail2ban.

SecAuditEngine RelevantOnly
#SecAuditLogRelevantStatus "^(?:5|4(?!04))"

Obecnie Fail2Ban nie jest w żaden sposób zaimplementowany w tym projekcie.


ModSecGuardianLog ► HTTPD-Guardian ► WSAS ► Iptables

httpd-guardian- wykrywa ataki DoS poprzez monitorowanie żądań Apache Security, Copyright (C) 2005 Ivan Ristic - jest przeznaczony do monitorowania wszystkich żądań serwera WWW za pośrednictwem mechanizmu rejestrowania potokowego. Śledzi liczbę żądań wysłanych z każdego adresu IP ... opiekun httpd może wydać ostrzeżenie lub wykonać skrypt blokujący adres IP ...

Skryptu można używać z mechanizmem rejestrowania Apache2 lub z ModSecurity (lepiej).

Instalacja i konfiguracja w aktualnych okolicznościach

Pobierz httpd-guardiani spraw, aby był wykonywalny:

sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/httpd-guardian.pl -O /var/www-security-assistant/httpd-guardian.pl
sudo chmod +x /var/www-security-assistant/httpd-guardian.pl

Czytaj wiersze, 98-119aby zobaczyć, jak skrypt jest połączony z naszym skryptem WSAS.

Zastosuj następującą zmianę w konfiguracji Apache ( /etc/modsecurity/modsecurity.conf), a następnie uruchom ją ponownie:

#SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"

Badanie kontrolne

Aby przetestować skrypt, wyłącz ModEvasive ( sudo a2dismod evasivenie zapomnij włączyć go później) i uruchom ponownie Apache. Następnie taildziennik wykonania:

tail -F /var/www-security-assistant/www-security-assistant.execlog

A z innej instancji wykonaj atak DoS, na przykład użyj abw ten sposób:

for i in {1..20}; do (ab -n 200 -c 10 https://example.com/ &); done


ModSecGuardianLog ► Analiza niestandardowa ► WSAS ► Iptables

Oto prosty skrypt o nazwie httpd-custom-analyze.bash, który nie jest czymś specjalnym, ale może być dobrym przykładem. Jego funkcje są opisane w treści skryptu.

Instalacja i konfiguracja

Pobierz httpd-custom-analyze.bashi spraw, aby był wykonywalny:

sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/httpd-custom-analyze.bash -O /var/www-security-assistant/httpd-custom-analyze.bash
sudo chmod +x /var/www-security-assistant/httpd-custom-analyze.bash

Zastosuj następującą zmianę w konfiguracji Apache ( /etc/modsecurity/modsecurity.conf) i uruchom ją ponownie:

#SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
#SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"
SecGuardianLog "|/var/www-security-assistant/httpd-custom-analyze.bash"
  • Skrypt wywoła WSAS, gdy próg zostanie osiągnięty - przeczytaj linię 86i 35.

  • Aby oba httpd-skrypty działały jednocześnie, edytuj modsecurity.confi potokuj SecGuardianLogdo obu.

  • Aby wykonać test, postępuj zgodnie ze wskazówkami z powyższej sekcji.

pa4080
źródło
Nie edytuj często swojego posta. Ciągłe edytowanie postu wiele razy dziennie powoduje, że pojawia się on na pierwszej stronie, a także generuje hałas dla nas, moderatorów. Zamiast tego zastanów się nad przygotowaniem treści na innej stronie lub w edytorze tekstu , a następnie edytuj ją masowo, a nie osobno edytuj szczegóły w. (Ten post jest zablokowany na godzinę, aby ograniczyć tempo dokonywanej tu edycji)
Thomas Ward
1
Dziękuję za uwagę, @ThomasWard. Będę pamiętał! Czy nie jest dobrym pomysłem mieć coś w stylu piaskownicy na stronie Użytkownicy obok Edytuj profil i ustawienia ?
pa4080
1
Zostało to zaproponowane i uważam, że zostało odrzucone. Sugeruję, abyś wprowadził zmiany bez zapisywania i zapisał kopię swojego pytania w niezmienionej postaci w pliku tekstowym w systemie, a następnie możesz go edytować, skopiować z powrotem, gdy chcesz edytować post, a następnie naprawić obniżkę cen i tak dalej. Poza tym wszystkie przekreślenia ... utrudniają czytanie. Zamiast tego rozważ usunięcie tych sekcji. (Historia zmian zachowa dane)
Thomas Ward
To niedorzeczne, że Stack Exchange nie pozwala nie wprowadzać zmian na pierwszej stronie
Franck Dernoncourt
1

Zdaję sobie sprawę, że pa4080 udzielił szczegółowej i prawdopodobnie bardzo pomocnej odpowiedzi za samodzielne załatwienie tego wszystkiego. Samodzielne rozwiązywanie problemów może być przyjemne, ale może to również zająć dużo czasu .

  1. Zapoznaj się z Cloudflare, ponieważ zapewniają one bezpłatną ochronę przed atakami DDoS.
  2. Jeśli obecnie używasz tylko Apache, zastanów się, jak działa NGINX w celu zrównoważenia obciążenia. NGINX doskonale nadaje się do równoważenia obciążenia Apache, jak pokazano tutaj i tutaj .
  3. Zapoznaj się ze wskazówkami Apache dotyczącymi bezpieczeństwa dokumentów .
Zamartwica
źródło