Skip to content
Эта страница создана и переведена с помощью ИИ. Если вы заметили неточности, помогите нам улучшить её. Редактировать на GitHub

Синтаксис правил YAML

На этой странице документируется полная схема правил YAML, используемая в PRX-WAF. Каждый файл правил следует этой структуре.

Структура файла

Каждый YAML-файл правил имеет раздел метаданных верхнего уровня, за которым следует список правил:

yaml
version: "1.0"                     # Версия схемы (обязательно)
description: "Short description"   # Читаемая пользователем метка (обязательно)
source: "OWASP CRS v4.25.0"       # Происхождение правил (необязательно)
license: "Apache-2.0"             # Идентификатор лицензии SPDX (необязательно)

rules:
  - <rule>
  - <rule>

Схема правила

Каждое правило в списке rules имеет следующие поля:

yaml
- id: "CRS-942100"              # Уникальный строковый ID (ОБЯЗАТЕЛЬНО)
  name: "SQL injection attack"  # Краткое описание (ОБЯЗАТЕЛЬНО)
  category: "sqli"              # Тег категории (ОБЯЗАТЕЛЬНО)
  severity: "critical"          # Уровень серьёзности (ОБЯЗАТЕЛЬНО)
  paranoia: 1                   # Уровень паранойи 1-4 (необязательно, по умолчанию: 1)
  field: "all"                  # Поле запроса для проверки (ОБЯЗАТЕЛЬНО)
  operator: "regex"             # Оператор сопоставления (ОБЯЗАТЕЛЬНО)
  value: "(?i)select.+from"     # Паттерн или порог (ОБЯЗАТЕЛЬНО)
  action: "block"               # Действие при совпадении (ОБЯЗАТЕЛЬНО)
  tags:                         # Строковые теги (необязательно)
    - "owasp-crs"
    - "sqli"
  crs_id: 942100                # Оригинальный числовой ID CRS (необязательно)
  reference: "https://..."      # Ссылка на CVE или документацию (необязательно)

Обязательные поля

ПолеТипОписание
idstringУникальный идентификатор среди всех файлов правил. Формат: <PREFIX>-<CATEGORY>-<NNN>
namestringКраткое читаемое пользователем описание (макс. ~120 символов)
categorystringТег категории для фильтрации и отчётности
severitystringОдно из: critical, high, medium, low, info, notice, warning, error, unknown
fieldstringКакую часть запроса проверять (см. Справочник полей)
operatorstringКак сопоставлять значение (см. Справочник операторов)
valuestringПаттерн, порог или имя файла словаря
actionstringЧто делать при совпадении правила (см. Справочник действий)

Необязательные поля

ПолеТипПо умолчаниюОписание
paranoiainteger1Уровень паранойи 1-4
tagsstring[][]Теги для фильтрации и отображения в дашборде
crs_idintegerОригинальный числовой ID OWASP CRS
referencestringURL на CVE, статью OWASP или обоснование

Справочник полей

Значение field определяет, какая часть HTTP-запроса проверяется:

ПолеПроверяет
pathПуть URI запроса (без строки запроса)
queryСтрока запроса (все параметры, декодированные)
bodyТело запроса (декодированное)
headersВсе заголовки запроса (пары имя: значение)
user_agentТолько заголовок User-Agent
cookiesКуки запроса
methodHTTP-метод (GET, POST, PUT и т.д.)
content_typeЗаголовок Content-Type
content_lengthЗначение Content-Length (для числового сравнения)
path_lengthДлина пути URI (для числового сравнения)
query_arg_countКоличество параметров запроса (для числового сравнения)
allВсе перечисленные выше поля вместе

Справочник операторов

Значение operator определяет, как value сопоставляется с проверяемым полем:

ОператорОписаниеФормат значения
regexPCRE-совместимое регулярное выражениеПаттерн regex
containsПоле содержит буквальную строкуБуквальная строка
equalsПоле точно равно значению (с учётом регистра)Буквальная строка
not_inЗначение поля НЕ в спискеСписок, разделённый запятыми
gtЗначение поля (числовое) большеЧисловая строка
ltЗначение поля (числовое) меньшеЧисловая строка
geЗначение поля (числовое) больше или равноЧисловая строка
leЗначение поля (числовое) меньше или равноЧисловая строка
detect_sqliОбнаружение SQL-инъекций через libinjection"true" или ""
detect_xssОбнаружение XSS через libinjection"true" или ""
pm_from_filePhrase-match против файла словаряИмя файла в owasp-crs/data/
pmPhrase-match против встроенного спискаФразы, разделённые запятыми

Справочник действий

Значение action определяет, что происходит при совпадении правила:

ДействиеОписание
blockОтклонить запрос с ответом 403 Forbidden
logРазрешить запрос, но зарегистрировать совпадение (режим мониторинга)
allowЯвно разрешить запрос (переопределяет другие правила)
denyПсевдоним для block
redirectПеренаправить запрос (конфигурация движка)
dropТихо разорвать соединение

TIP

Начинайте новые правила с action: log, чтобы отслеживать ложные срабатывания перед переключением на action: block.

Соглашение о пространстве имён ID

ID правил должны следовать установленному соглашению о префиксах:

КаталогПрефикс IDПример
owasp-crs/CRS-<number>CRS-942100
modsecurity/MODSEC-<CATEGORY>-<NNN>MODSEC-IP-001
cve-patches/CVE-<YEAR>-<SHORT>-<NNN>CVE-2021-LOG4J-001
custom/CUSTOM-<CATEGORY>-<NNN>CUSTOM-API-001

Полный пример

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

Валидация правил

Проверяйте файлы правил перед развёртыванием:

bash
# Проверить все правила
python rules/tools/validate.py rules/

# Проверить конкретный файл
python rules/tools/validate.py rules/custom/myapp.yaml

Валидатор проверяет:

  • Обязательные поля присутствуют
  • Нет дублирующихся ID правил в всех файлах
  • Значения severity и action допустимы
  • Уровни паранойи в диапазоне 1-4
  • Regex компилируются корректно
  • Числовые операторы не используются со строковыми значениями

Следующие шаги

Released under the Apache-2.0 License.