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.