Skip to content
Diese Seite wurde mit KI-Unterstützung erstellt und übersetzt. Falls Ihnen Ungenauigkeiten auffallen, helfen Sie gerne bei der Verbesserung. Auf GitHub bearbeiten

YAML-Regel-Syntax

Diese Seite dokumentiert das vollständige YAML-Regelschema, das von PRX-WAF verwendet wird. Jede Regeldatei folgt dieser Struktur.

Dateistruktur

Jede YAML-Regeldatei hat einen übergeordneten Metadatenabschnitt, gefolgt von einer Liste von Regeln:

yaml
version: "1.0"                     # Schema-Version (erforderlich)
description: "Short description"   # Lesbares Label (erforderlich)
source: "OWASP CRS v4.25.0"       # Ursprung der Regeln (optional)
license: "Apache-2.0"             # SPDX-Lizenzkennung (optional)

rules:
  - <rule>
  - <rule>

Regelschema

Jede Regel in der rules-Liste hat die folgenden Felder:

yaml
- id: "CRS-942100"              # Eindeutige String-ID (ERFORDERLICH)
  name: "SQL injection attack"  # Kurze Beschreibung (ERFORDERLICH)
  category: "sqli"              # Kategorie-Tag (ERFORDERLICH)
  severity: "critical"          # Schweregrad (ERFORDERLICH)
  paranoia: 1                   # Paranoia-Stufe 1-4 (optional, Standard: 1)
  field: "all"                  # Zu inspizierendes Anfragefeld (ERFORDERLICH)
  operator: "regex"             # Übereinstimmungsoperator (ERFORDERLICH)
  value: "(?i)select.+from"     # Muster oder Schwellenwert (ERFORDERLICH)
  action: "block"               # Aktion bei Übereinstimmung (ERFORDERLICH)
  tags:                         # String-Tags (optional)
    - "owasp-crs"
    - "sqli"
  crs_id: 942100                # Ursprüngliche numerische CRS-ID (optional)
  reference: "https://..."      # CVE- oder Dokumentationslink (optional)

Erforderliche Felder

FeldTypBeschreibung
idstringEindeutiger Bezeichner über alle Regeldateien. Format: <PRÄFIX>-<KATEGORIE>-<NNN>
namestringKurze lesbare Beschreibung (max ~120 Zeichen)
categorystringKategorie-Tag für Filterung und Berichterstattung
severitystringEines von: critical, high, medium, low, info, notice, warning, error, unknown
fieldstringWelcher Teil der Anfrage zu inspizieren ist (siehe Feldreferenz)
operatorstringWie der Wert übereinstimmt (siehe Operatorreferenz)
valuestringMuster, Schwellenwert oder Wordlist-Dateiname
actionstringWas zu tun ist, wenn die Regel übereinstimmt (siehe Aktionsreferenz)

Optionale Felder

FeldTypStandardBeschreibung
paranoiainteger1Paranoia-Stufe 1-4
tagsstring[][]Tags für Filterung und Dashboard-Anzeige
crs_idinteger--Ursprüngliche numerische OWASP CRS-ID
referencestring--URL zu CVE, OWASP-Artikel oder Begründung

Feldreferenz

Der field-Wert bestimmt, welcher Teil der HTTP-Anfrage inspiziert wird:

FeldInspiziert
pathAnfrage-URI-Pfad (ohne Query-String)
queryQuery-String (alle Parameter, dekodiert)
bodyAnfrage-Body (dekodiert)
headersAlle Anfrage-Header (Name: Wert-Paare)
user_agentNur User-Agent-Header
cookiesAnfrage-Cookies
methodHTTP-Methode (GET, POST, PUT usw.)
content_typeContent-Type-Header
content_lengthContent-Length-Wert (für numerischen Vergleich)
path_lengthLänge des URI-Pfads (für numerischen Vergleich)
query_arg_countAnzahl der Query-Parameter (für numerischen Vergleich)
allAlle oben genannten Felder kombiniert

Operatorreferenz

Der operator-Wert bestimmt, wie der value gegen das inspizierte Feld übereinstimmt:

OperatorBeschreibungWertformat
regexPCRE-kompatibler regulärer AusdruckRegex-Muster
containsFeld enthält den wörtlichen StringWörtlicher String
equalsFeld entspricht exakt dem Wert (Groß-/Kleinschreibung sensitiv)Wörtlicher String
not_inFeldwert ist NICHT in der ListeKommagetrennte Liste
gtFeldwert (numerisch) ist größer alsZahlen-String
ltFeldwert (numerisch) ist kleiner alsZahlen-String
geFeldwert (numerisch) ist größer als oder gleichZahlen-String
leFeldwert (numerisch) ist kleiner als oder gleichZahlen-String
detect_sqliSQL-Injection-Erkennung via libinjection"true" oder ""
detect_xssXSS-Erkennung via libinjection"true" oder ""
pm_from_filePhrasen-Matching gegen Wordlist-DateiDateiname in owasp-crs/data/
pmPhrasen-Matching gegen Inline-ListeKommagetrennte Phrasen

Aktionsreferenz

Der action-Wert bestimmt, was passiert, wenn eine Regel übereinstimmt:

AktionBeschreibung
blockAnfrage mit 403 Forbidden-Antwort ablehnen
logAnfrage erlauben, aber Übereinstimmung protokollieren (Überwachungsmodus)
allowAnfrage explizit erlauben (überschreibt andere Regeln)
denyAlias für block
redirectAnfrage umleiten (Engine-spezifische Konfiguration)
dropVerbindung stillschweigend trennen

TIP

Neue Regeln mit action: log beginnen, um auf Falsch-Positive zu überwachen, bevor auf action: block gewechselt wird.

ID-Namespace-Konvention

Regel-IDs sollten der etablierten Präfix-Konvention folgen:

VerzeichnisID-PräfixBeispiel
owasp-crs/CRS-<Nummer>CRS-942100
modsecurity/MODSEC-<KATEGORIE>-<NNN>MODSEC-IP-001
cve-patches/CVE-<JAHR>-<KURZ>-<NNN>CVE-2021-LOG4J-001
custom/CUSTOM-<KATEGORIE>-<NNN>CUSTOM-API-001

Vollständiges Beispiel

yaml
version: "1.0"
description: "Application-specific access control rules"
source: "custom"
license: "Apache-2.0"

rules:
  - id: "CUSTOM-API-001"
    name: "Block access to internal admin API"
    category: "access-control"
    severity: "high"
    paranoia: 1
    field: "path"
    operator: "regex"
    value: "(?i)^/internal/"
    action: "block"
    tags: ["custom", "access-control"]

  - id: "CUSTOM-BOT-001"
    name: "Log suspicious automated tool user-agents"
    category: "scanner"
    severity: "medium"
    paranoia: 2
    field: "user_agent"
    operator: "regex"
    value: "(?i)(masscan|zgrab|python-requests/|go-http-client)"
    action: "log"
    tags: ["custom", "bot", "scanner"]

  - id: "CUSTOM-RATE-001"
    name: "Block requests with excessive query parameters"
    category: "dos"
    severity: "medium"
    paranoia: 1
    field: "query_arg_count"
    operator: "gt"
    value: "50"
    action: "block"
    tags: ["custom", "dos"]

Regelvalidierung

Regeldateien vor der Bereitstellung validieren:

bash
# Alle Regeln validieren
python rules/tools/validate.py rules/

# Bestimmte Datei validieren
python rules/tools/validate.py rules/custom/myapp.yaml

Der Validierer prüft auf:

  • Alle erforderlichen Felder sind vorhanden
  • Keine doppelten Regel-IDs über alle Dateien
  • Schweregrad- und Aktionswerte sind gültig
  • Paranoia-Stufen liegen im Bereich 1-4
  • Regexe kompilieren korrekt
  • Numerische Operatoren werden nicht mit String-Werten verwendet

Nächste Schritte

Released under the Apache-2.0 License.