Nginx mit Modsecurity: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(21 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
== Einfache Demonstration eines WAF mit Nginx und ModSecurity ==
+
= NGINX mit ModSecurity v3 und OWASP CRS als Reverse Proxy =
  
;Dieser Artikel zeigt, wie man mit Nginx und ModSecurity schnell einen Web Application Firewall (WAF) einrichtet, um Angriffe wie SQL- oder Command-Injection zu demonstrieren.
+
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
  
;Stelle sicher, dass du ein Debian- oder Ubuntu-System verwendest und Root-Rechte hast.
+
== 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 von Nginx und ModSecurity ===
+
* Basis-Konfiguration erstellen
 +
sudo nano /etc/nginx/modsec/modsecurity.conf
 +
<pre>
 +
SecRuleEngine On
 +
SecRequestBodyAccess On
 +
SecResponseBodyAccess Off
  
;Mit einem Befehl installierst du Nginx, das ModSecurity-Modul und die OWASP-Regeln.
+
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
 +
SecDebugLogLevel 3
  
=== Konfiguration von Nginx ===
+
SecTmpDir /tmp/
 +
SecDataDir /tmp/
  
;Bearbeite die Nginx-Konfigurationsdatei, um ModSecurity zu aktivieren.
+
# 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>
  
  load_module /usr/lib/nginx/modules/ngx_http_modsecurity_module.so;
+
== OWASP Core Rule Set installieren ==
 +
* In das ModSecurity-Verzeichnis wechseln
 +
  cd /etc/nginx/modsec
  
  http {
+
* CRS klonen
    server {
+
  sudo git clone https://github.com/coreruleset/coreruleset.git
        listen 80;
 
        server_name localhost;
 
  
        modsecurity on;
+
* Setup-Datei aktivieren
        modsecurity_rules_file /etc/nginx/modsec/main.conf;
+
sudo cp coreruleset/crs-setup.conf.example coreruleset/crs-setup.conf
  
        location / {
+
== ModSecurity-Snippet erstellen ==
            root /var/www/html;
+
* Konfigurationsdatei anlegen
        }
+
sudo nano /etc/nginx/modsec/main.conf
    }
+
<pre>
}
+
modsecurity on;
 +
modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;
 +
</pre>
  
;Erstelle die ModSecurity-Regeldatei mit den OWASP Core Rule Set (CRS).
+
== NGINX-Site konfigurieren ==
 +
* Standard-VHost anpassen
 +
sudo nano /etc/nginx/sites-available/default
 +
<pre>
 +
# HTTP → HTTPS Redirect
 +
server {
 +
    listen 80;
 +
    server_name localhost;
 +
    return 301 https://$host$request_uri;
 +
}
  
* echo "Include /usr/share/modsecurity-crs/owasp-crs.load" > /etc/nginx/modsec/main.conf
+
# HTTPS-Server mit TLS und ModSecurity
 +
server {
 +
    listen 443 ssl;
 +
    server_name localhost;
  
=== Testseite erstellen ===
+
    ssl_certificate    /etc/nginx/fullchain.pem;
 +
    ssl_certificate_key /etc/nginx/privkey.pem;
 +
  
;Füge eine einfache HTML-Seite hinzu, um den WAF zu testen.
+
    ssl_protocols TLSv1.2 TLSv1.3;
 +
    ssl_prefer_server_ciphers on;
 +
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
  
* echo "<h1>Testseite</h1>" > /var/www/html/index.html
+
    access_log /var/log/nginx/access.log waf_combined;
 +
    error_log  /var/log/nginx/error.log warn;
  
=== Nginx starten ===
+
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
 +
    add_header Cache-Control "no-store, no-cache, must-revalidate";
  
;Starte Nginx, um die Konfiguration zu übernehmen.
+
    error_page 403 /403.html;
 +
    location = /403.html {
 +
        root /var/www/html;
 +
        internal;
 +
    }
  
* systemctl restart nginx
+
    include /etc/nginx/modsec/main.conf;
  
=== WAF-Funktionalität testen ===
+
    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;
 +
    }
  
;Simuliere eine SQL-Injection, um zu prüfen, ob der WAF sie blockiert.
+
    # Optional: Audit-Log über Browser abrufbar
 +
    location /_waflog {
 +
        alias /var/log/nginx/modsec_audit.log;
 +
        types { }
 +
        default_type text/plain;
  
* curl "http://localhost/test?id=1' OR '1'='1"
+
        auth_basic "ModSecurity Auditlog";
 +
        auth_basic_user_file /etc/nginx/.htpasswd;
 +
    }
 +
}
 +
</pre>
  
;Erwartete Ausgabe: Der Server antwortet mit "403 Forbidden", da ModSecurity den Angriff erkennt.
+
== 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>
  
=== Log-Dateien prüfen ===
+
* 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>
  
;Überprüfe die ModSecurity-Logs, um Details zum blockierten Angriff zu sehen.
+
== Fehlerseite anlegen ==
 +
* 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>
  
* cat /var/log/modsecurity/audit.log
+
== Aktivierung ==
 +
<pre>
 +
ln -sf /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default
 +
nginx -t && systemctl reload nginx
 +
</pre>
  
== Fazit ==
+
== 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.
  
Mit wenigen Schritten hast du einen funktionalen WAF eingerichtet, der typische Angriffe wie SQL-Injection erkennt und blockiert. Dieses Setup ist ideal für Schulungen, da es einfach, schnell und effektiv ist.
+
[[KATEGORIE:WAF]]
 
 
;Die OWASP-Regeln bieten umfassenden Schutz und können bei Bedarf 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.