ModSecurity jest doskonałym narzędziem służącym do zabezpieczania aplikacji webowych, stosowanym przez miliony stron na całym świecie. ModSecurity potrafi chronić serwisy www przed szeroką gamą ataków warstwy 7, takich jak SQL injection (SQLi), local file inclusion (LFI) czy ataki XSS (cross-site scripting). Do tej pory największą popularnością cieszył się tandem serwer Apache + ModSecurity, wynikało to z samej budowy modsecurity, które było przystosowane do działania z serwerem Apache. Jednakże od wersji 3.0 wprowadzono zmiany – dzięki modułowej architekturze ModSecurity, może działać natywnie z serwerem nginx.
Instalacja Nginx w wersji kompatybilnej z Modsecurity 3.0
Aby skorzystać z modułu Modsecurity należy zainstalować NGINX w wersji 1.11.5 lub nowszej. W Debianie 9, w repozytoriach stable wersja jest niestety zbyt stara.
aptitude show nginx-full Wersja: 1.10.3-1+deb9u1
Aby zainstalować nowszą należy skorzystać z Debian Backports lub repozytoriów nginx. Aby dodać repozytorium Nginx należy utworzyć dodatkowy plik:
/etc/apt/sources.list.d/nginx.list
Zawierający następujące wpisy:
deb http://nginx.org/packages/debian/ stretch nginx deb-src http://nginx.org/packages/debian/ stretch nginx
W następnym kroku należy pobrać klucz repozytorium oraz dodać go do systemu.
root@debian:~# wget -c https://nginx.org/keys/nginx_signing.key root@debian:~# apt-key add nginx_signing.key OK
Po dodaniu klucza należy zaktualizować listę pakietów
root@debian:~# aptitude update root@debian:~# aptitude install nginx
Po instalacji warto sprawdzić czy zainstalowana została wersja wyższa niż 1.11.5
root@debian:~# nginx -v root@debian:~# nginx version: nginx/1.12.2
Kompilacja i instalacja ModSecurity 3.0
W kolejnym etapie należy zainstalować narzędzia umożliwiające kompilację ModSecurity 3.0.
aptitude install -y apt-utils autoconf automake build-essential git libcurl4-openssl-dev libgeoip-dev liblmdb-dev libpcre++-dev libtool libxml2-dev libyajl-dev pkgconf wget zlib1g-dev
Po instalacji oprogramowania dodatkowego należy przejść do dowolnego katalogu gdzie mają zostać pobrane oraz skompilowane pliki źródłowe ModSecurity 3.0.
W przykładzie wybrany został katalog /opt
cd /opt/
Pobieranie źródeł i przygotowanie do kompilacji
root@debian:/opt/# git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity root@debian:/opt/# cd ModSecurity/ root@debian:/opt/ModSecurity# git submodule init root@debian:/opt/ModSecurity# git submodule update root@debian:/opt/ModSecurity# ./build.sh root@debian:/opt/ModSecurity# ./configure
Kompilacja i instalacja (może to chwilę potrwać)
root@debian:/opt/ModSecurity# make root@debian:/opt/ModSecurity# make install
Komunikaty typu fatal: No names found, cannot describe anything – można zignorować.
Kompilacja modułu ModSecurity 3.0 dla Nginx
W kolejnym etapie należy pobrać źródła modułu ModSecurity dla Nginx
root@debian:/# cd /opt/ root@debian:/opt# git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
Oraz pliki źródłowe Nginx w wersji takiej jaka jest instalowana w systemie.
root@debian:/opt# wget http://nginx.org/download/nginx-1.12.2.tar.gz
Pobrane archiwum ze źródłami należy rozpakować, następnie uruchomić skrypt configure wskazując, katalog w którym znajdują się modułu ModSecurity, a następnie skompilować.
root@debian:/opt# tar zxvf nginx-1.12.2.tar.gz root@debian:/opt# cd nginx-1.12.2/ root@debian:/opt/nginx-1.12.2# ./configure --with-compat --add-dynamic-module=../ModSecurity-nginx root@debian:/opt/nginx-1.12.2# make modules
Po skompilowaniu modułu należy go przekopiować do katalogu np. /etc/nginx/modules
root@debian:/opt/nginx-1.12.2# cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules
W kolejnym etapie na początku pliku /etc/nginx/nginx.conf należy dodać wpis ładujący moduł ModSecurity
load_module /etc/nginx/modules/ngx_http_modsecurity_module.so;
user www-data; worker_processes 4; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; load_module /etc/nginx/modules/ngx_http_modsecurity_module.so; events { worker_connections 1024; } http { ... }
Konfiguracja i testy
Aby rozpocząć korzystanie z modułu ModSecurity 3.0 w Nginx należy utworzyć plik konfiguracyjny. Gotowy plik można ściągnąć z repozytorium GitHub
root@debian:~# mkdir /etc/nginx/modsec root@debian:~# wget -P /etc/nginx/modsec/ https://raw.githubusercontent.com/SpiderLabs/ModSecurity/master/modsecurity.conf-recommended root@debian:~# mv /etc/nginx/modsec/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
W pliku należy włączyć blokowanie podejrzanych zapytań do serwera
sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/nginx/modsec/modsecurity.conf
Kolejnym etapem jest dodanie testowej reguły dla ModSecurity w pliku /etc/nginx/modsec/main.conf
# From https://github.com/SpiderLabs/ModSecurity/blob/master/\ # modsecurity.conf-recommended # # Edit to set SecRuleEngine On Include "/etc/nginx/modsec/modsecurity.conf" # Testowa reguła SecRule ARGS:testparam "@contains test" "id:1234,deny,status:403"
Oraz włączenie ModSecurity dla wybranych vhostów (w sekcji server)
server { # ... modsecurity on; modsecurity_rules_file /etc/nginx/modsec/main.conf; }
Po wprowadzeniu zmian należy zrestartować Nginx
systemctl restart nginx
W niektórych przypadkach może wystąpić błąd:
Mar 13 13:21:37 debian nginx[25865]: nginx: [emerg] "modsecurity_rules_file" directive Rules error. File: /etc/nginx/modsec/modsecurity.conf. Line: 37. Column: 33. As of ModSecurity version 3.0, SecRequestBodyInMemoryLimit is no longer supported. Instead, you can use your web server configurations to control those values. ModSecurity will follow the web server decision. in /etc/nginx/sites-enabled/default:6
Aby go wyeliminować należy zakomentować opcję SecRequestBodyInMemoryLimit w pliku /etc/nginx/modsec/modsecurity.conf
Testu można dokonać wchodząc na adres serwera dodając parametr test. Z poziomu lokalnej maszyny można skorzystać z polecenia curl.
curl localhost?testparam=test
Jeśli wszystko przebiegło pomyślnie powinna zostać wyświetlona wiadomość z błędem 403 Forbidden.
403 Forbidden 403 Forbidden
nginx
W logach również pojawi się odpowiednia informacja o zablokowaniu połączenia.
2018/03/13 13:32:10 [warn] 25999#25999: *6 [client 192.168.8.89] ModSecurity: Warning. Matched "Operator `Contains' with parameter `test' against variable `ARGS:testparam' (Value: `test' ) [file "/etc/nginx/modsec/main.conf"] [line "207"] [id "1234"] [rev ""] [msg ""] [data ""] [severity "0"] [ver ""] [maturity "0"] [accuracy "0"] [hostname "192.168.8.89"] [uri "/"] [unique_id "15209443309.131776"] [ref "o0,4v16,4"], client: 192.168.8.89, server: _, request: "GET /?testparam=test HTTP/1.1", host: "192.168.88.88" 192.168.8.89 - - [13/Mar/2018:13:32:10 +0100] "GET /?testparam=test HTTP/1.1" 403 135 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0" "-"
W środowisku produkcyjnym należy oczywiście użyć reguł, które faktycznie chronią przed złośliwym ruchem, takich jak np. bezpłatny zestaw reguł OWASP.
1 komentarz
Możesz dodawać komentarze do tego artykułu.
Rewelacyjny tutorial, prosty i na temat.
Inny błąd, który może pojawić się podczas startu nginx z modsecurity:
„modsecurity_rules_file” directive Rules error. File: /etc/nginx/modsec/modsecurity.conf. Line: 236. Column: 17. Failed to locate the unicode map file from: unicode.mapping Looking at: 'unicode.mapping’, 'unicode.mapping’, '/etc/nginx/modsec/unicode.mapping’, '/etc/nginx/modsec/unicode.mapping’. in /etc/nginx/nginx.conf:34
Należy wtedy przekopiować plik „unicode.mapping” ze źródeł ModSecurity, które rozpakowaliśmy np. /opt/ModSecurity/unicode.mapping do /etc/nginx/modsec/
Jacek 6 lat ago
Dodaj komentarz