Nginx mit Modsecurity Whitelists
Zur Navigation springen
Zur Suche springen
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 |