tool_name_glob) и какие аргументы (клаузы
args_match над полями JSONPath). Эта страница —
точная грамматика для обоих: что паттерн совпадает, что нет, и как каждый
оператор приводит типы — так что правило, которое вы создаёте в консоли, ведёт
себя ровно так, как вы читаете его здесь.
Главный use-case: превратить тупое «заблокировать shell.exec» в хирургическое
«заблокировать shell.exec только когда команда выглядит как rm -rf». Глоб
выбирает семейство инструментов; операторы аргументов выбирают опасный вызов
внутри него.
Это справочник синтаксиса. О том, где эти клаузы живут на правиле, упорядочении
правил и вердиктах см. глубокий справочник
Правила Firewall. О самих полях правила см. обзор
Firewall.
1. Где применяется этот синтаксис
Обе формы создаются на правиле firewall, в консоли под/console/firewall
(записи требуют Developer+). Вы никогда не вызываете матчер напрямую — шлюз
вычисляет его на каждом вызове инструмента против
разрешённой политики. Правило
совпадает, когда его поверхность, его tool_name_glob, его опциональный глоб
навыка и его клаузы args_match все совпадают; побеждает первое
совпадение.
2. Грамматика глоба имени инструмента
tool_name_glob — намеренно маленькая, предсказуемая грамматика, а не полный
regex. Паттерны сопоставляются с учётом регистра (имена MCP-инструментов
условно lowercase-через-точки, так что свёртка регистра удивила бы вас, когда вы
копируете имя со вкладки Discovered tools).
* (или пусто) — совпасть с каждым инструментом
* (или пусто) — совпасть с каждым инструментом
Пустой паттерн или голая
* совпадает со всеми инструментами. Используйте на
catch-all правиле или положитесь на default_verdict политики вместо этого.foo.* — совпадение по префиксу
foo.* — совпадение по префиксу
shell.* совпадает с shell.exec, shell.read, shell.write. Оно не
совпадает с голым shell (точка обязательна — глоб-префикс покрывает только
namespace’нутых детей).*.exec — совпадение по суффиксу
*.exec — совпадение по суффиксу
*.exec совпадает с namespace’нутым shell.exec и с голым,
не-namespace’нутым exec (provider-нативные вызовы функций и
не-namespace’ующие MCP-серверы выставляют инструменты под голым глаголом, так
что суффиксное правило покрывает обе формы). Суффикс остаётся заякоренным на
точке или начале строки, так что *.exec не совпадает с shell.execute.*.X.* — серединное (инфиксное) совпадение
*.X.* — серединное (инфиксное) совпадение
*.shell.* совпадает с любой формой <server>.shell.<verb> —
local.shell.exec, byo.shell.run. Оно требует хотя бы один символ с каждой
стороны инфикса, так что *.shell.* не совпадает с голым shell или
.shell. отдельно. Только симметричная форма *.X.* трактуется как инфикс;
смешанный паттерн вроде foo.*.bar проваливается до точного совпадения.что угодно ещё — точное совпадение
что угодно ещё — точное совпадение
Любой паттерн, который не один из четырёх wildcard-форм выше (включая
буквальное имя инструмента или некорректную комбинацию вроде
foo.*.bar),
сравнивается как точная строка с учётом регистра.3. Клаузы аргументов JSONPath
args_match — это набор клауз, каждая — тройка {path, op, value}. path —
это JSONPath в объект аргументов вызова инструмента; op — один из семи
операторов; value — то, с чем сравнивать. Все клаузы в правиле соединяются по
AND — каждая клауза должна совпасть, чтобы правило сработало.
Поддерживаемое подмножество JSONPath
| Форма | Совпадает |
|---|---|
$.foo | Ключ верхнего уровня. |
$.foo.bar | Вложенный ключ. |
$.foo[0] | Элемент массива по индексу. |
$.arr[1].k | Индекс, затем ключ (комбинации вышеперечисленного). |
$.*), фильтров ($.foo[?(...)]),
срезов ($.foo[0:2]) или рекурсивного спуска ($..foo).
Fail-closed на пути. Если путь клаузы разрешается в ничто — ключ отсутствует,
аргументы не валидный JSON, или значение неправильного типа для оператора — эта
клауза вычисляется в false, правило не срабатывает, и вычисление
проваливается до следующего правила или default’а политики. Некорректный аргумент
никогда не авто-блокирует и никогда не роняет движок.
4. Операторы аргументов
Семь операторов, закрытый набор. Валидатор консоли и живой движок делят ровно тот же словарь, так что клауза, которая сохраняется, — это клауза, которая работает.| Оператор | Сравнивает | Правила типов |
|---|---|---|
eq | Точное равенство. | Типизировано: строка↔строка, bool↔bool или число↔число. Смешанные типы никогда не совпадают. |
contains | Содержание подстроки. | Обе стороны должны быть строками; что угодно ещё — несовпадение. Пустое значение совпадает с любой строкой. |
regex | RE2-паттерн (линейное время, без backreferences) против строки. | Значение и разрешённый аргумент должны быть строками. Невалидный паттерн отключает клаузу (никогда не совпадает). |
in | Членство — значение равно любому элементу списка. | Значение должно быть JSON-массивом; каждый элемент сравнивается с семантикой eq. |
cidr_match | Разрешённое значение — IP внутри заданной сети. | Значение — CIDR-строка (IPv4 или IPv6, например, 10.0.0.0/8, fd00::/8); аргумент должен парситься как IP. |
gt | Больше-чем, числовое. | Обе стороны должны привестись к числу. Числово-выглядящая строка не приводится — это несовпадение типов (несовпадение). |
lt | Меньше-чем, числовое. | То же числово-только правило, что у gt. |
5. Разобранный пример
Заблокировать деструктивный экспорт базы данных, но только когда он нацелен на production-соединение через хост частной сети:db.* ограничивает правило семейством инструментов базы
данных; три клаузы соединяются по AND, так что вердикт (скажем, deny)
срабатывает только, когда statement деструктивен и соединение — одна из
двух именованных prod-целей и его хост попадает в частный диапазон
10.0.0.0/8. db.query против dev-соединения на публичном IP проплывает мимо
этого правила нетронутым.
6. Egress-правила (host / CIDR)
Операторcidr_match выше совпадает с IP, который инструмент сообщает в своих
аргументах. Это отличается от правила поверхности egress, которое вычисляет
исходящее назначение, которого инструмент реально достигает, с allow- или
deny-списком host/CIDR — основная защита от SSRF и
эксфильтрации данных. Egress-правила
используют ту же CIDR-нотацию, но живут на поверхности egress; см.
Правила Firewall для формата egress-списка.
Ни один пресет не поставляет вам CIDR egress-правила — уровень автономии
tight
блокирует распространённые имена инструментов в форме fetch (http_fetch,
fetch_url, web_search, request), а не сетевые диапазоны. Создавайте своё
собственное deny-правило host/CIDR, когда вам нужно прибить egress к конкретным
назначениям.7. Быстрая справка
Формы глобов
* все · foo.* префикс · *.exec суффикс (+ голый глагол) · *.X.*
инфикс · что угодно ещё точно. С учётом регистра.JSONPath
$.foo · $.foo.bar · $.foo[0] · $.arr[1].k. Нет wildcard’ов,
фильтров, срезов или рекурсивного спуска.Строковые операторы
eq (типизированный) · contains (подстрока) · regex (RE2) ·
in (членство в списке).Числовые и сетевые операторы
gt / lt (только числовые, без приведения строк) · cidr_match
(IPv4/IPv6 в диапазоне).Связанное
Правила Firewall
Полная модель правил — поверхности, упорядочение, очистители,
последовательности и egress-списки.
Опасные вызовы инструментов
Угроза, от которой защищают эти клаузы, и как ограничить правило ею.
Глоссарий вердиктов
Что делают
allow, audit, deny, sanitize и остальные, когда правило
совпало.Почему это было заблокировано?
Проследите конкретную блокировку до сработавшего правила и клаузы.
