derMOE-Tipp der Woche: ModSecurity für NGINX auf CentOS 7 installieren

derMOE-Tipp der Woche: ModSecurity für NGINX auf CentOS 7 installieren

Der heutige MOE-Tipp der Woche beschäftigt sich mit dem leidigen Thema: Wie installiere ich ModSecurity für NGINX auf einem CentOS 7 System. Es gibt im Internet ja einige Seiten die sich mit dem Thema beschäftigen, aber leider habe ich kaum eine Anleitung gefunden, die funktioniert.

Ich zeige euch einen Weg, wie ich es in wenigen Schritten geschafft habe, die Software zu installieren, und eine Minimalkonfiguration mit OWASP CRS zum laufen bekam.

Vorraussetzungen

  • Aktuelles CentOS 7  installiert
  • Eingeloggt als root

Abhängigkeiten installieren

Als erstes installieren wir alle benötigten Abhängigkeiten um mod_security und NGINX kompilieren zu können.

yum groupinstall -y "Development Tools"
yum install -y httpd httpd-devel pcre pcre-devel libxml2 libxml2-devel curl curl-devel openssl openssl-devel

Nach dem installieren der Pakete starten wir das System einmal durch.

shutdown -r now

Kompilieren von ModSecurity

Wir wechseln das Verzeichnis und klonen uns mit git den aktuellen branch.

cd /usr/src
git clone -b nginx_refractoring https://github.com/SpiderLabs/ModSecurity.git

Jetzt geht es ans kompilieren.

cd ModSecurity
sed -i '/AC_PROG_CC/a\AM_PROG_CC_C_O' configure.ac
sed -i '1 i\AUTOMAKE_OPTIONS = subdir-objects' Makefile.am
./autogen.sh
./configure --enable-standalone-module --disable-mlogc
make

Kompilieren von NGINX

Mit dem Befehl wget downloaden wir uns das aktuellste Release und mit tar entpacken wir alles.

cd /usr/src
wget https://nginx.org/download/nginx-1.13.5,tar.gz
tar -xvzf nginx-1.13.5.tar.gz && rm -f nginx-1.13.5.tar.gz

Als nächstes wird der User und die Gruppe nginx erstellt und zugewiesen.

groupadd -r nginx
useradd -r -g nginx -s /sbin/nologin -M nginx

Nun kompilieren wir NGINX mit mod_security und den SSL-Modul.

cd /nginx-1.13.5
./configure --user=nginx --group=nginx --add-module=/usr/src/ModSecurity/nginx/modsecurity --with-http_ssl_module
make
make install

Der NGINX-user wird wie folgt modifiziert:

sed -i "s/#user nobody;/user nginx nginx;/" /usr/local/nginx/conf/nginx.conf

Die Installation testen wir mit dem Befehl:

/usr/local/nginx/sbin/nginx -t

NGINX als Service

Damit wir im normalen Betrieb einfach und sicher den NGINX bedienen können, legen wir ihn am besten als einen Service im systemd an.

vi /lib/systemd/system/nginx.service

Die eben erstellte Datei sollte folgendes beinhalten:

[Service]
Type=forking
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
KillStop=/usr/local/nginx/sbin/nginx -s stop

KillMode=process
Restart=on-failure
RestartSec=42s

PrivateTmp=true
LimitNOFILE=200000

[Install]
WantedBy=multi-user.target

Von nun an haben wir die volle Kontrolle über den NGINX und können folgende Befehle absetzen:

systemctl start nginx.service
systemctl stop nginx.service
systemctl restart nginx.service

Konfigurieren von ModSecurity und NGINX

Wir öffnen folgende Datei mit einem Editor:

vi /usr/local/nginx/conf/nginx.conf

In der Datei suchen wir folgendes Segment innerhalb vom http {} – Abschnitt:

location / {
      root     html;
      index  index.html   index.htm;
}

…und fügen folgende Zeilen hinzu:

location / {
      ModSecurityEnabled on;
      ModSecurityConfig modsec_includes.conf;
      #proxy_pass https://localhost:8443;
      #proxy_read_timeout 180s;
      root html;
      index index.html index.htm;
}

Nun speichern und verlassen wir das ganze.

:wq

Diese Config stellt eine simple Variante dar um dem NGINX als Webserver zu benutzen. Soll er aber als Reverse-Proxy fungieren, müsstet ihr die beiden # entfernen.

OWASP ModSecurity Core Rules

Mit dem erstellen folgender Datei, fügen wir alle OWASP ModSecurity Core Rules, die sich im Ordner owasp-modsecurity-crs/rules/ befinden, hinzu:

vi /usr/local/nginx/conf/modsec_includes.conf

include modsecurity.conf
include owasp-modsecurity-crs/crs-setup.conf
include owasp-modsecurity-crs/rules/*.conf

Wollt ihr jedoch nur bestimmte rules benutzen, so löscht die Zeile mit include owasp-modsecurity-crs/rules/*.conf wieder und lest weiter.

Im nächsten Schritt aktivieren wir die ModSecurity Konfigurationsdaten.

cp /usr/src/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
cp /usr/src/ModSecurity/unicode.mapping /usr/local/nginx/conf/

…und modifizieren die Datei /usr/local/nginx/conf/modsecurity.conf:

sed -i "s/SecRuleEngine DetectionOnly/SecRuleEngine On/" /usr/local/nginx/conf/modsecurity.conf

Nun klonen wir die OWASP ModSecurity CRSS (Core Rule Set) von git und binden es in unsere Installation ein.

cd /usr/local/nginx/conf
git clone https://github.com/SpiderLabs/owasp-mod-security-crs.git
cd /owasp-mod-security-crs
mv crs-setup.conf.example crs-setup.conf
cd rules
mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
mv RESPONSE-900-EXCLUSION-RULES-AFTER-CRS.conf.example RESPONSE-900-EXCLUSION-RULES-AFTER-CRS.conf

Jetzt sollte alles laufen und wir sind bereit, die Installation zu testen.

Test der Installation

Zu allererst starten wir mit systemctl den nginx.service.

systemctl start nginx.service

Sobald er hochgefahren ist, geben wir in unserem Browser folgende URL ein:

http://localhost/?param=">

Nun sollte unser ModSecurity diesen simulierten Versuch abgefangen und registriert haben. Dazu schauen wir uns den error.log an und suchen nach error- Meldungen.

grep error /usr/local/nginx/logs/error.log

Auf dem Bildschirm erscheinen nun eine ganze Menge Zeilen die mit „error“ getagt sind und unseren Versuch geloggt haben. Ihr solltet nun in etwa sowas sehen:

2017/09/22 16:29:22 [error] 2318#0: [client localhost] ModSecurity: Warning. detected XSS using libinjection. [file "/usr/local/nginx...

Herzlichen Glückwunsch, ihr habt nun erfolgreich NGINX mit ModSecurity installiert und konfiguriert. Ab dem Punkt kann man das jetzt noch grafisch hübsch darstellen, mit Elasticsearch und Kibana.

Dieser Artikel ist jetzt doch etwas länger geworden, aber ich hoffe das ich damit ein paar Leuten in den weiten des WWW weiterhelfen kann. :-)

Viele Grüße
-derMOE-

(Bildquelle: https://www.nginx.com)