Чем автономнее работает агент, тем острее конфликт: подтверждать каждую команду утомительно, а разрешить всё — страшно. Правила разрешений сопоставляют строку команды с шаблоном, поэтому Bash(rm *) не остановит ни /bin/rm, ни find -delete: правило совпадает с текстом команды, а не с тем, что она делает.
Песочница закрывает зазор иначе. Вы описываете, к каким файлам и доменам команды имеют доступ, и границу обеспечивает операционная система — для каждой Bash-команды и всех её дочерних процессов. Обойти её подбором формулировки нельзя.
Вторая тема урока — про качество кода: команда /security-review проверяет изменения текущей ветки на уязвимости.
Что уже умеем / что добавим
Мы знаем правила разрешений и режимы. Теперь добавим уровень ниже — изоляцию средствами ОС: /sandbox, требования по платформам, два слоя изоляции (файловый и сетевой), режимы одобрения и /security-review.
Что вы узнаете в рамках статьи
- Что даёт песочница и чем она надёжнее правил разрешений
- На каких платформах она работает и что доустановить
- Как настроить файловую и сетевую изоляцию
- Чем режим авто-разрешения отличается от обычных разрешений
- Что проверяет
/security-reviewи каковы границы проверки
Ключевые термины
- Песочница Bash — механизм, ограничивающий доступ команд к файловой системе и сети средствами ОС.
- Seatbelt — встроенный механизм изоляции macOS, на котором работает песочница.
- bubblewrap — утилита изоляции для Linux и WSL2, обеспечивающая файловые ограничения.
- Режим авто-разрешения — режим, в котором команды, поддающиеся изоляции, выполняются без запроса.
dangerouslyDisableSandbox— параметр, которым Claude может повторить команду вне песочницы./security-review— команда проверки изменений текущей ветки на уязвимости.
Включение и платформы
Песочница работает на macOS, Linux и WSL2. Нативная Windows не поддерживается — там Claude Code запускают внутри дистрибутива WSL2.
На macOS ставить ничего не надо: изоляция использует встроенный Seatbelt. На Linux и WSL2 нужны два пакета:
bubblewrap— непривилегированная утилита изоляции для файловых ограничений;socat— релей сетевого трафика через прокси песочницы.
# Ubuntu/Debian
sudo apt-get install bubblewrap socat
# Fedora
sudo dnf install bubblewrap socat
Начинать стоит с команды: её панель сама показывает, чего не хватает:
/sandbox
Панель открывается с тремя вкладками, плюс Dependencies на Linux, если нет опционального seccomp-фильтра:
- Mode — как одобряются изолированные команды;
- Overrides — можно ли упавшим в песочнице командам выполниться без изоляции (
allowUnsandboxedCommands); - Config — итоговые настройки песочницы.
Если видна только вкладка Dependencies — не хватает обязательного пакета. Проверка идёт при старте, поэтому после установки Claude Code нужно перезапустить.
Выбранный режим сохраняется в .claude/settings.local.json. Чтобы включить песочницу во всех проектах, поставьте sandbox.enabled в true в ~/.claude/settings.json.
Поведение по умолчанию: если песочница не может стартовать, Claude Code покажет предупреждение и выполнит команды без изоляции. Чтобы это стало жёсткой ошибкой, поставьте sandbox.failIfUnavailable в true.
Файловая изоляция
По умолчанию команды в песочнице пишут в рабочий каталог, временный каталог сессии и каталоги из --add-dir, /add-dir или permissions.additionalDirectories. Нужна запись за их пределы — лучше расширить границу, чем выводить инструмент из песочницы:
{
"sandbox": {
"enabled": true,
"filesystem": {
"allowWrite": ["~/.kube", "/tmp/build"]
}
}
}
Эти пути обеспечиваются на уровне ОС, поэтому их соблюдают все команды в песочнице и их дочерние процессы.
Есть и обратные правила — denyWrite и denyRead, а allowRead открывает конкретные пути внутри запрещённой области. При пересечении правил чтения побеждает более конкретный путь, причём в обе стороны: запретили домашний каталог и разрешили ~/projects — проект читается; разрешили домашний каталог, но запретили ~/.env — запрет держится, и широкий allow не раскроет секрет незаметно.
Пример, закрывающий домашний каталог, кроме проекта:
{
"sandbox": {
"enabled": true,
"filesystem": {
"denyRead": ["~/"],
"allowRead": ["."]
}
}
}
Важная деталь: класть такое надо в проектный .claude/settings.json — относительный путь . разрешается в корень проекта только там. В ~/.claude/settings.json тот же . укажет на ~/.claude, и файлы проекта останутся заблокированными.
Сетевая изоляция
Второй слой независим от первого: сетевой доступ контролирует прокси снаружи песочницы.
По умолчанию не разрешён ни один домен. При первом обращении к новому домену Claude Code спрашивает подтверждения — или, в auto-режиме, отправляет запрос классификатору. Ответ «Да» разрешает хост до конца сессии; «Да, и больше не спрашивать» сохраняет allow-правило WebFetch(domain:...) в локальные настройки. Чтобы не отвечать вовсе, домены задаются заранее:
{
"sandbox": {
"enabled": true,
"network": {
"allowedDomains": ["github.com", "*.npmjs.org"]
}
}
}
Настройка strictAllowlist в значении true переводит режим из «спрашивать» в «запрещать»: хосты вне списка отклоняются. Задаётся в пользовательских, управляемых настройках или через --settings; в настройках репозитория не действует.
Слои независимы: sandbox.filesystem.disabled выключает файловую изоляцию, оставляя сетевую.
Два режима одобрения
Режимов два, и оба обеспечивают одинаковые файловые и сетевые ограничения. Разница только в том, нужно ли подтверждать команды.
Авто-разрешение. Команда, которую можно изолировать, выполняется в песочнице и одобряется автоматически. Остальные уходят в обычный поток разрешений. Даже здесь продолжают действовать:
- явные deny-правила — соблюдаются всегда;
rmиrmdirна критических путях — идут через обычный поток;- ask-правила с областью по содержимому вроде
Bash(git push *).
Обычные разрешения. Все Bash-команды идут через обычный поток, даже изолированные. Больше контроля, больше подтверждений.
Есть и запасной выход. Некоторые команды в песочнице не работают вовсе: Claude Code сообщает о нарушении изоляции, называя заблокированный путь или хост, и Claude может повторить команду с параметром dangerouslyDisableSandbox — вне песочницы и потому через обычный поток разрешений. Отключается выход настройкой "allowUnsandboxedCommands": false — на вкладке Overrides это Strict sandbox mode. Тогда всё должно либо выполняться в песочнице, либо быть перечислено в excludedCommands.
/security-review: проверка изменений
Эта команда запускается вручную:
/security-review
Она делает разовый проход по изменениям текущей ветки, проверяя дифф на уязвимости.
Границы стоит понимать точно: не репозиторий целиком, а только изменения ветки; читается исходный код в вашем чекауте — не работающий сайт и не задеплоенный сервис. Нужно проверить код, который у вас уже есть, — попросите Claude проверить конкретный файл или каталог.
Куда /security-review встаёт в общий ряд:
| Стадия | Инструмент | Что покрывает |
|---|---|---|
| В сессии | Плагин security-guidance |
Типовые уязвимости в коде, который пишет Claude, с починкой в той же сессии |
| По требованию | /security-review |
Разовый проход по изменениям текущей ветки |
| В CI | Ваши статические анализаторы | Языковые правила и проверки цепочки поставок |
Плагин security-guidance из официального marketplace дополняет команду: он работает автоматически и проверяет изменения на трёх уровнях — сопоставление с образцами после каждой правки, фоновый обзор диффа в конце хода, глубокий разбор при коммите или пуше.
/plugin install security-guidance@claude-plugins-official
Оговорка: ни один из слоёв не блокирует запись и коммит. Находки приходят к Claude как инструкции, и модель обзора может что-то пропустить. Это защита в глубину, а не полное решение.
Частые ошибки
- Считать, что песочница есть везде. На нативной Windows она не поддерживается — нужен WSL2. На Linux и WSL2 требуются
bubblewrapиsocat, без них панель покажет только Dependencies. - Не заметить тихий откат. Если песочница не стартовала, Claude Code предупреждает и выполняет команды без изоляции. Для жёсткого отказа нужен
sandbox.failIfUnavailable. - Класть правило с путём
.в пользовательские настройки. Относительный путь разрешается в корень проекта только в проектных настройках; в~/.claude/settings.jsonон укажет на~/.claude. - Ждать от
/security-reviewпроверки всего репозитория. Она покрывает только изменения текущей ветки. Для остального кода просите проверить конкретный файл или каталог.
Наиболее частые вопросы
- Чем песочница надёжнее правил разрешений? — Правила сопоставляют строку команды с шаблоном, поэтому
Bash(rm *)не остановит/bin/rm. Песочница обеспечивается ОС для команды и дочерних процессов. - Куда пишут изолированные команды по умолчанию? — В рабочий каталог, временный каталог сессии и каталоги из
-add-dirилиpermissions.additionalDirectories. - Сколько доменов разрешено изначально? — Ни одного. При первом обращении Claude Code спросит подтверждения; заранее домены задаются через
network.allowedDomains. - Работают ли deny-правила в режиме авто-разрешения? — Да, явные deny-правила соблюдаются всегда, как и ask-правила с областью по содержимому.
- Можно ли запретить выход из песочницы? — Да, настройкой
"allowUnsandboxedCommands": false. На вкладке Overrides это Strict sandbox mode.
Итоги
Отличная работа: вы добрались до уровня, где границы обеспечивает не договорённость, а операционная система. Вы умеете включать песочницу и знаете её требования по платформам, настраиваете файловые правила с учётом того, что более конкретный путь побеждает, задаёте разрешённые домены, различаете два режима одобрения и знаете границы применимости /security-review.
Запомните неочевидное: по умолчанию неудачный старт песочницы приводит не к отказу, а к выполнению без изоляции. Полагаетесь на неё как на гарантию — включайте failIfUnavailable.
Остались два урока про диагностику: что делать, когда настроено вроде бы всё, а работает не так. На следующем разберём /doctor, /permissions и другие команды, показывающие, что на самом деле загрузилось в сессию.