Skip to content
Esta página fue generada y traducida con asistencia de IA. Si encuentra alguna imprecisión, no dude en ayudar a mejorarla. Editar en GitHub

Sintaxis de Reglas YAML

Esta página documenta el esquema completo de reglas YAML utilizado por PRX-WAF. Cada archivo de reglas sigue esta estructura.

Estructura del Archivo

Cada archivo de reglas YAML tiene una sección de metadatos de nivel superior seguida de una lista de reglas:

yaml
version: "1.0"                     # Schema version (required)
description: "Short description"   # Human-readable label (required)
source: "OWASP CRS v4.25.0"       # Origin of the rules (optional)
license: "Apache-2.0"             # SPDX license identifier (optional)

rules:
  - <rule>
  - <rule>

Esquema de Regla

Cada regla en la lista rules tiene los siguientes campos:

yaml
- id: "CRS-942100"              # Unique string ID (REQUIRED)
  name: "SQL injection attack"  # Short description (REQUIRED)
  category: "sqli"              # Category tag (REQUIRED)
  severity: "critical"          # Severity level (REQUIRED)
  paranoia: 1                   # Paranoia level 1-4 (optional, default: 1)
  field: "all"                  # Request field to inspect (REQUIRED)
  operator: "regex"             # Match operator (REQUIRED)
  value: "(?i)select.+from"     # Pattern or threshold (REQUIRED)
  action: "block"               # Action on match (REQUIRED)
  tags:                         # String tags (optional)
    - "owasp-crs"
    - "sqli"
  crs_id: 942100                # Original CRS numeric ID (optional)
  reference: "https://..."      # CVE or documentation link (optional)

Campos Requeridos

CampoTipoDescripción
idstringIdentificador único en todos los archivos de reglas. Formato: <PREFIJO>-<CATEGORÍA>-<NNN>
namestringDescripción breve legible (máximo ~120 caracteres)
categorystringEtiqueta de categoría para filtrado y generación de informes
severitystringUno de: critical, high, medium, low, info, notice, warning, error, unknown
fieldstringQué parte de la solicitud inspeccionar (consulta la Referencia de Campos)
operatorstringCómo coincidir el valor (consulta la Referencia de Operadores)
valuestringPatrón, umbral o nombre de archivo de lista de palabras
actionstringQué hacer cuando la regla coincide (consulta la Referencia de Acciones)

Campos Opcionales

CampoTipoPredeterminadoDescripción
paranoiainteger1Nivel de paranoia 1-4
tagsstring[][]Etiquetas para filtrado y visualización en el panel
crs_idinteger--ID numérico original de OWASP CRS
referencestring--URL al CVE, artículo OWASP o justificación

Referencia de Campos

El valor de field determina qué parte de la solicitud HTTP se inspecciona:

CampoInspecciona
pathRuta del URI de solicitud (sin cadena de consulta)
queryCadena de consulta (todos los parámetros, decodificados)
bodyCuerpo de la solicitud (decodificado)
headersTodos los encabezados de solicitud (pares nombre: valor)
user_agentSolo el encabezado User-Agent
cookiesCookies de la solicitud
methodMétodo HTTP (GET, POST, PUT, etc.)
content_typeEncabezado Content-Type
content_lengthValor Content-Length (para comparación numérica)
path_lengthLongitud de la ruta del URI (para comparación numérica)
query_arg_countNúmero de parámetros de consulta (para comparación numérica)
allTodos los campos anteriores combinados

Referencia de Operadores

El valor de operator determina cómo se compara el value con el campo inspeccionado:

OperadorDescripciónFormato del Valor
regexExpresión regular compatible con PCREPatrón regex
containsEl campo contiene la cadena literalCadena literal
equalsEl campo es exactamente igual al valor (sensible a mayúsculas)Cadena literal
not_inEl valor del campo NO está en la listaLista separada por comas
gtEl valor del campo (numérico) es mayor queCadena numérica
ltEl valor del campo (numérico) es menor queCadena numérica
geEl valor del campo (numérico) es mayor o igual queCadena numérica
leEl valor del campo (numérico) es menor o igual queCadena numérica
detect_sqliDetección de inyección SQL vía libinjection"true" o ""
detect_xssDetección de XSS vía libinjection"true" o ""
pm_from_fileCoincidencia de frases contra archivo de lista de palabrasNombre de archivo en owasp-crs/data/
pmCoincidencia de frases contra lista en líneaFrases separadas por comas

Referencia de Acciones

El valor de action determina qué ocurre cuando una regla coincide:

AcciónDescripción
blockRechaza la solicitud con una respuesta 403 Forbidden
logPermite la solicitud pero registra la coincidencia (modo de monitoreo)
allowPermite explícitamente la solicitud (anula otras reglas)
denyAlias de block
redirectRedirige la solicitud (configuración específica del motor)
dropAbandona silenciosamente la conexión

TIP

Comienza las nuevas reglas con action: log para monitorear falsos positivos antes de cambiar a action: block.

Convención de Espacio de Nombres de IDs

Los IDs de reglas deben seguir la convención de prefijos establecida:

DirectorioPrefijo de IDEjemplo
owasp-crs/CRS-<número>CRS-942100
modsecurity/MODSEC-<CATEGORÍA>-<NNN>MODSEC-IP-001
cve-patches/CVE-<AÑO>-<CORTO>-<NNN>CVE-2021-LOG4J-001
custom/CUSTOM-<CATEGORÍA>-<NNN>CUSTOM-API-001

Ejemplo Completo

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

Validación de Reglas

Valida tus archivos de reglas antes de implementar:

bash
# Validate all rules
python rules/tools/validate.py rules/

# Validate a specific file
python rules/tools/validate.py rules/custom/myapp.yaml

El validador verifica:

  • Los campos requeridos están presentes
  • No hay IDs de reglas duplicados en todos los archivos
  • Los valores de severidad y acción son válidos
  • Los niveles de paranoia están en el rango 1-4
  • Los regex compilan correctamente
  • Los operadores numéricos no se usan con valores de cadena

Próximos Pasos

Released under the Apache-2.0 License.