Nginx mit Modsecurity: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(19 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
== Nginx mit ModSecurity und OWASP Core Ruleset schützen ==
+
= NGINX mit ModSecurity v3 und OWASP CRS als Reverse Proxy =
  
;Dieser Artikel zeigt, wie man Nginx als Reverse Proxy mit ModSecurity v3 und OWASP CRS einrichtet, um Angriffe wie SQL-Injection oder Command-Injection zu blockieren.
+
Diese Konfiguration stellt einen TLS-gesicherten Reverse-Proxy mit aktiver ModSecurity-WAF und OWASP Core Rule Set (CRS) bereit. Ziel ist die Absicherung von Backend-Webdiensten, ergänzt durch Logging, Debug-Informationen und optionaler Anzeige des Audit-Logs im Browser.
  
=== Voraussetzungen ===
+
== Voraussetzungen ==
 +
* Ubuntu 22.04 oder Debian 12
 +
* Backend-Dienst z. B. unter http://127.0.0.1:8080 erreichbar
 +
* TLS-Zertifikate (crt.pem, privkey.pem, ca.crt) aus interner CA
  
;Du benötigst ein Debian/Ubuntu-System mit Root-Rechten und einen Backend-Server (z. B. mail.it113.int).
+
== Installation ==
 +
* Pakete installieren
 +
sudo apt update
 +
sudo apt install nginx libmodsecurity3 libnginx-mod-http-modsecurity git apache2-utils -y
  
* apt-get update
+
== ModSecurity aktivieren ==
 +
* Konfigurationsverzeichnis anlegen
 +
sudo mkdir -p /etc/nginx/modsec
  
=== Installation der Komponenten ===
+
* Basis-Konfiguration erstellen
 +
sudo nano /etc/nginx/modsec/modsecurity.conf
 +
<pre>
 +
SecRuleEngine On
 +
SecRequestBodyAccess On
 +
SecResponseBodyAccess Off
  
;Installiere Nginx, ModSecurity und das OWASP CRS.
+
SecAuditEngine RelevantOnly
 +
SecAuditLog /var/log/nginx/modsec_audit.log
 +
SecAuditLogParts ABIJDEFHZ
  
* apt-get install nginx libnginx-mod-security modsecurity-crs -y
+
SecDebugLog /var/log/nginx/modsec_debug.log
* git clone https://github.com/coreruleset/coreruleset /etc/nginx/modsec/crs
+
SecDebugLogLevel 3
* cp /etc/nginx/modsec/crs/crs-setup.conf.example /etc/nginx/modsec/crs/crs-setup.conf
 
  
=== ModSecurity global aktivieren ===
+
SecTmpDir /tmp/
 +
SecDataDir /tmp/
  
;Bearbeite die globale Nginx-Konfiguration.
+
# Beispiel-Testregel (optional)
 +
SecRule ARGS "@contains script" \
 +
    "id:9999,phase:1,deny,log,status:403,msg:'Test rule triggered'"
  
* nano /etc/nginx/nginx.conf
+
# OWASP Core Rule Set
 +
Include /etc/nginx/modsec/coreruleset/crs-setup.conf
 +
Include /etc/nginx/modsec/coreruleset/rules/*.conf
 +
</pre>
  
modsecurity on;
+
== OWASP Core Rule Set installieren ==
  modsecurity_rules_file /etc/nginx/modsec/main.conf;
+
* In das ModSecurity-Verzeichnis wechseln
 +
  cd /etc/nginx/modsec
  
=== Hauptregeldatei erstellen ===
+
* CRS klonen
 +
sudo git clone https://github.com/coreruleset/coreruleset.git
  
;Erstelle die ModSecurity-Regeldatei mit CRS-Einbindung.
+
* Setup-Datei aktivieren
 +
sudo cp coreruleset/crs-setup.conf.example coreruleset/crs-setup.conf
  
* nano /etc/nginx/modsec/main.conf
+
== ModSecurity-Snippet erstellen ==
 +
* Konfigurationsdatei anlegen
 +
sudo nano /etc/nginx/modsec/main.conf
 +
<pre>
 +
modsecurity on;
 +
modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;
 +
</pre>
  
Include /etc/nginx/modsec/crs/crs-setup.conf
+
== NGINX-Site konfigurieren ==
Include /etc/nginx/modsec/crs/rules/*.conf
+
* Standard-VHost anpassen
 
+
sudo nano /etc/nginx/sites-available/default
=== Virtuellen Host konfigurieren ===
 
 
 
;Richte einen Reverse Proxy mit SSL und WAF ein.
 
 
 
* nano /etc/nginx/conf.d/revproxy.it113.int.conf
 
 
<pre>
 
<pre>
server {
+
# HTTP → HTTPS Redirect
    listen 443 ssl;
+
server {
    server_name revproxy.it113.int;
+
    listen 80;
 +
    server_name localhost;
 +
    return 301 https://$host$request_uri;
 +
}
  
    ssl_certificate /etc/nginx/ssl/revproxy.it113.int.crt;
+
# HTTPS-Server mit TLS und ModSecurity
    ssl_certificate_key /etc/nginx/ssl/revproxy.it113.int.key;
+
server {
 +
    listen 443 ssl;
 +
    server_name localhost;
  
    modsecurity on;
+
    ssl_certificate    /etc/nginx/fullchain.pem;
    modsecurity_rules_file /etc/nginx/modsec/main.conf;
+
    ssl_certificate_key /etc/nginx/privkey.pem;
 +
  
    location / {
+
    ssl_protocols TLSv1.2 TLSv1.3;
        proxy_pass https://mail.it113.int;
+
    ssl_prefer_server_ciphers on;
        proxy_set_header Host $host;
+
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
        proxy_set_header X-Real-IP $remote_addr;
 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
    }
 
}
 
</pre>
 
  
=== Nginx starten ===
+
    access_log /var/log/nginx/access.log waf_combined;
 +
    error_log  /var/log/nginx/error.log warn;
  
;Starte Nginx, um die Konfiguration zu laden.
+
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
 +
    add_header Cache-Control "no-store, no-cache, must-revalidate";
  
* systemctl restart nginx
+
    error_page 403 /403.html;
 +
    location = /403.html {
 +
        root /var/www/html;
 +
        internal;
 +
    }
  
=== Schutzmechanismen testen ===
+
    include /etc/nginx/modsec/main.conf;
  
;Teste den WAF mit simulierten Angriffen.
+
    location / {
 +
        proxy_pass http://192.168.178.66;
 +
        proxy_set_header Host $host;
 +
        proxy_set_header X-Real-IP $remote_addr;
 +
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 +
    }
  
* curl "https://revproxy.it113.int/?q=' or '1'='1"
+
    # Optional: Audit-Log über Browser abrufbar
* curl "https://revproxy.it113.int/?cmd=cat%20/etc/passwd"
+
    location /_waflog {
 +
        alias /var/log/nginx/modsec_audit.log;
 +
        types { }
 +
        default_type text/plain;
  
;Erwartete Ausgabe: 403 Forbidden, da ModSecurity die Angriffe blockiert.
+
        auth_basic "ModSecurity Auditlog";
 +
        auth_basic_user_file /etc/nginx/.htpasswd;
 +
    }
 +
}
 +
</pre>
  
=== Fehlerbehandlung ===
+
== Logging ==
 +
* Log-Format ergänzen (/etc/nginx/nginx.conf im http{}-Block)
 +
<pre>
 +
log_format waf_combined '$remote_addr - $remote_user [$time_local] '
 +
                        '"$request" $status $body_bytes_sent '
 +
                        '"$http_referer" "$http_user_agent" '
 +
                        'ModSecID=$request_id Host="$host" URI="$request_uri"';
 +
</pre>
  
;Falls nichts blockiert wird, prüfe die Logs und Konfiguration.
+
* Log-Dateien anlegen
 +
<pre>
 +
touch /var/log/nginx/modsec_audit.log /var/log/nginx/modsec_debug.log
 +
chown www-data:www-data /var/log/nginx/modsec_*.log
 +
chmod 640 /var/log/nginx/modsec_*.log
 +
</pre>
  
* cat /var/log/modsecurity/audit.log
+
== Fehlerseite anlegen ==
* nginx -V
+
* Beispiel-Datei /var/www/html/403.html
 +
<pre>
 +
<html>
 +
<head><title>403 Forbidden</title></head>
 +
<body>
 +
<h1>Oops! Zugriff verweigert</h1>
 +
<p>Deine Anfrage wurde von der Web Application Firewall blockiert.</p>
 +
</body>
 +
</html>
 +
</pre>
  
;Stelle sicher, dass "--with-http_modsecurity_module" in der Ausgabe von nginx -V erscheint.
+
== Aktivierung ==
 +
<pre>
 +
ln -sf /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default
 +
nginx -t && systemctl reload nginx
 +
</pre>
  
=== Hinweise ===
+
== Hinweise ==
 +
* crs-setup.conf definiert Paranoia-Level, Variablen und Schwellenwerte.
 +
* Regeln liegen unter /etc/nginx/modsec/coreruleset/rules/.
 +
* Zugriff auf /_waflog erlaubt Audit-Log-Ansicht im Browser (mit Basic-Auth).
 +
* ModSecurity greift nur, wenn include /etc/nginx/modsec/main.conf gesetzt ist.
  
;ModSecurity v3 mit OWASP CRS schützt vor SQLi, XSS, RCE, LFI, RFI und mehr.
+
[[KATEGORIE:WAF]]
;Die Regeln können in /etc/nginx/modsec/crs/crs-setup.conf angepasst werden.
 

Aktuelle Version vom 23. August 2025, 17:28 Uhr

NGINX mit ModSecurity v3 und OWASP CRS als Reverse Proxy

Diese Konfiguration stellt einen TLS-gesicherten Reverse-Proxy mit aktiver ModSecurity-WAF und OWASP Core Rule Set (CRS) bereit. Ziel ist die Absicherung von Backend-Webdiensten, ergänzt durch Logging, Debug-Informationen und optionaler Anzeige des Audit-Logs im Browser.

Voraussetzungen

  • Ubuntu 22.04 oder Debian 12
  • Backend-Dienst z. B. unter http://127.0.0.1:8080 erreichbar
  • TLS-Zertifikate (crt.pem, privkey.pem, ca.crt) aus interner CA

Installation

  • Pakete installieren
sudo apt update
sudo apt install nginx libmodsecurity3 libnginx-mod-http-modsecurity git apache2-utils -y

ModSecurity aktivieren

  • Konfigurationsverzeichnis anlegen
sudo mkdir -p /etc/nginx/modsec
  • Basis-Konfiguration erstellen
sudo nano /etc/nginx/modsec/modsecurity.conf
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess Off

SecAuditEngine RelevantOnly
SecAuditLog /var/log/nginx/modsec_audit.log
SecAuditLogParts ABIJDEFHZ

SecDebugLog /var/log/nginx/modsec_debug.log
SecDebugLogLevel 3

SecTmpDir /tmp/
SecDataDir /tmp/

# Beispiel-Testregel (optional)
SecRule ARGS "@contains script" \
    "id:9999,phase:1,deny,log,status:403,msg:'Test rule triggered'"

# OWASP Core Rule Set
Include /etc/nginx/modsec/coreruleset/crs-setup.conf
Include /etc/nginx/modsec/coreruleset/rules/*.conf

OWASP Core Rule Set installieren

  • In das ModSecurity-Verzeichnis wechseln
cd /etc/nginx/modsec
  • CRS klonen
sudo git clone https://github.com/coreruleset/coreruleset.git
  • Setup-Datei aktivieren
sudo cp coreruleset/crs-setup.conf.example coreruleset/crs-setup.conf

ModSecurity-Snippet erstellen

  • Konfigurationsdatei anlegen
sudo nano /etc/nginx/modsec/main.conf
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;

NGINX-Site konfigurieren

  • Standard-VHost anpassen
sudo nano /etc/nginx/sites-available/default
# HTTP → HTTPS Redirect
server {
    listen 80;
    server_name localhost;
    return 301 https://$host$request_uri;
}

# HTTPS-Server mit TLS und ModSecurity
server {
    listen 443 ssl;
    server_name localhost;

    ssl_certificate     /etc/nginx/fullchain.pem;
    ssl_certificate_key /etc/nginx/privkey.pem;
 

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';

    access_log /var/log/nginx/access.log waf_combined;
    error_log  /var/log/nginx/error.log warn;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header Cache-Control "no-store, no-cache, must-revalidate";

    error_page 403 /403.html;
    location = /403.html {
        root /var/www/html;
        internal;
    }

    include /etc/nginx/modsec/main.conf;

    location / {
        proxy_pass http://192.168.178.66;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # Optional: Audit-Log über Browser abrufbar
    location /_waflog {
        alias /var/log/nginx/modsec_audit.log;
        types { }
        default_type text/plain;

        auth_basic "ModSecurity Auditlog";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

Logging

  • Log-Format ergänzen (/etc/nginx/nginx.conf im http{}-Block)
log_format waf_combined '$remote_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent" '
                        'ModSecID=$request_id Host="$host" URI="$request_uri"';
  • Log-Dateien anlegen
touch /var/log/nginx/modsec_audit.log /var/log/nginx/modsec_debug.log
chown www-data:www-data /var/log/nginx/modsec_*.log
chmod 640 /var/log/nginx/modsec_*.log

Fehlerseite anlegen

  • Beispiel-Datei /var/www/html/403.html
<html>
 <head><title>403 Forbidden</title></head>
 <body>
 <h1>Oops! Zugriff verweigert</h1>
 <p>Deine Anfrage wurde von der Web Application Firewall blockiert.</p>
 </body>
</html>

Aktivierung

ln -sf /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx

Hinweise

  • crs-setup.conf definiert Paranoia-Level, Variablen und Schwellenwerte.
  • Regeln liegen unter /etc/nginx/modsec/coreruleset/rules/.
  • Zugriff auf /_waflog erlaubt Audit-Log-Ansicht im Browser (mit Basic-Auth).
  • ModSecurity greift nur, wenn include /etc/nginx/modsec/main.conf gesetzt ist.