ModSecurity mit NGINX installieren und konfigurieren
Vollständige Anleitung zur Bereitstellung von ModSecurity 3.x mit NGINX für kostenlosen, quelloffenen WAF-Schutz mit dem OWASP Core Rule Set.
ModSecurity ist die branchenübliche quelloffene WAF und schützt weltweit Millionen von Websites. In Kombination mit NGINX bietet es leistungsstarken, anpassbaren Schutz gegen die OWASP Top 10, SQL-Injection, Cross-Site-Scripting und unzählige weitere Web-Angriffe, und das ganz ohne Lizenzkosten.
Diese Anleitung führt Sie durch die Installation von ModSecurity 3.x (libmodsecurity) mit dem NGINX-Connector, die Konfiguration des OWASP Core Rule Set und die Optimierung des Setups für den Produktivbetrieb. Am Ende verfügen Sie über WAF-Schutz auf Enterprise-Niveau, der auf Ihrem NGINX-Server läuft.
Voraussetzungen
- NGINX installiert und lauffähig (Open Source oder Plus)
- Root- oder sudo-Zugriff auf Ihren Server
- Ubuntu 20.04+, Debian 11+ oder RHEL/CentOS 8+ (andere Distributionen können abweichen)
- Grundkenntnisse der NGINX-Konfiguration
- Git installiert zum Klonen von Repositories
Schritt-für-Schritt-Anleitung
ModSecurity-3.x-Abhängigkeiten installieren
ModSecurity 3.x (libmodsecurity) benötigt mehrere Abhängigkeiten. Installieren Sie diese je nach Distribution:
Ubuntu/Debian:
sudo apt update
sudo apt install -y apt-utils autoconf automake build-essential \
git libcurl4-openssl-dev libgeoip-dev liblmdb-dev libpcre2-dev \
libtool libxml2-dev libyajl-dev pkgconf wget zlib1g-dev
RHEL/CentOS/Rocky:
sudo dnf install -y gcc-c++ flex bison yajl curl-devel zlib-devel \
pcre2-devel autoconf automake git curl make libxml2-devel \
pkgconfig libtool httpd-devel lmdb-devel GeoIP-devel
ModSecurity 3.x klonen und bauen
Klonen Sie das ModSecurity-Repository und bauen Sie die Bibliothek:
cd /opt
sudo git clone --depth 1 -b v3/master --single-branch https://github.com/owasp-modsecurity/ModSecurity
cd ModSecurity
# Submodule initialisieren und aktualisieren
sudo git submodule init
sudo git submodule update
# Bauen und installieren
sudo ./build.sh
sudo ./configure
sudo make
sudo make install
Den NGINX-Connector klonen und bauen
Der NGINX-ModSecurity-Connector integriert libmodsecurity als dynamisches Modul in NGINX:
# Connector klonen
cd /opt
sudo git clone --depth 1 https://github.com/owasp-modsecurity/ModSecurity-nginx.git
# Ihre NGINX-Version ermitteln
nginx -v
# Passenden NGINX-Quellcode herunterladen (Version bei Bedarf anpassen)
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -xzf nginx-1.24.0.tar.gz
cd nginx-1.24.0
# Dynamisches Modul bauen
./configure --with-compat --add-dynamic-module=../ModSecurity-nginx
make modules
# Modul in das NGINX-Modulverzeichnis kopieren
sudo cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules/
Das ModSecurity-Modul in NGINX aktivieren
Laden Sie das ModSecurity-Modul in Ihrer NGINX-Konfiguration:
Fügen Sie diese Zeile ganz oben in /etc/nginx/nginx.conf ein (vor dem events-Block):
load_module modules/ngx_http_modsecurity_module.so;
Testen Sie die Konfiguration:
sudo nginx -t
Sie sollten Folgendes sehen: syntax is ok und test is successful.
ModSecurity-Konfiguration erstellen
Richten Sie das ModSecurity-Konfigurationsverzeichnis und die Basiskonfiguration ein:
# Verzeichnisstruktur erstellen
sudo mkdir -p /etc/nginx/modsec
# Die empfohlene Konfiguration kopieren
sudo cp /opt/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
# Die Unicode-Mapping-Datei kopieren
sudo cp /opt/ModSecurity/unicode.mapping /etc/nginx/modsec/
Bearbeiten Sie /etc/nginx/modsec/modsecurity.conf und ändern Sie die Engine von Erkennung auf Blockierung:
# Diese Zeile ändern:
SecRuleEngine DetectionOnly
# Zu (wenn bereit für den Produktivbetrieb):
SecRuleEngine On
OWASP Core Rule Set (CRS) installieren
Das OWASP Core Rule Set bietet umfassenden Schutz gegen gängige Angriffe:
cd /etc/nginx/modsec
sudo git clone https://github.com/coreruleset/coreruleset.git
cd coreruleset
# Konfiguration aus Beispiel erstellen
sudo cp crs-setup.conf.example crs-setup.conf
Erstellen Sie eine Haupt-Regeldatei unter /etc/nginx/modsec/main.conf:
Include /etc/nginx/modsec/modsecurity.conf
Include /etc/nginx/modsec/coreruleset/crs-setup.conf
Include /etc/nginx/modsec/coreruleset/rules/*.conf
ModSecurity in NGINX-Server-Blöcken aktivieren
Aktivieren Sie ModSecurity für Ihre Sites, indem Sie Direktiven zu Ihren Server-Blöcken hinzufügen:
server {
listen 80;
server_name example.com;
# ModSecurity aktivieren
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
location / {
proxy_pass http://backend;
# ... weitere Direktiven
}
}
Laden Sie NGINX neu, um die Änderungen anzuwenden:
sudo nginx -t && sudo systemctl reload nginx
Die WAF testen
Überprüfen Sie, ob ModSecurity funktioniert, indem Sie einen Testangriff senden:
# Dies sollte blockiert werden (SQL-Injection-Versuch)
curl -I 'http://your-server.com/?id=1%20OR%201=1'
# Dies sollte blockiert werden (XSS-Versuch)
curl -I 'http://your-server.com/?q=<script>alert(1)</script>'
Prüfen Sie das ModSecurity-Audit-Log:
sudo tail -f /var/log/modsec_audit.log
Sie sollten Einträge sehen, die die blockierten Anfragen mit Regel-IDs und Angriffsdetails zeigen.
Logging konfigurieren
Konfigurieren Sie das ModSecurity-Logging in /etc/nginx/modsec/modsecurity.conf:
# Audit-Log-Einstellungen
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus "^(?:5|4(?!04))"
SecAuditLogParts ABIJDEFHZ
SecAuditLogType Serial
SecAuditLog /var/log/modsec_audit.log
# Debug-Log (im Produktivbetrieb deaktivieren)
SecDebugLog /var/log/modsec_debug.log
SecDebugLogLevel 0
Erstellen Sie die Log-Dateien mit den richtigen Berechtigungen:
sudo touch /var/log/modsec_audit.log
sudo chown www-data:www-data /var/log/modsec_audit.log
Auf False Positives abstimmen
Überprüfen Sie nach dem Betrieb im DetectionOnly-Modus die Logs auf False Positives. Gängige Tuning-Ansätze:
Bestimmte Regeln ausschließen:
# In /etc/nginx/modsec/crs-setup.conf oder einer eigenen Datei:
SecRuleRemoveById 942100 # Bestimmte Regel deaktivieren
SecRuleRemoveByTag "OWASP_CRS/WEB_ATTACK/SQL_INJECTION" # Nach Tag deaktivieren
Regeln für bestimmte URLs ausschließen:
SecRule REQUEST_URI "@beginsWith /api/upload" \
"id:1000,phase:1,pass,nolog,\
ctl:ruleRemoveById=200002"
Paranoia-Level anpassen:
Setzen Sie in crs-setup.conf das Paranoia-Level (1=wenige False Positives, 4=maximale Sicherheit):
SecAction "id:900000,phase:1,pass,t:none,\
setvar:tx.blocking_paranoia_level=1"
Fazit & Nächste Schritte
Ihr NGINX-Server ist jetzt durch ModSecurity mit dem OWASP Core Rule Set geschützt. Sie verfügen über WAF-Schutz auf Enterprise-Niveau, ganz ohne Lizenzkosten.
Nächste Schritte:
- Überwachen Sie
/var/log/modsec_audit.logregelmäßig auf blockierte Angriffe und False Positives - Wechseln Sie nach 1 bis 2 Wochen im DetectionOnly-Modus SecRuleEngine auf On
- Richten Sie eine Log-Rotation für das Audit-Log ein
- Erwägen Sie die Integration der Logs in Ihr SIEM (ELK, Splunk usw.)
- Planen Sie regelmäßige CRS-Updates (monatlich empfohlen)
- Dokumentieren Sie eventuelle benutzerdefinierte Regelausschlüsse für Ihr Team
Fehlerbehebung
Modul lässt sich nicht laden: undefined symbol
Das bedeutet, dass der NGINX-Connector gegen eine andere NGINX-Version kompiliert wurde. Kompilieren Sie das Modul neu mit exakt der NGINX-Quellcode-Version, die Ihrer installierten NGINX-Version entspricht (prüfen mit nginx -v).
Legitime Anfragen werden blockiert
Prüfen Sie /var/log/modsec_audit.log auf die Regel-ID, die die Blockierung verursacht. Erstellen Sie entweder eine Ausschlussregel oder passen Sie das Paranoia-Level an. Häufige Ursachen: Datei-Uploads, Rich-Text-Editoren, JSON-APIs.
Keine Einträge im Audit-Log
Prüfen Sie, ob die Log-Datei existiert und Schreibrechte für den NGINX-Benutzer (www-data oder nginx) hat. Stellen Sie sicher, dass SecAuditEngine nicht auf Off gesetzt ist.
Leistungseinbußen
ModSecurity fügt eine gewisse Latenz hinzu (typischerweise 1 bis 5 ms). Bei deutlicher Verlangsamung: reduzieren Sie die Anzahl der aktiven Regeln, senken Sie das Request-Body-Limit (SecRequestBodyLimit) oder cachen Sie in NGINX aggressiver.
make schlägt während des ModSecurity-Builds fehl
Meist eine fehlende Abhängigkeit. Lesen Sie die Fehlermeldungen sorgfältig. Stellen Sie unter Ubuntu sicher, dass Sie die -dev-Versionen der Pakete haben (z. B. libcurl4-openssl-dev, nicht nur libcurl4).
Häufig gestellte Fragen
Sollte ich ModSecurity 2.x oder 3.x mit NGINX verwenden?
Verwenden Sie ModSecurity 3.x (libmodsecurity). Version 2.x wurde für Apache entwickelt und funktioniert mit NGINX nur über umständliche Umwege. Version 3.x wurde als eigenständige Bibliothek mit einem nativen NGINX-Connector neu aufgebaut und bietet bessere Leistung und Kompatibilität.
Wie wirkt sich ModSecurity auf die NGINX-Leistung aus?
ModSecurity fügt typischerweise 1 bis 5 ms Latenz pro Anfrage hinzu, abhängig von der Regelkomplexität und der Anfragegröße. Für die meisten Anwendungen ist dies vernachlässigbar. Websites mit hohem Datenverkehr sollten Benchmarks durchführen und erwägen, SecRequestBodyLimit und Paranoia-Level anzupassen, um die Leistung zu optimieren.
Kann ich ModSecurity mit NGINX Plus verwenden?
Ja, derselbe ModSecurity-Connector funktioniert mit NGINX Plus. NGINX-Plus-Nutzer könnten jedoch auch NGINX App Protect in Betracht ziehen, die kommerzielle WAF von F5, die speziell für NGINX Plus optimiert ist und zusätzliche Funktionen sowie Support bietet.
Wie aktualisiere ich das OWASP Core Rule Set?
Wechseln Sie in das coreruleset-Verzeichnis und holen Sie die neuesten Änderungen: cd /etc/nginx/modsec/coreruleset && sudo git pull. Laden Sie anschließend NGINX neu. Testen Sie Updates zunächst in einer Staging-Umgebung, da neue Regeln unerwartete Blockierungen verursachen können.
Was ist der Unterschied zwischen DetectionOnly und On?
DetectionOnly protokolliert potenzielle Angriffe, blockiert sie aber nicht; Anfragen erreichen weiterhin Ihre Anwendung. Der On-Modus blockiert bösartige Anfragen aktiv. Beginnen Sie immer mit DetectionOnly, um False Positives zu identifizieren, bevor Sie im Produktivbetrieb auf On wechseln.
Kann ich ModSecurity verwenden, um mehrere Sites auf einem NGINX-Server zu schützen?
Ja. Sie können ModSecurity global im http-Block für alle Sites aktivieren oder selektiv pro Server-Block. Sie können auch unterschiedliche Regelkonfigurationen pro Site verwenden, indem Sie in jedem Server-Block unterschiedliche modsecurity_rules_file-Pfade angeben.
Ähnliche Anleitungen
Cloudflare WAF für WordPress einrichten
Schritt-für-Schritt-Anleitung zur Konfiguration der Cloudflare Web Application Firewall, um Ihre WordPress-Site vor Angriffen zu schützen.
Leitfaden für WAF-Sicherheits-Best-Practices
Wesentliche Best Practices zur Konfiguration und Pflege Ihrer Web Application Firewall für optimale Sicherheit.