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
referencestring—URL на 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.