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…“) |
|||
| 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 |