shell.exec в порядке, пока команда не rm -rf, db.query в
порядке, пока он не попадает на prod. Это различие выражает клауза
аргумента: предикат jsonpath для аргумента инструмента,
который совпадает по значениям, которые передаёт агент, так что вердикт
срабатывает только на опасном вызове и оставляет остальные в покое.
Эта страница — кулинарная книга — горстка готовых рецептов args_match_json
для случаев, которые встречаются чаще всего. О полной грамматике клауз,
таблице операторов и семантике fail-closed см.
Проверку аргументов и справочник
Схемы правил.
1. Как работает клауза jsonpath для аргумента инструмента
args_match_json правила — это JSON-кодированная строка, несущая набор
клауз, все объединённые по AND. Декодированное значение — объект,
{"clauses": [ … ]}, где каждая клауза — тройка { path, op, value }:
path— маленькое подмножество JSONPath над объектом аргументов инструмента:$.command,$.foo.bar,$.items[0]или$для всего объекта. Нет wildcard’ов, фильтров, срезов или рекурсивного спуска.op— один из закрытого набора:eq,contains,regex,in,cidr_match,gt,lt.value— литерал для сравнения (строка, число, bool или — дляin— JSON-массив).
tool_name_glob правила: правило срабатывает
только когда имя инструмента совпадает и каждая клауза держится. Опустите
args_match_json целиком (или оставьте его пустым "{}") — и правило
совпадает по глобу в одиночку.
Клаузы fail closed — правило, а не запрос. Если путь не разрешается,
аргументы некорректны или значение неправильного типа, клауза вычисляется в
false, и правило просто не срабатывает — вызов проваливается к следующему
правилу или default-вердикту. Сломанная клауза никогда не авто-отклоняет.
Пишите свой жёсткий backstop как обычный глоб
deny, а не как клаузу, на
которую вы полагаетесь, что она провалится определённым образом.2. Рецепт: заблокировать одну деструктивную команду
Канонический случай. Разрешитьshell.exec в целом, отклонить его только
когда команда выглядит деструктивной. Клауза regex на $.command делает
это:
$.command (или отсутствующий) никогда не
совпадает, так что некорректный вызов проваливается, а не блокируется
ошибочно.
3. Рецепт: отклонить инструмент против названного окружения
Пустьdb.query выполняется, но только против безопасных подключений —
отклоните его, когда цель — prod или replica. Оператор in совпадает с
разрешённым значением против любого элемента JSON-массива:
in должно быть JSON-массивом — не-массив отклоняется, когда вы
сохраняете правило. Элементы сравниваются скалярным равенством, так что числа
и строки каждое совпадает со своим типом.
4. Рецепт: отклонить назначение с приватным IP или metadata
Когда инструмент принимает целевой IP как аргумент,cidr_match проверяет,
попадает ли он внутрь CIDR — SSRF-форма «агент извлекает 10.x или адрес
cloud metadata»:
5. Рецепт: ограничить числовой аргумент
gt и lt сравнивают числа. Используйте их, чтобы отказать в абсурдном
размере пакета, чрезмерном лимите или любом убегающем счётчике — здесь
отклоните bulk-удаление, которое нацелено более чем на 100 строк:
"500" — это
несовпадение типов и не совпадает, так что правило не сработает на
строково-типизированном аргументе. Держите аргумент числовым или нормализуйте
его, прежде чем инструмент его увидит.
6. Рецепт: сочетать клаузы (AND)
Все клаузы в одном правиле объединяются по AND, так что вы можете сузить вердикт до очень конкретного вызова — например, отклонитьshell.exec
только когда это деструктивная команда и она нацелена на prod-хост:
args_match_json — создайте
два правила (или два глоба) на разных приоритетах. Движок проходит правила в
порядке приоритета, и побеждает первое совпадение, так что ставьте узкие
правила первыми. См. Приоритет правил.
7. Выберите вердикт для совпавшей формы
Клауза решает, какие вызовы совпадают;verdict правила решает, что
происходит. deny — дефолт кулинарной книги, но та же клауза может нести
более мягкий вердикт:
sanitize — отредактировать секрет в аргументе
sanitize — отредактировать секрет в аргументе
Когда совпавший аргумент несёт секрет или PII, а не опасную инструкцию,
sanitize редактирует совпавшие подстроки из аргументов инструмента
и пересылает очищенный вызов. Редактирует только аргументы — никогда
содержимое, которое возвращает инструмент. См.
Очистку ответов.pending_approval — удержать совпавший вызов для человека
pending_approval — удержать совпавший вызов для человека
Удержите ровно рискованную форму для разбора вместо прямой блокировки:
ревьюер одобряет или отклоняет вне основного канала, и агент повторно
отправляет одобренный вызов один раз. См.
Подтверждения.
audit — просто увидеть, пока что
audit — просто увидеть, пока что
Установите вердикт в
audit, чтобы записать совпавший вызов без
блокировки, пока вы настраиваете клаузу. Сочетайте с
shadow-режимом, чтобы измерить deny
против живого трафика, прежде чем он что-либо изменит.8. Протестируйте клаузу, прежде чем полагаться на неё
Вкладка Test в консоли прогоняет политику вхолостую против образца вызова инструмента и возвращает вердикт, совпавшее правило и причину — ничего не диспетчеризуется, ничего не сохраняется. Вставьте реалистичный объект аргументов и подтвердите, что клауза срабатывает на вызовах, которые вы имеете в виду, и только на них, поскольку клауза, которая не может разрешить значение, молча не срабатывает. См. Тестирование правил.Клаузы валидируются строго при сохранении — неизвестные операторы, плохие
пути, не-массивное значение
in, некомпилируемый regex и недействительные
CIDR все отклоняются, так что некорректная клауза не может быть сохранена в
принципе.9. Кто может создавать клаузы аргументов
Всё это выполняется в консоли под вашей сессией (/api/workspace/firewall/*):
| Действие | Роль |
|---|---|
| Чтение политик, пресетов, обнаруженных инструментов | Member |
| Создание / редактирование / удаление правил | Developer+ |
| Песочница Test (прогон политики вхолостую) | Developer+ |
| Чтение событий и свёрток прогонов | Developer+ |
Связанное
Проверять аргументы
Use-case сопоставления аргументов целиком.
Блокировать инструменты
Отклонить целый инструмент по имени — клауза не нужна.
Контроль egress
Управлять исходящими host / IP / CIDR назначениями.
Схема правил
Каждое поле, которое может нести правило.
Приоритет правил
Побеждает первое совпадение — упорядочьте узкое перед широким.
Опасные вызовы инструментов
Угроза, которую решают эти рецепты.
