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 $IP
adres. 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 $IP
zostanie 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 $IP
się równa wartości $LIMIT
, $IP
adres 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.list
i 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 $IP
z 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.list
i generuje regułę jako:
iptables -A GUARDIAN -s $IP -j ACCEPT
Zależności
Używa skryptu iptables-save.sh
i 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.list
a 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.bash
i 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.bash
jako polecenie niestandardowe:
sudo ln -s /var/www-security-assistant/www-security-assistant.bash /usr/local/bin/
Zezwól www-data
na uruchamianie www-security-assistant.bash
bez hasła przez sudo
. Użyj następującego polecenia, aby bezpiecznie utworzyć i edytować nowy plik z dodatkową sudoers
regułą:
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 $AGENT
i 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.history
i www-security-assistant.mail
. Uruchom powyższe polecenie 5 razy i sprawdź pliki iptables-DROP.list
i 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-assistant
z 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ć iptables
stoż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 GUARDIAN
i 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_evasive
rozmowę iptables
przez www-security-assistant.bash
, utworzoną w powyższej sekcji.
Edytuj /etc/apache2/mods-available/evasive.conf
w ten sposób:
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 9
DOSSiteCount 70
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 10
#DOSEmailNotify your@email.foo
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ą F5
metody, o których mowa powyżej, lub możemy użyć polecenia jako ab
, hping3
itp
Uwaga: bądź ostrożny, ponieważ iptables
reguł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.conf
uważ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.conf
dotyczy /etc/modsecurity/modsecurity.conf
konfiguracji Apache. Na tym etapie security2.conf
bę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.conf
i 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_security
aby uzyskać więcej informacji.
Aby było przyjemniej, umieść skrypt issues.php
w 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.conf
ponownie 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:403
i (2) redirect:'/issues.php'
. W rzeczywistości nie potrzebujemy deny
akcji, ponieważ zostanie ona zastąpiona przez redirect
akcję.
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 ( git
jest 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.py
zapewnia 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 SecGeoLookupDB
dyrektywy:
SecGeoLookupDB util/geo-location/GeoIP.dat
Zastosuj konfigurację Apache. Edytuj /etc/apache2/mods-available/security2.conf
w 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_security2
dla PhpMyAdmin. Zmień /etc/phpmyadmin/apache.conf
w 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.conf
to 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 973301
i 950907
są 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 exec
dział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_HOST
i $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.conf
i 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 ...
@pmFromFile
odczyta plik modsecurity-uri-black.list
zawierają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_URI
naszą listą wzorców, reguła zostanie zastosowana. Plik może być pusty, ale musisz go utworzyć ( touch
).
log
Działania będą tworzyć wpisy dziennika w plikach dziennika dla tej reguły z id:150
.
drop
, deny
(with status
) i redirect
akcje 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.
chain
akcja wywoła kolejną regułę łańcucha, zauważ, że druga reguła nie ma id
.
REMOTE_ADDR
zawiera adres IP żądania.
@ipMatchFromFile
będzie plik modsecurity-ip-white.list
zawierają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, exec
działanie nie zostanie zastosowane. Plik może być pusty, ale musisz go utworzyć ( touch
).
exec
akcja 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.
setenv
to 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.list
i 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.list
i 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.conf
i 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 SecGuardianLog
zapewnia 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-guardian
Narzędzie jest przeznaczone do obrony przed atakami typu DoS. Wykorzystuje blacklist tool
do 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.log
jest prawdopodobnie najlepszym wyborem, ale zobacz także sekcje, o których mówimy SecGuardianLog
.
Uważaj, że SecAuditLogRelevantStatus
w /etc/modsecurity/modsecurity.conf
to 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-guardian
i 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-119
aby 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 evasive
nie zapomnij włączyć go później) i uruchom ponownie Apache. Następnie tail
dziennik wykonania:
tail -F /var/www-security-assistant/www-security-assistant.execlog
A z innej instancji wykonaj atak DoS, na przykład użyj ab
w 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.bash
i 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ę 86
i 35
.
Aby oba httpd-
skrypty działały jednocześnie, edytuj modsecurity.conf
i potokuj SecGuardianLog
do obu.
Aby wykonać test, postępuj zgodnie ze wskazówkami z powyższej sekcji.