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.

45-60 Minuten intermediate 10 steps
Zuletzt aktualisiert: Dez 29, 2025

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

1

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
Tipp: Diese Abhängigkeiten werden benötigt, um ModSecurity aus dem Quellcode zu kompilieren. Paketmanager haben nicht immer die neueste Version.
2

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
Tipp: Mit --depth 1 wird die Downloadgröße erheblich reduziert, da nur der neueste Commit abgerufen wird.
Warnung: Der Build-Vorgang dauert je nach Serverressourcen 10 bis 15 Minuten. Brechen Sie ihn nicht ab.
3

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/
Warnung: Die NGINX-Quellcode-Version MUSS exakt mit Ihrer installierten NGINX-Version übereinstimmen. Prüfen Sie dies mit 'nginx -v'.
4

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.

Tipp: Wenn Fehler beim Laden des Moduls auftreten, prüfen Sie, ob die .so-Datei existiert und die richtigen Berechtigungen (644) hat.
5

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
Warnung: Belassen Sie SecRuleEngine zunächst auf DetectionOnly, um zu testen, ohne legitimen Datenverkehr zu blockieren. Wechseln Sie nach dem Tuning auf On.
6

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
Tipp: Das CRS wird aktiv gepflegt und regelmäßig aktualisiert. Erwägen Sie, regelmäßige Updates per Cron oder über Ihre Deployment-Pipeline einzurichten.
7

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
Tipp: Sie können ModSecurity global im http-Block oder selektiv pro Server-/Location-Block aktivieren.
8

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.

Warnung: Wenn Anfragen nicht blockiert werden, prüfen Sie, ob SecRuleEngine auf On gesetzt ist und NGINX neu geladen wurde.
9

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
Tipp: Setzen Sie SecDebugLogLevel bei der Fehlersuche vorübergehend auf 3 bis 9, belassen Sie ihn aber im Produktivbetrieb auf 0.
10

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"
Tipp: Beginnen Sie mit Paranoia-Level 1 und erhöhen Sie es schrittweise, während Sie False Positives für Ihre Anwendung ausschließen.

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.log regelmäß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