Nginx – integracja z ModSecurity 3.0

Avatar photo
  • Konrad Kowalski
  • 15/03/2018
  • Nginx
  • 1 komentarz
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.

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.

Warto przeczytać

Brak powiązanych artykułów

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 5 lat ago Reply


Dodaj komentarz