Nginx – integracja z ModSecurity 3.0

Konrad Kowalski
  • Konrad Kowalski
  • 15/03/2018
  • Nginx
  • 0 komentarzy
Nginx

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.

[email protected]:~# wget -c https://nginx.org/keys/nginx_signing.key
[email protected]:~# apt-key add nginx_signing.key
OK

Po dodaniu klucza należy zaktualizować listę pakietów

[email protected]:~# aptitude update
[email protected]:~# aptitude install nginx

Po instalacji warto sprawdzić czy zainstalowana została wersja wyższa niż 1.11.5

[email protected]:~# nginx -v
[email protected]:~# 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

[email protected]:/opt/# git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
[email protected]:/opt/# cd ModSecurity/
[email protected]:/opt/ModSecurity# git submodule init
[email protected]:/opt/ModSecurity# git submodule update
[email protected]:/opt/ModSecurity# ./build.sh 
[email protected]:/opt/ModSecurity# ./configure

Kompilacja i instalacja (może to chwilę potrwać)

[email protected]:/opt/ModSecurity# make
[email protected]:/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

[email protected]:/# cd /opt/
[email protected]:/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.

[email protected]:/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ć.

[email protected]:/opt# tar zxvf nginx-1.12.2.tar.gz
[email protected]:/opt# cd nginx-1.12.2/
[email protected]:/opt/nginx-1.12.2# ./configure --with-compat --add-dynamic-module=../ModSecurity-nginx
[email protected]:/opt/nginx-1.12.2# make modules

Po skompilowaniu modułu należy go przekopiować do katalogu np. /etc/nginx/modules

[email protected]:/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

[email protected]:~# mkdir /etc/nginx/modsec
[email protected]:~# wget -P /etc/nginx/modsec/ https://raw.githubusercontent.com/SpiderLabs/ModSecurity/master/modsecurity.conf-recommended
[email protected]:~# 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.

Dodaj komentarz