Nginx mit Modsecurity Whitelists: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Die Seite wurde neu angelegt: „ == Voraussetzungen == * Webserver mit ModSecurity (z. B. NGINX + ModSecurity v3) * OWASP CRS kann verwendet werden, aber nicht erforderlich * Pfad zur Haupt…“ |
Keine Bearbeitungszusammenfassung |
||
| Zeile 1: | Zeile 1: | ||
= ModSecurity Default-Deny-Policy = | |||
== Voraussetzungen == | == Voraussetzungen == | ||
* | * NGINX mit ModSecurity v3 | ||
* | * Hauptkonfigurationsdatei: /etc/nginx/modsec/modsecurity.conf | ||
* | * Eigene Regeln liegen in: /etc/nginx/modsec/custom-rules/ | ||
== Ziel == | == Ziel == | ||
* Nur definierte Methoden | * Default-Deny: Alles ist verboten | ||
* Nur explizit definierte URIs für bestimmte Methoden sind erlaubt | |||
* | * Whitelist aus externen Dateien geladen | ||
== | == Allowlist-Dateien == | ||
/etc/nginx/modsec/allowed_post_uris.txt | |||
--------------------------------------- | |||
/safe/upload | |||
/safe/form | |||
/safe/login | |||
== | /etc/nginx/modsec/allowed_get_prefixes.txt | ||
Datei: /etc/ | ------------------------------------------ | ||
/safe/ | |||
/assets/ | |||
/static/ | |||
== Eigene Regeln == | |||
Datei: /etc/nginx/modsec/custom-rules/default-deny.conf | |||
<pre> | <pre> | ||
# | # POST nur auf URIs aus Datei erlauben | ||
SecRule REQUEST_METHOD "@streq POST" " | SecRule REQUEST_METHOD "@streq POST" \ | ||
SecRule REQUEST_URI " | "id:2000,phase:1,allow,log,skipAfter:ALLOWLIST_DONE,chain" | ||
SecRule REQUEST_URI "@pmFromFile /etc/nginx/modsec/allowed_post_uris.txt" | |||
# | # GET nur auf Präfixe aus Datei erlauben | ||
SecRule REQUEST_METHOD "@streq GET" " | SecRule REQUEST_METHOD "@streq GET" \ | ||
SecRule REQUEST_URI "@ | "id:2001,phase:1,allow,log,skipAfter:ALLOWLIST_DONE,chain" | ||
SecRule REQUEST_URI "@pmFromFile /etc/nginx/modsec/allowed_get_prefixes.txt" "chain,capture" | |||
SecRule REQUEST_URI "@beginsWith %{MATCHED_VAR}" | |||
# | # Alles andere blockieren (Default-Deny) | ||
SecRule REQUEST_URI ".*" \ | |||
"id:2999,phase:1,deny,status:403,log,msg:'Default deny policy'" | |||
# Marker | # Marker für SkipAfter | ||
SecMarker ALLOWLIST_DONE | SecMarker ALLOWLIST_DONE | ||
</pre> | </pre> | ||
== | == Hauptkonfiguration == | ||
Datei: /etc/nginx/modsec/modsecurity.conf | |||
<pre> | <pre> | ||
# | SecRuleEngine On | ||
Include /usr/share/modsecurity-crs/crs-setup.conf | SecRequestBodyAccess On | ||
Include /usr/share/modsecurity-crs/rules/*.conf | SecResponseBodyAccess Off | ||
# Optionale CRS-Regeln (nur wenn gewünscht) | |||
#Include /usr/share/modsecurity-crs/crs-setup.conf | |||
#Include /usr/share/modsecurity-crs/rules/*.conf | |||
# Eigene | # Eigene Default-Deny-Policy laden | ||
Include /etc/ | Include /etc/nginx/modsec/custom-rules/default-deny.conf | ||
</pre> | </pre> | ||
== NGINX- | == NGINX-Einbindung == | ||
In der vHost-Konfiguration | In der vHost- oder http/server/location-Konfiguration: | ||
<pre> | <pre> | ||
modsecurity on; | modsecurity on; | ||
modsecurity_rules_file /etc/modsecurity | modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf; | ||
</pre> | </pre> | ||
== Neustart / Reload == | == Neustart / Reload == | ||
* | * Syntaxprüfung: nginx -t | ||
* | * Reload: systemctl reload nginx | ||
== | == Testfälle == | ||
{| class="wikitable" | {| class="wikitable" | ||
! Methode !! URI !! Erwartung | ! Methode !! URI !! Erwartung | ||
| Zeile 72: | Zeile 84: | ||
| POST || /badpath || 403 Forbidden | | POST || /badpath || 403 Forbidden | ||
|- | |- | ||
| GET || /safe/ | | GET || /safe/test || 200 OK | ||
|- | |- | ||
| GET || /admin || 403 Forbidden | | GET || /admin || 403 Forbidden | ||
|} | |} | ||
Aktuelle Version vom 5. September 2025, 07:13 Uhr
ModSecurity Default-Deny-Policy
Voraussetzungen
- NGINX mit ModSecurity v3
- Hauptkonfigurationsdatei: /etc/nginx/modsec/modsecurity.conf
- Eigene Regeln liegen in: /etc/nginx/modsec/custom-rules/
Ziel
- Default-Deny: Alles ist verboten
- Nur explizit definierte URIs für bestimmte Methoden sind erlaubt
- Whitelist aus externen Dateien geladen
Allowlist-Dateien
/etc/nginx/modsec/allowed_post_uris.txt
/safe/upload /safe/form /safe/login
/etc/nginx/modsec/allowed_get_prefixes.txt
/safe/ /assets/ /static/
Eigene Regeln
Datei: /etc/nginx/modsec/custom-rules/default-deny.conf
# POST nur auf URIs aus Datei erlauben
SecRule REQUEST_METHOD "@streq POST" \
"id:2000,phase:1,allow,log,skipAfter:ALLOWLIST_DONE,chain"
SecRule REQUEST_URI "@pmFromFile /etc/nginx/modsec/allowed_post_uris.txt"
# GET nur auf Präfixe aus Datei erlauben
SecRule REQUEST_METHOD "@streq GET" \
"id:2001,phase:1,allow,log,skipAfter:ALLOWLIST_DONE,chain"
SecRule REQUEST_URI "@pmFromFile /etc/nginx/modsec/allowed_get_prefixes.txt" "chain,capture"
SecRule REQUEST_URI "@beginsWith %{MATCHED_VAR}"
# Alles andere blockieren (Default-Deny)
SecRule REQUEST_URI ".*" \
"id:2999,phase:1,deny,status:403,log,msg:'Default deny policy'"
# Marker für SkipAfter
SecMarker ALLOWLIST_DONE
Hauptkonfiguration
Datei: /etc/nginx/modsec/modsecurity.conf
SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess Off # Optionale CRS-Regeln (nur wenn gewünscht) #Include /usr/share/modsecurity-crs/crs-setup.conf #Include /usr/share/modsecurity-crs/rules/*.conf # Eigene Default-Deny-Policy laden Include /etc/nginx/modsec/custom-rules/default-deny.conf
NGINX-Einbindung
In der vHost- oder http/server/location-Konfiguration:
modsecurity on; modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;
Neustart / Reload
- Syntaxprüfung: nginx -t
- Reload: systemctl reload nginx
Testfälle
| Methode | URI | Erwartung |
|---|---|---|
| POST | /safe/upload | 200 OK |
| POST | /badpath | 403 Forbidden |
| GET | /safe/test | 200 OK |
| GET | /admin | 403 Forbidden |