Skip to content
Cette page a été générée et traduite avec l'aide de l'IA. Si vous remarquez des inexactitudes, n'hésitez pas à contribuer. Modifier sur GitHub

Syntaxe des règles YAML

Cette page documente le schéma complet de règles YAML utilisé par PRX-WAF. Chaque fichier de règles suit cette structure.

Structure du fichier

Chaque fichier de règles YAML a une section de métadonnées de niveau supérieur suivie d'une liste de règles :

yaml
version: "1.0"                     # Version du schéma (requis)
description: "Short description"   # Étiquette lisible par l'humain (requis)
source: "OWASP CRS v4.25.0"       # Origine des règles (optionnel)
license: "Apache-2.0"             # Identifiant de licence SPDX (optionnel)

rules:
  - <rule>
  - <rule>

Schéma de règle

Chaque règle dans la liste rules possède les champs suivants :

yaml
- id: "CRS-942100"              # ID de chaîne unique (REQUIS)
  name: "SQL injection attack"  # Brève description (REQUIS)
  category: "sqli"              # Tag de catégorie (REQUIS)
  severity: "critical"          # Niveau de sévérité (REQUIS)
  paranoia: 1                   # Niveau de paranoïa 1-4 (optionnel, défaut : 1)
  field: "all"                  # Champ de requête à inspecter (REQUIS)
  operator: "regex"             # Opérateur de correspondance (REQUIS)
  value: "(?i)select.+from"     # Motif ou seuil (REQUIS)
  action: "block"               # Action en cas de correspondance (REQUIS)
  tags:                         # Tags de chaîne (optionnel)
    - "owasp-crs"
    - "sqli"
  crs_id: 942100                # ID numérique CRS original (optionnel)
  reference: "https://..."      # Lien CVE ou documentation (optionnel)

Champs requis

ChampTypeDescription
idstringIdentifiant unique dans tous les fichiers de règles. Format : <PRÉFIXE>-<CATÉGORIE>-<NNN>
namestringBrève description lisible par l'humain (max ~120 caractères)
categorystringTag de catégorie pour le filtrage et les rapports
severitystringL'une des valeurs : critical, high, medium, low, info, notice, warning, error, unknown
fieldstringQuelle partie de la requête inspecter (voir Référence des champs)
operatorstringComment faire correspondre la valeur (voir Référence des opérateurs)
valuestringMotif, seuil ou nom de fichier de liste de mots
actionstringQue faire quand la règle correspond (voir Référence des actions)

Champs optionnels

ChampTypeDéfautDescription
paranoiainteger1Niveau de paranoïa 1-4
tagsstring[][]Tags pour le filtrage et l'affichage dans le tableau de bord
crs_idinteger--ID numérique OWASP CRS original
referencestring--URL vers CVE, article OWASP ou justification

Référence des champs

La valeur field détermine quelle partie de la requête HTTP est inspectée :

ChampInspecte
pathChemin URI de la requête (sans chaîne de requête)
queryChaîne de requête (tous les paramètres, décodés)
bodyCorps de la requête (décodé)
headersTous les en-têtes de requête (paires nom : valeur)
user_agentEn-tête User-Agent uniquement
cookiesCookies de la requête
methodMéthode HTTP (GET, POST, PUT, etc.)
content_typeEn-tête Content-Type
content_lengthValeur Content-Length (pour comparaison numérique)
path_lengthLongueur du chemin URI (pour comparaison numérique)
query_arg_countNombre de paramètres de requête (pour comparaison numérique)
allTous les champs ci-dessus combinés

Référence des opérateurs

La valeur operator détermine comment la value est comparée au champ inspecté :

OpérateurDescriptionFormat de valeur
regexExpression régulière compatible PCREMotif regex
containsLe champ contient la chaîne littéraleChaîne littérale
equalsLe champ est exactement égal à la valeur (sensible à la casse)Chaîne littérale
not_inLa valeur du champ N'EST PAS dans la listeListe séparée par des virgules
gtLa valeur du champ (numérique) est supérieure àChaîne de nombre
ltLa valeur du champ (numérique) est inférieure àChaîne de nombre
geLa valeur du champ (numérique) est supérieure ou égale àChaîne de nombre
leLa valeur du champ (numérique) est inférieure ou égale àChaîne de nombre
detect_sqliDétection d'injection SQL via libinjection"true" ou ""
detect_xssDétection XSS via libinjection"true" ou ""
pm_from_fileCorrespondance de phrase contre un fichier de liste de motsNom de fichier dans owasp-crs/data/
pmCorrespondance de phrase contre une liste en lignePhrases séparées par des virgules

Référence des actions

La valeur action détermine ce qui se passe quand une règle correspond :

ActionDescription
blockRejeter la requête avec une réponse 403 Forbidden
logAutoriser la requête mais journaliser la correspondance (mode surveillance)
allowAutoriser explicitement la requête (remplace les autres règles)
denyAlias pour block
redirectRediriger la requête (configuration spécifique au moteur)
dropAbandonner silencieusement la connexion

TIP

Commencez les nouvelles règles avec action: log pour surveiller les faux positifs avant de passer à action: block.

Convention de l'espace de noms des IDs

Les IDs de règles doivent suivre la convention de préfixe établie :

RépertoirePréfixe IDExemple
owasp-crs/CRS-<nombre>CRS-942100
modsecurity/MODSEC-<CATÉGORIE>-<NNN>MODSEC-IP-001
cve-patches/CVE-<ANNÉE>-<COURT>-<NNN>CVE-2021-LOG4J-001
custom/CUSTOM-<CATÉGORIE>-<NNN>CUSTOM-API-001

Exemple complet

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"]

Validation des règles

Validez vos fichiers de règles avant de les déployer :

bash
# Valider toutes les règles
python rules/tools/validate.py rules/

# Valider un fichier spécifique
python rules/tools/validate.py rules/custom/myapp.yaml

Le validateur vérifie :

  • Les champs requis sont présents
  • Pas d'IDs de règles en double dans tous les fichiers
  • Les valeurs de sévérité et d'action sont valides
  • Les niveaux de paranoïa sont dans la plage 1-4
  • Les expressions régulières se compilent correctement
  • Les opérateurs numériques ne sont pas utilisés avec des valeurs de chaîne

Étapes suivantes

Released under the Apache-2.0 License.