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-
Social