Nginx mit Modsecurity: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(15 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.
+
== Voraussetzungen ==
 +
* Ubuntu 22.04 oder Debian 12
 +
* Zielsystem z. B. unter http://127.0.0.1:8080 erreichbar
  
=== Voraussetzungen ===
+
== Installation ==
 +
* NGINX und ModSecurity installieren
 +
sudo apt update
 +
sudo apt install nginx libmodsecurity3 libnginx-mod-http-modsecurity git -y
  
;Du benötigst ein Debian/Ubuntu-System mit Root-Rechten und einen Backend-Server (z. B. mail.it113.int).
+
== ModSecurity aktivieren ==
 +
* Konfigurationsverzeichnis erstellen
 +
sudo mkdir -p /etc/nginx/modsec
  
* apt-get update
+
* Standardkonfiguration erstellen
 +
sudo vi /etc/nginx/modsec/modsecurity.conf
 +
<pre>
 +
# Aktivieren des ModSecurity-Engines
 +
# -----------------------------
 +
# Grundkonfiguration
 +
# -----------------------------
  
=== Installation der Komponenten ===
+
SecRuleEngine On
 +
SecRequestBodyAccess On
 +
SecResponseBodyAccess Off
  
;Installiere Nginx, ModSecurity und das OWASP CRS.
+
SecAuditEngine RelevantOnly
 +
SecAuditLog /var/log/nginx/modsec_audit.log
  
* 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 0
* 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.
+
# -----------------------------
 +
# Testregel (kann entfernt werden)
 +
# -----------------------------
 +
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 (CRS)
 +
# -----------------------------
 +
Include /etc/nginx/modsec/coreruleset/crs-setup.conf
 +
Include /etc/nginx/modsec/coreruleset/rules/*.conf
  
modsecurity on;
+
</pre>
modsecurity_rules_file /etc/nginx/modsec/main.conf;
 
  
=== Hauptregeldatei erstellen ===
+
== OWASP Core Rule Set installieren ==
 +
* In das ModSecurity-Verzeichnis wechseln
 +
cd /etc/nginx/modsec
  
;Erstelle die ModSecurity-Regeldatei mit CRS-Einbindung.
+
* CRS klonen
 +
sudo git clone https://github.com/coreruleset/coreruleset.git
  
* nano /etc/nginx/modsec/main.conf
+
* Setup-Datei aktivieren
 +
sudo cp coreruleset/crs-setup.conf.example coreruleset/crs-setup.conf
  
Include /etc/nginx/modsec/crs/crs-setup.conf
+
== ModSecurity-Snippet erstellen ==
  Include /etc/nginx/modsec/crs/rules/*.conf
+
* Konfigurationsdatei erstellen
 +
  sudo nano /etc/nginx/modsec/main.conf
  
=== Virtuellen Host konfigurieren ===
+
* Inhalt:
 +
modsecurity on;
 +
modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;
 +
==Eventuell anpassen==
  
;Richte einen Reverse Proxy mit SSL und WAF ein.
+
sudo nano /etc/nginx/modsec/modsecurity.conf
  
* nano /etc/nginx/conf.d/revproxy.it113.int.conf
 
 
<pre>
 
<pre>
server {
+
  GNU nano 7.2                                                                    /etc/nginx/modsec/modsecurity.conf                                                                             
    listen 443 ssl;
+
# Aktivieren des ModSecurity-Engines
    server_name revproxy.it113.int;
+
# -----------------------------
 +
# Grundkonfiguration
 +
# -----------------------------
  
    ssl_certificate /etc/nginx/ssl/revproxy.it113.int.crt;
+
SecRuleEngine On
    ssl_certificate_key /etc/nginx/ssl/revproxy.it113.int.key;
+
SecRequestBodyAccess On
 +
SecResponseBodyAccess Off
  
    modsecurity on;
+
SecAuditEngine RelevantOnly
    modsecurity_rules_file /etc/nginx/modsec/main.conf;
+
SecAuditLog /var/log/nginx/modsec_audit.log
 +
SecAuditLogParts ABIJDEFHZ
 +
SecDebugLog /var/log/nginx/modsec_debug.log
 +
SecDebugLogLevel 3
  
    location / {
+
SecTmpDir /tmp/
        proxy_pass https://mail.it113.int;
+
SecDataDir /tmp/
        proxy_set_header Host $host;
+
 
        proxy_set_header X-Real-IP $remote_addr;
+
# -----------------------------
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+
# Testregel (kann entfernt werden)
    }
+
# -----------------------------
}
+
SecRule ARGS "@contains script" "id:9999,phase:1,deny,log,status:403,msg:'Test rule triggered'"
 +
 
 +
# -----------------------------
 +
# OWASP Core Rule Set (CRS)
 +
# -----------------------------
 +
Include /etc/nginx/modsec/coreruleset/crs-setup.conf
 +
Include /etc/nginx/modsec/coreruleset/rules/*.conf
 
</pre>
 
</pre>
  
=== Nginx starten ===
+
== Reverse Proxy konfigurieren ==
 +
* Standard-VHost ersetzen
 +
sudo vim /etc/nginx/sites-available/default
 +
 
 +
* Inhalt:
 +
<pre>
 +
# HTTP → HTTPS Redirect
 +
server {
 +
    listen 80;
 +
    server_name localhost;
 +
    return 301 https://;
 +
}
 +
 
 +
# HTTPS-Server mit TLS-Zertifikat
 +
server {
 +
    listen 443 ssl;
 +
    server_name localhost;
 +
 
 +
    ssl_certificate    /etc/nginx/crt.pem;
 +
    ssl_certificate_key /etc/nginx/privkey.pem;
 +
    ssl_client_certificate /etc/nginx/ca.crt;
  
;Starte Nginx, um die Konfiguration zu laden.
+
    # Optional: Client-CA-Zertifikat zur Authentifizierung (falls benötigt)
 +
    # ssl_client_certificate /etc/nginx/ssl/ca.crt;
 +
    # ssl_verify_client optional;
  
* 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"
+
</pre>
* curl "https://revproxy.it113.int/?cmd=cat%20/etc/passwd"
 
  
;Erwartete Ausgabe: 403 Forbidden, da ModSecurity die Angriffe blockiert.
 
  
=== Fehlerbehandlung ===
+
*Fehler Anzeige erstellen.
 +
vi  /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>
 +
 
 +
== NGINX prüfen und neu laden ==
 +
* Syntax testen
 +
sudo nginx -t
  
;Falls nichts blockiert wird, prüfe die Logs und Konfiguration.
+
* Dienst neu laden
 +
sudo systemctl reload nginx
  
* cat /var/log/modsecurity/audit.log
+
== Test ==
* nginx -V
+
* Beispielziel: Python-Testserver
 +
python3 -m http.server 8080
  
;Stelle sicher, dass "--with-http_modsecurity_module" in der Ausgabe von nginx -V erscheint.
+
* Angriff simulieren
 +
curl "http://localhost/?param=<script>alert(1)</script>"
  
=== Hinweise ===
+
* Audit-Log (wenn aktiviert) prüfen:
 +
/var/log/nginx/error.log
  
;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 25. Juli 2025, 14:59 Uhr

NGINX mit ModSecurity v3 und OWASP CRS als Reverse Proxy

Voraussetzungen

Installation

  • NGINX und ModSecurity installieren
sudo apt update
sudo apt install nginx libmodsecurity3 libnginx-mod-http-modsecurity git -y

ModSecurity aktivieren

  • Konfigurationsverzeichnis erstellen
sudo mkdir -p /etc/nginx/modsec
  • Standardkonfiguration erstellen
sudo vi /etc/nginx/modsec/modsecurity.conf
# Aktivieren des ModSecurity-Engines
# -----------------------------
# Grundkonfiguration
# -----------------------------

SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess Off

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

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

SecTmpDir /tmp/
SecDataDir /tmp/

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

# -----------------------------
# OWASP Core Rule Set (CRS)
# -----------------------------
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 erstellen
sudo nano /etc/nginx/modsec/main.conf
  • Inhalt:
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;

Eventuell anpassen

sudo nano /etc/nginx/modsec/modsecurity.conf
  GNU nano 7.2                                                                    /etc/nginx/modsec/modsecurity.conf                                                                              
# Aktivieren des ModSecurity-Engines
# -----------------------------
# Grundkonfiguration
# -----------------------------

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/

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

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

Reverse Proxy konfigurieren

  • Standard-VHost ersetzen
sudo vim /etc/nginx/sites-available/default
  • Inhalt:
# HTTP → HTTPS Redirect
server {
    listen 80;
    server_name localhost;
    return 301 https://;
}

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

    ssl_certificate     /etc/nginx/crt.pem;
    ssl_certificate_key /etc/nginx/privkey.pem;
    ssl_client_certificate /etc/nginx/ca.crt;

    # Optional: Client-CA-Zertifikat zur Authentifizierung (falls benötigt)
    # ssl_client_certificate /etc/nginx/ssl/ca.crt;
    # ssl_verify_client optional;

    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;
    }
}


  • Fehler Anzeige erstellen.
vi  /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>

NGINX prüfen und neu laden

  • Syntax testen
sudo nginx -t
  • Dienst neu laden
sudo systemctl reload nginx

Test

  • Beispielziel: Python-Testserver
python3 -m http.server 8080
  • Angriff simulieren
curl "http://localhost/?param=<script>alert(1)</script>"
  • Audit-Log (wenn aktiviert) prüfen:
/var/log/nginx/error.log