Язык сопоставления, стоящий за политикой firewall. Сопоставляйте вызовы инструментов по имени, навыку, аргументам и назначению — затем allow, audit, deny, sanitize, hold for approval или cap cost. Детерминированный, fail-closed и безопасный на горячем пути.
Политика firewall — это упорядоченный список
правил. Эта страница — полный справочник по тому, что может выразить
правило: язык сопоставления, вердикты и как движок их вычисляет.Правила пишутся в консольном редакторе правил, который записывает
структурированные JSON-объекты сопоставления. Всё ниже описывает этот
словарь, чтобы вы могли читать, рассуждать и точно верифицировать правило —
независимо от того, строите ли вы его в UI или постите через API.
Конфигурация редактирования, используется при verdict = sanitize. См. §5.
egress
object
Список allow/deny по host/CIDR, используется при stage = egress. См. §6.
cap_cost_cents
int
Потолок стоимости прогона, используется при verdict = cap_cost.
sequence
object
Упорядоченное многошаговое сопоставление, применяется реактивно. См. §8.
notes
string
Обоснование автора; игнорируется движком.
Правило совпадает с вызовом инструмента, когда все его объявленные
условия выполняются: стадия совпадает (или пуста), глоб инструмента
совпадает, глоб навыка совпадает (или пуст), клаузы аргументов совпадают
(или отсутствуют), и область egress совпадает (только для egress-правил).
Движок проходит правила в порядке приоритета, и побеждает первое
совпадение.
Намеренно маленькая, чувствительная к регистру грамматика — никаких
сюрпризов regex, линейное время, безопасно на горячем пути ретрансляции:
Паттерн
Совпадает с
"" или *
Каждым инструментом.
foo.*
Префикс — foo.bar, foo.exec (не голым foo).
*.exec
Суффикс — shell.exec, db.exec (не голым exec).
*.shell.*
Инфикс — local.shell.exec (нужен ≥1 символ с каждой стороны).
что-либо ещё
Точное совпадение строки (включая foo.*.bar).
Инструменты по соглашению именуются в пространствах server.tool или
category.action, так что shell.* ловит целое семейство, а *.delete
ловит глагол через серверы.
Та же грамматика глоба, сопоставляемая с навыком-владельцем вызова
инструмента (например, community.*, builtin.send). Она AND-ится с
tool_name_glob, так что:
совпадает с http.fetchтолько когда он принадлежит навыку
community.* — доверяйте тому же инструменту от встроенного навыка,
шлюзуйте его от community-навыка. Пустой глоб навыка совпадает с любым
владельцем. Как вызов инструмента атрибутируется навыку, описано в
Навыках.
Сопоставление имени инструмента отвечает на какой инструмент; клаузы
аргументов отвечают на с какими аргументами — разница между «заблокировать
shell.exec» и «заблокировать shell.exec только когда команда — rm -rf».args_match — это набор клауз, все AND-ятся вместе:
Малое подмножество JSONPath над объектом аргументов инструмента:
$.foo, $.foo.bar — доступ к полю
$.foo[0], $.arr[1].k — индексация массива
$ — весь объект аргументов
Без подстановочных знаков, фильтров, срезов и рекурсивного спуска.
Клаузы аргументов fail closed — правило, а не запрос. Если путь не
разрешается, аргументы искажены или regex/CIDR некорректен, клауза
вычисляется в false, и правило просто не срабатывает — вызов проваливается
к следующему правилу или default-вердикту. Сломанная клауза никогда не
авто-отклоняет и никогда не роняет ретрансляцию. Пишите ваше правило
«поймать всё опасное» как явный deny с собственным глобом, а не полагаясь
на то, что клауза провалится определённым образом.
Консоль валидирует клаузы строго при сохранении (неизвестные операторы,
плохие пути, не-массивные значения in, некомпилируемые regex и
некорректные CIDR — всё отклоняется), так что искажённая клауза вообще не
может быть сохранена.
Вердикт sanitize редактирует совпавшие подстроки из аргументов
инструмента и пересылает очищенный вызов — полезно для удаления секретов
или PII, которые агент поместил в аргумент инструмента, без блокировки
всего действия.
Совпадения пресетов заменяются на [redacted:<preset>]; совпадения
пользовательского regex — на [redacted:custom]. Встроенная библиотека
пресетов:aws_access_key, aws_secret_key, openai_key, anthropic_key,
bearer_token, email, ssn_us, credit_card (с проверкой Луна).Правило sanitize должно объявлять хотя бы один пресет или пользовательский
паттерн — пустой очиститель отклоняется при сохранении. На поверхности
inbound нет аргументов времени вызова для редактирования, так что
вердикт sanitize там эскалирует до блокировки.
Записи совпадают как CIDR, IP-литерал или нечувствительное к регистру имя
хоста; имена хостов разрешаются best-effort и перепроверяются по записям
IP/CIDR. Полярность следует за вердиктом: при вердикте allow список
allow определяет, что в области, а deny вырезает из него исключения;
при применяющем вердикте (deny) список deny определяет, что заблокировано,
а allow вырезает исключения.169.254.169.254 (эндпоинт облачных метаданных) и диапазоны RFC-1918 —
канонические вещи для блокировки; пресет block_ssrf_egress и уровень
автономии tight
поставляют ровно это.
Некоторые риски видны только через несколько вызовов — прочитать 50
записей CRM, затем экспортировать, затем обратиться к внешнему хосту.
Правило sequence совпадает с упорядоченной цепочкой, а не с одиночным
вызовом:
Каждый шаг — это глоб инструмента с опциональным min_count (по умолчанию
и опциональным egress: true (шаг должен быть egress-вызовом). Шаги
должны происходить по порядку — чередование с другими вызовами допустимо —
и вся цепочка должна завершиться в пределах window_seconds (0 = без
ограничения).
Последовательности применяются реактивно асинхронным сопоставителем, а
не inline на каждом вызове — иначе последовательность с шагом *
совпадала бы с каждым вызовом инструмента. Они загораются в ленте событий
и могут запускать последующее действие, но они не блокируют отдельный
вызов, завершающий цепочку, в реальном времени.
Побеждает первое совпадение. Правила выполняются в порядке
priority ASC, id ASC; первое правило, чьи условия все выполняются,
решает вердикт. Ни одно правило не совпало → default_verdict политики.
Детерминированно и без зависимостей. Сопоставление глобов и клауз —
чистые операции над строками/JSON без сетевого вызова, безопасные для
выполнения на каждом вызове инструмента. Regex — это RE2: линейное
время, без катастрофического возврата.
Fail-closed клаузы. Клауза, которую нельзя вычислить, делает своё
правило несрабатывающим, а не авто-отклоняет (§4).
Строгая валидация при сохранении. Сочетания вердикт/стадия,
непустота очистителя, наличие cap_cost_cents, форма клауз и разрешение
ссылок — всё проверяется при сохранении; некорректные правила не могут
быть сохранены.
Аудируется. Каждое создание/обновление/удаление правила пишет строку
аудита после коммита изменения; блобы правил и секреты никогда не
пишутся в лог аудита.
Правила живут под политикой и ограничены рабочим пространством; записи
требуют Developer+.
Метод и путь
Роль
Назначение
POST /api/workspace/firewall/rules
Developer+
Создать правило.
PUT /api/workspace/firewall/rules
Developer+
Обновить правило (id в теле).
DELETE /api/workspace/firewall/rules/:id
Developer+
Удалить правило.
GET /api/workspace/firewall/presets
Member
Список встроенных пресетов.
POST /api/workspace/firewall/test
Developer+
Dry-run политики (правила включены) по образцу вызова инструмента.
Чтобы предпросмотреть правило, прежде чем на него полагаться, используйте
Test — он возвращает вердикт, совпавшее правило и причину, ничего не
диспетчеризуя.
Хотите глубже разобраться в безопасности агентов? Руководства «Защитите агентов — Zero Trust» встраивают эту функцию в рабочий процесс нулевого доверия.
Создайте политику firewall
Напишите политику нулевого доверия шаг за шагом, затем обкатайте её в shadow-режиме перед применением.
Справочник по схеме правил
Каждое поле правила — globs, предикаты аргументов, исходящий трафик и лимиты стоимости.