Перейти к основному содержанию
Правило firewall сопоставляет вызов инструмента по двум осям: какой инструмент (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 все совпадают; побеждает первое совпадение.
Правило без клауз args_match совпадает по одному глобу имени инструмента. Добавляйте клаузы аргументов, только когда имя инструмента недостаточно конкретно.

2. Грамматика глоба имени инструмента

tool_name_glob — намеренно маленькая, предсказуемая грамматика, а не полный regex. Паттерны сопоставляются с учётом регистра (имена MCP-инструментов условно lowercase-через-точки, так что свёртка регистра удивила бы вас, когда вы копируете имя со вкладки Discovered tools).
Пустой паттерн или голая * совпадает со всеми инструментами. Используйте на catch-all правиле или положитесь на default_verdict политики вместо этого.
shell.* совпадает с shell.exec, shell.read, shell.write. Оно не совпадает с голым shell (точка обязательна — глоб-префикс покрывает только namespace’нутых детей).
*.exec совпадает с namespace’нутым shell.exec и с голым, не-namespace’нутым exec (provider-нативные вызовы функций и не-namespace’ующие MCP-серверы выставляют инструменты под голым глаголом, так что суффиксное правило покрывает обе формы). Суффикс остаётся заякоренным на точке или начале строки, так что *.exec не совпадает с shell.execute.
*.shell.* совпадает с любой формой <server>.shell.<verb>local.shell.exec, byo.shell.run. Оно требует хотя бы один символ с каждой стороны инфикса, так что *.shell.* не совпадает с голым shell или .shell. отдельно. Только симметричная форма *.X.* трактуется как инфикс; смешанный паттерн вроде foo.*.bar проваливается до точного совпадения.
Любой паттерн, который не один из четырёх wildcard-форм выше (включая буквальное имя инструмента или некорректную комбинацию вроде foo.*.bar), сравнивается как точная строка с учётом регистра.
Нет wildcard’а одного символа ?, нет классов символов и нет * в середине токена (например, sh*l.exec). Паттерн, который не один из четырёх поддерживаемых форм, сопоставляется буквально — sh*l.exec совпадает только с инструментом, буквально названным sh*l.exec. Создавайте формами выше, а не мышечной памятью regex.

3. Клаузы аргументов JSONPath

args_match — это набор клауз, каждая — тройка {path, op, value}. path — это JSONPath в объект аргументов вызова инструмента; op — один из семи операторов; value — то, с чем сравнивать. Все клаузы в правиле соединяются по AND — каждая клауза должна совпасть, чтобы правило сработало.
{
  "clauses": [
    {"path": "$.command", "op": "regex", "value": "rm -rf|drop table"},
    {"path": "$.connection", "op": "in", "value": ["prod", "replica"]}
  ]
}

Поддерживаемое подмножество JSONPath

ФормаСовпадает
$.fooКлюч верхнего уровня.
$.foo.barВложенный ключ.
$.foo[0]Элемент массива по индексу.
$.arr[1].kИндекс, затем ключ (комбинации вышеперечисленного).
Это всё подмножество. Нет wildcard’ов ($.*), фильтров ($.foo[?(...)]), срезов ($.foo[0:2]) или рекурсивного спуска ($..foo).
Fail-closed на пути. Если путь клаузы разрешается в ничто — ключ отсутствует, аргументы не валидный JSON, или значение неправильного типа для оператора — эта клауза вычисляется в false, правило не срабатывает, и вычисление проваливается до следующего правила или default’а политики. Некорректный аргумент никогда не авто-блокирует и никогда не роняет движок.

4. Операторы аргументов

Семь операторов, закрытый набор. Валидатор консоли и живой движок делят ровно тот же словарь, так что клауза, которая сохраняется, — это клауза, которая работает.
ОператорСравниваетПравила типов
eqТочное равенство.Типизировано: строка↔строка, bool↔bool или число↔число. Смешанные типы никогда не совпадают.
containsСодержание подстроки.Обе стороны должны быть строками; что угодно ещё — несовпадение. Пустое значение совпадает с любой строкой.
regexRE2-паттерн (линейное время, без backreferences) против строки.Значение и разрешённый аргумент должны быть строками. Невалидный паттерн отключает клаузу (никогда не совпадает).
inЧленство — значение равно любому элементу списка.Значение должно быть JSON-массивом; каждый элемент сравнивается с семантикой eq.
cidr_matchРазрешённое значение — IP внутри заданной сети.Значение — CIDR-строка (IPv4 или IPv6, например, 10.0.0.0/8, fd00::/8); аргумент должен парситься как IP.
gtБольше-чем, числовое.Обе стороны должны привестись к числу. Числово-выглядящая строка не приводится — это несовпадение типов (несовпадение).
ltМеньше-чем, числовое.То же числово-только правило, что у gt.
gt и lt строго числовые. Если инструмент шлёт {"max_rows": "10000"} (строку), клауза gt 5000 не срабатывает — строка никогда не приводится. Сравнивайте числа с числами; используйте regex или contains для значений в форме строк.

5. Разобранный пример

Заблокировать деструктивный экспорт базы данных, но только когда он нацелен на production-соединение через хост частной сети:
{
  "tool_name_glob": "db.*",
  "args_match": {
    "clauses": [
      {"path": "$.statement", "op": "regex", "value": "(?i)drop|truncate|delete from"},
      {"path": "$.connection.name", "op": "in", "value": ["prod", "prod-replica"]},
      {"path": "$.connection.host_ip", "op": "cidr_match", "value": "10.0.0.0/8"}
    ]
  }
}
Читайте сверху вниз: глоб db.* ограничивает правило семейством инструментов базы данных; три клаузы соединяются по AND, так что вердикт (скажем, deny) срабатывает только, когда statement деструктивен и соединение — одна из двух именованных prod-целей и его хост попадает в частный диапазон 10.0.0.0/8. db.query против dev-соединения на публичном IP проплывает мимо этого правила нетронутым.
Докажите клаузу до того, как доверитесь ей: вкладка Test на политике делает dry-run образца вызова инструмента и показывает совпавшее правило и вердикт, ничего не сохраняя и ничего не диспетчеризуя. См. Наблюдаемость Firewall.

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 и остальные, когда правило совпало.

Почему это было заблокировано?

Проследите конкретную блокировку до сработавшего правила и клаузы.