Nginx mit Modsecurity Whitelists

Aus Xinux Wiki
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