Перейти к содержимому

Firewall

Firewall позволяет описать, какие запросы к проекту нужно пропустить, заблокировать, записать в лог или ограничить по частоте. Правила проверяются до обработки запроса приложением и до дополнительных защит preview-деплоев.

Используйте Firewall, когда нужно управлять входящим трафиком к проекту:

ЗадачаКак решается
Закрыть /admin или внутренний разделПравило по request.path и IP/CIDR офиса
Разрешить доступ только из офисной сетиdefaultAction: deny и allow-правило для нужных CIDR
Ограничить доступ из стран или регионовПравило по geo.country или geo.continent
Найти подозрительные запросы перед блокировкойlog-правило и режим shadow
Ограничить частоту запросов к API или разделуrate_limit-правило по IP, path или host

Firewall не заменяет маршрутизацию, домены и Preview Protection. Для redirects, rewrites и HTTP-заголовков используйте Правила маршрутизации. Для логина, пароля и bypass-токенов preview-деплоев используйте Preview Protection.

  1. Откройте нужный проект.

  2. Перейдите в Project → Firewall.

  3. Настройте режим, действие по умолчанию и правила. Для сложных правил используйте Advanced JSON config.

  4. Сохраните черновик.

  5. Проверьте черновик через симулятор и события.

  6. Опубликуйте политику.

На уровне workspace страница Firewall показывает обзор проектов и ссылки на проектные политики. Сами правила редактируются в проекте.

Firewall применяется до приложения, но он не единственная проверка запроса:

  1. Платформенные защиты ONREZA от очевидно вредного трафика.
  2. Пользовательская политика Firewall проекта.
  3. Preview Protection, если запрос идёт к защищённому preview-деплою.
  4. Приложение и его middleware.

Важно: действие allow разрешает запрос только с точки зрения пользовательского Firewall. Оно не отключает платформенные защиты и не обходит Preview Protection.

РежимЧто происходитКогда использовать
shadowONREZA считает, какое действие сработало бы, и показывает это в событиях. Ответ пользователю не меняется.При создании и проверке новых правил.
enforcedeny, defaultAction: deny и превышенные rate_limit-правила начинают менять HTTP-ответ.После проверки симулятором и событиями.

В enforce ONREZA предупреждает перед публикацией опасных вариантов: defaultAction: deny, включённых deny-правил и правил rate_limit.

Dashboard публикует canonical JSON config. YAML ниже — удобный authoring-формат для файлов, редакторов и LLM; перед публикацией перенесите его в canonical JSON config.

# yaml-language-server: $schema=https://docs.onreza.ru/schemas/firewall-policy-v1.schema.json
schemaVersion: 1
mode: shadow
defaultAction: allow
rules:
- id: block-admin-outside-office
name: Block admin outside office
enabled: true
action:
type: deny
statusCode: 403
when:
any:
- all:
- field: request.path
op: prefix
value: /admin
- field: client.ip
op: not_in_cidr
values:
- 203.0.113.0/24

Та же политика в Advanced JSON config:

{
"mode": "SHADOW",
"defaultAction": "ALLOW",
"rules": [
{
"id": "block-admin-outside-office",
"name": "Block admin outside office",
"enabled": true,
"position": 0,
"conditionGroups": [
{
"conditions": [
{ "field": "request.path", "op": "prefix", "value": "/admin" },
{ "field": "client.ip", "op": "not_in_cidr", "values": ["203.0.113.0/24"] }
]
}
],
"action": { "type": "DENY", "statusCode": 403 }
}
]
}

Mapping из YAML в JSON прямой: when.any[] становится conditionGroups[], all[] становится conditions[], порядок rules[] превращается в position, а mode, defaultAction и action.type в JSON пишутся в верхнем регистре.

Эта политика говорит: если путь начинается с /admin и IP не входит в офисный CIDR, запрос будет заблокирован. В режиме shadow ONREZA только покажет в симуляторе и логах, что запрос был бы заблокирован.

Машинно-читаемая схема доступна по стабильному URL:

https://docs.onreza.ru/schemas/firewall-policy-v1.schema.json

Используйте её в YAML-файле, чтобы редакторы и LLM видели полный authoring-контракт:

# yaml-language-server: $schema=https://docs.onreza.ru/schemas/firewall-policy-v1.schema.json
schemaVersion: 1
mode: shadow
defaultAction: allow
rules: []
ПолеЧто означает
schemaVersionВерсия authoring-формата YAML. Сейчас 1.
modeshadow проверяет без блокировки, enforce применяет действия.
defaultActionЧто делать, если ни одно правило не сработало: allow или deny.
rulesСписок правил сверху вниз.

Правила проверяются по порядку. Порядок элементов в rules сохраняется при публикации, поэтому первое совпавшее терминальное действие выигрывает. Если правило выключено (enabled: false), оно пропускается. Если enabled не указан, правило считается включенным.

Изменения Firewall проходят через черновик. Это защищает проект от случайного применения незавершённых правил.

СостояниеЧто означает
ЧерновикИзменения сохранены, но ещё не влияют на опубликованную политику.
Опубликованная версияВерсия, которую ONREZA использует для новых запросов.
Discard draftУдаляет черновик и возвращает редактор к опубликованной версии.
RollbackВозвращает предыдущую опубликованную версию, если новая политика работает не так, как ожидалось.

Если вы публикуете enforce-политику с блокирующими действиями, интерфейс попросит подтвердить публикацию. Это ожидаемая защита от случайной блокировки трафика.

После публикации политики страница проекта показывает последние решения Firewall и краткую сводку:

ПоказательЧто помогает понять
TotalСколько решений попало в текущую выборку.
Would blockСколько запросов было бы заблокировано в shadow.
BlockedСколько запросов реально заблокировано в enforce.
Rate limitedСколько запросов попало под ограничение частоты или было бы ограничено.
Top rulesКакие правила срабатывают чаще всего.

Используйте события так:

  1. Опубликуйте политику в shadow.
  2. Дождитесь реального трафика или проверьте запросы вручную.
  3. Посмотрите, какие правила сработали и какие запросы получили бы блокировку.
  4. Если результат ожидаемый, переключайте политику в enforce.

У каждого правила есть блок when:

when:
any:
- all:
- field: request.path
op: prefix
value: /admin
- field: request.method
op: equals
value: POST
- all:
- field: ua.raw
op: contains
value: curl

Это читается так:

  • any — правило сработает, если совпала хотя бы одна группа.
  • all — внутри группы должны совпасть все условия.
  • Несколько групп в any работают как OR.
  • Несколько условий в all работают как AND.
ПолеПримеры
client.ipIP или CIDR: 203.0.113.10, 203.0.113.0/24
geo.countryISO-код страны: DE, US, RU
geo.continentКонтинент: EU, AS, NA
request.hostapp.example.com
request.path/admin, /api
request.methodGET, POST, DELETE
request.headerHTTP-заголовок по key
request.cookieCookie по key
request.queryQuery-параметр по key
ua.rawИсходный User-Agent
ua.browserНазвание браузера
ua.devicedesktop, mobile, tablet

Для request.header, request.cookie и request.query укажите key:

- field: request.header
key: x-api-client
op: equals
value: mobile
ОператорКогда использовать
equals, not_equalsТочное сравнение
in, not_inЗначение входит или не входит в список
contains, not_containsСтрока содержит подстроку
prefix, suffixПуть, host или строка начинается/заканчивается на значение
regex, not_regexРегулярное выражение
exists, not_existsПоле существует или отсутствует; чаще всего используется для заголовков, cookie и query-параметров
in_cidr, not_in_cidrТолько для client.ip

Для request.header, request.cookie и request.query один ключ может встретиться несколько раз. Если правило защищает доступ к чувствительному endpoint, безопаснее описывать позитивный allow-list (equals или in) вместе с defaultAction: deny, а не строить доступ на not_*-условиях для повторяемых ключей.

action:
type: log

Записывает совпадение и продолжает проверять следующие правила.

schemaVersion: 1
mode: shadow
defaultAction: allow
rules:
- id: block-admin-outside-office
name: Block admin outside office
enabled: true
action:
type: deny
statusCode: 403
when:
any:
- all:
- field: request.path
op: prefix
value: /admin
- field: client.ip
op: not_in_cidr
values:
- 203.0.113.0/24
schemaVersion: 1
mode: shadow
defaultAction: allow
rules:
- id: block-country
name: Block country
enabled: true
action:
type: deny
statusCode: 403
when:
any:
- all:
- field: geo.country
op: in
values: [RU]

Этот сценарий использует defaultAction: deny: всё, что не совпало с allow-правилом, будет заблокировано после публикации в enforce.

schemaVersion: 1
mode: shadow
defaultAction: deny
rules:
- id: allow-office-network
name: Allow office network
enabled: true
action:
type: allow
when:
any:
- all:
- field: client.ip
op: in_cidr
values:
- 203.0.113.0/24
schemaVersion: 1
mode: shadow
defaultAction: allow
rules:
- id: log-cli-user-agents
name: Log CLI user agents
enabled: true
action:
type: log
when:
any:
- all:
- field: ua.raw
op: contains
value: curl
schemaVersion: 1
mode: shadow
defaultAction: allow
rules:
- id: rate-limit-api
name: Rate limit API
enabled: true
action:
type: rate_limit
limit: 120
windowSeconds: 60
key: ip_path
when:
any:
- all:
- field: request.path
op: prefix
value: /api

В shadow события покажут would_rate_limit, когда запрос превысил бы лимит. В enforce такой запрос получит 429.

  1. Откройте Project → Firewall.

  2. Соберите простое правило preset-кнопками или откройте Advanced JSON config для полного canonical config.

  3. Если используете YAML как authoring-формат, проверьте его по JSON Schema и соберите эквивалентный canonical JSON config по mapping выше. Затем сохраните черновик.

  4. Проверьте политику через симулятор: укажите IP, path, method, country и headers.

  5. Сначала опубликуйте в shadow.

  6. Откройте события Firewall и проверьте would block и would rate limit на реальном трафике.

  7. Если результат ожидаемый, переключите mode на enforce и опубликуйте снова.

  8. Подтвердите публикацию, если интерфейс предупреждает о блокирующих действиях.

Перед публикацией политики, которая может блокировать запросы, проверьте список:

ПроверкаПочему важно
Симулятор показывает ожидаемое правилоТак проще поймать ошибку в path, CIDR, country или header.
В событиях нет неожиданных would block или would rate limitРеальный трафик может отличаться от тестового запроса.
Для defaultAction: deny есть нужные allow-правилаИначе проект может закрыться для всех посетителей.
Для rate_limit выбран правильный keyhost ограничивает всех посетителей вместе, а ip_path обычно безопаснее для API.
Preview Protection настроен отдельноFirewall allow не является preview bypass.
Есть план откатаПри ошибке нужно быстро вернуться к предыдущей опубликованной версии.

Если после публикации трафик заблокирован или ограничен

Заголовок раздела «Если после публикации трафик заблокирован или ограничен»
  1. Откройте Project → Firewall.

  2. Посмотрите последние события и найдите правило, которое вернуло blocked или rate_limited.

  3. Если блокировка ошибочная, верните предыдущую опубликованную версию или переключите политику в shadow и опубликуйте.

  4. Исправьте черновик и проверьте его через симулятор.

  5. Опубликуйте исправленную версию только после проверки событий.

ОграничениеЧто это значит
Rate limit локальный для edge-узлаЛимит применяется быстро и без внешнего запроса, но не является точным глобальным лимитом по всем edge-узлам.
Визуальный редактор покрывает пресетыДля allow, log, rate_limit, headers, cookies, query, geo и User-Agent используйте Advanced JSON config.
Нет проверки тела запросаFirewall работает с IP, geo, host, path, method, headers, cookies, query и User-Agent.
Geo и User-Agent не являются личностью пользователяVPN, прокси и подмена User-Agent могут менять результат.
allow не является bypassЗапрос всё равно проходит Preview Protection и платформенные защиты.
Routing Rules остаются отдельноFirewall не делает redirects, rewrites и не управляет HTTP-заголовками ответа.

Если вам нужно ограничить доступ к preview-деплою по логину, паролю или bypass-токену, используйте Preview Protection. Если нужно изменить путь, домен или заголовки ответа, используйте Правила маршрутизации.

Скопируйте этот промпт и замените сценарий на свой:

Ты генерируешь YAML-политику ONREZA Firewall.
Используй только schemaVersion: 1 и JSON Schema:
https://docs.onreza.ru/schemas/firewall-policy-v1.schema.json
Требования:
- mode должен быть shadow, если я явно не прошу enforce.
- defaultAction обычно allow, если я явно не прошу default deny.
- Используй стабильные rule id в kebab-case.
- Не используй JavaScript, язык выражений или поля вне схемы.
- После YAML кратко объясни, какие запросы совпадут с правилами.
Сценарий:
<опишите, что нужно заблокировать или разрешить>