Изолированный Bash
Песочница Claude Code: включаем изоляцию Bash по шагам
Ставим рантайм песочницы, описываем границы файловой системы и сети в .claude/settings.json — и смотрим, как Claude Code отказывает в чтении вне проекта и спрашивает один раз на каждый новый домен.

Тринадцать шагов со скриншотами — примерно 5 минут чтения. Каждый шаг ссылается на точную секунду исходного видео.
Что песочница меняет на самом деле
Песочница передаёт решение «разрешить или нет» от вас операционной системе. В Linux — и в Ubuntu внутри WSL2 — Claude Code выполняет команды Bash через bubblewrap, а исходящий трафик идёт через прокси; в macOS используется Seatbelt, и ставить ничего не нужно. Границы задаются в .claude/settings.json: какие пути оболочке можно читать и писать и к каким доменам обращаться. Внутри границ команды идут без запросов, так что диалог «разрешить ls?» перестаёт появляться. То, что границу нарушает, либо падает сразу, либо даёт один очень конкретный вопрос: Network request outside of sandbox с именем хоста. И важно: песочница касается только инструмента Bash — Read, Edit и Write по-прежнему подчиняются разрешениям Claude Code.
Откуда эти скриншоты
Страница следует записи экрана Shelly Systems: установка зависимостей, объект sandbox в settings.json, затем живые проверки файловой границы и границы сети прямо из bash-режима.
Кадры взяты из видео и опубликованы с указанием автора; текст — наш. Запись сделана в Ubuntu под WSL2 на Windows, поэтому в терминале показан путь для Linux (bubblewrap и socat). В macOS то же самое сообщение при запуске даёт Seatbelt, и устанавливать нечего. Содержание сверено с видео и документацией Claude Code о песочнице в сентябре 2026 года.
Сначала дайте песочнице чем enforcing
В Linux граница — это настоящая механика ОС: bubblewrap запирает процесс, а socat выносит трафик к прокси. В macOS аналог уже встроен, так что раздел можно пропустить.
- 1
Ставим bubblewrap и socat
В том дистрибутиве Linux, где вы действительно запускаете Claude Code, ставятся два пакета: sudo apt-get install bubblewrap socat. apt разрешает здесь три — bubblewrap, libwrap0 и socat — и сообщает про 472 kB архивов. В macOS весь шаг пропускаем: Seatbelt — часть системы.

Три пакета и 472 kB. Ничего «клавовского» здесь нет: bubblewrap — та же технология, на которой работают Flatpak-приложения.Смотреть с 1:52 - 2
Ставим Claude Code нативным установщиком
После зависимостей ставим сам CLI: curl -fsSL https://claude.ai/install.sh | bash. В записи используют нативный установщик, а не npm; в конспекте сказано, что работают оба пути, но песочнице нужна достаточно свежая сборка Claude Code.

apt заканчивается строками Setting up bubblewrap и Setting up socat, а команда установки уже набрана ниже.Смотреть с 2:16 - 3
Добавляем песочный рантайм Anthropic
Тот же конспект ставит ещё один пакет: npm install -g @anthropic-ai/sandbox-runtime. Это рантайм, в который Claude Code заворачивает инструмент Bash, и его можно использовать отдельно — например, чтобы ограничить MCP-сервер одной папкой. Кадр пойман в момент, когда проектный конфиг ещё не существует: .claude/settings.json открыт и пуст.

Пустой settings.json — честная отправная точка. Дальше его заполнят.Смотреть с 3:10
Описываем границы в settings.json
Один объект sandbox и два вложенных — filesystem и network. Всё поведение сессии дальше строится на том, что вы здесь написали.
- 4
Пишем объект sandbox
Создаём в проекте .claude/settings.json и добавляем ключ sandbox. В записи стоят enabled: true и failIfUnavailable: true — сессия, которой не досталась песочница, отказывается запускаться вместо тихой работы без неё. В filesystem кладут denyRead: ["../"] и allowRead: ["."]: сам проект читать можно, родительскую директорию — нет. Значения двух строк выше (allowUnsandboxedCommands, autoAllowBashIfSandboxed) на этом кадре скрыты миникартой редактора, поэтому мы их не цитируем.

Два массива по одному элементу: allowRead "." и denyRead "../" — на этом вся файловая граница обзора и держится.Смотреть с 4:12 - 5
Перечисляем только нужные домены
Поведение подтверждений задаёт вложенный объект network. В записи allowUnixSockets пустой, allowAllUnixSockets: false и allowLocalBinding: false, а в allowedDomains ровно одна запись — example.com. Трафик уходит через прокси за пределами «клетки», и домен без правила не отбрасывается молча — о нём спрашивают.

Одного разрешённого домена хватает, чтобы показать оба исхода: запрос, который прошёл, и запрос, который встал.Смотреть с 4:20 - 6
Понимаем, куда смотрят значения по умолчанию
В конспекте стартовая позиция описана прямо: чтение по умолчанию доступно везде на машине, запись — только внутри проекта, за исключением нескольких критичных для работы Claude Code файлов. denyRead и allowRead нужны именно для первой половины, потому что она дотягивается до SSH-ключей и .env. Там же совет: хотите закрыть лазейку — ставьте "allowUnsandboxedCommands": false.

Чтение — слабая половина дефолтов, поэтому пример запрещает ../, вместо того чтобы добавлять новые разрешений.Смотреть с 6:56
Запускаем сессию и проверяем, что она в песочнице
Claude Code говорит об этом на первом же экране, а первая же команда это доказывает.
- 7
Запускаем claude и читаем баннер
Стартуем Claude Code в проекте. Здесь в строке версии v2.1.118, а сразу под приветственным блоком сессия печатает Your bash commands will be sandboxed. Disable with /sandbox.. Это и есть проверка: нет баннера — нет песочницы. Прежде чем доверять чему-либо, вернитесь к конфигу и к установке рантайма.

Баннер в одной строке сообщает и то, что вы внутри границы, и то, как из неё выйти.Смотреть с 4:44 - 8
Проверяем файловую границу из bash-режима
Набираем ! cat ../hello.txt, чтобы выполнить команду прямо из приглашения. Файл существует — он открыт в редакторе выше и виден в проводнике на уровне домашней папки, — но изолированная оболочка отвечает cat: ../hello.txt: No such file or directory. Так работает denyRead: ["../"]: путь не спрятан за диалогом, его просто нет.

Отказ в чтении выглядит как отсутствующий файл, а не как запрет. Именно поэтому промпт-инъекции с этим не спорят.Смотреть с 5:56 - 9
Достаём домен, который в списке
! curl "https://example.com" возвращает 528 байт и HTML страницы Example Domain, потому что этот хост — единственная запись в allowedDomains. Следующая строка, ! curl "https://github.com", всё ещё показывает Running... — правила для github.com у прокси нет, поэтому запрос ждёт, а не падает.

Разрешённый трафик тихий. Интерес начинается там, где нет правила ни в одну сторону.Смотреть с 6:12 - 10
Перезапускаем сессию и убеждаемся, что применилось
Шаг 8 в конспекте — та же проверка, которую стоит делать после любой правки настроек: закройте claude и откройте заново, дождитесь сообщения о том, что сессия в песочнице. Конфиг читается на старте, значит правка, после которой баннер так и не появилась, просто не загрузилась.

Некрасиво, но это отдельный шаг: файл настроек о своих ошибках молчит, баннер — нет.Смотреть с 7:26
Запрос на доступ в сеть — и что происходит после
Это то самое подтверждение, заменившее диалоги на каждую команду: один вопрос на домен, который задаёт прокси, а не ваша реакция на автопилоте.
- 11
Отвечаем на запрос о сети
Ожидание заканчивается диалогом другой природы: заголовок Network request outside of sandbox, адрес отдельной строкой Host: и вопрос Do you want to allow this connection?. Дальше три варианта — Yes, Yes, and don’t ask again for github.com и No, and tell Claude what to do differently (esc). Средний вариант и экономит неделю: один раз подтвердив хост, вы больше о нём не слышите.

Важна гранулярность: обещание дано на хост, а не на команду, — и диалог не скатывается обратно в тот поток, от которого вы убегали.Смотреть с 6:18 - 12
Сколько стоит отказ в доступе
На кадре после диалога — таблица переноса из нулевых байт и строка curl: (56) CONNECT tunnel failed, response 403: прокси не открыл туннель, поэтому команда отработала и не получила ничего. Какую именно опцию нажали в видео не показано, так что читаем это как результат отказа, а не как расшифровку клика.

Отказ сессию не убивает. Команда завершается ошибкой, и Claude продолжает работу.Смотреть с 6:26 - 13
Помните, что песочница закрывает не всё
Раздел оговорок стоит процитировать, потому что именно здесь чаще всего ошибаются: Sandboxing only applies to how Claude uses the Bash tool. Встроенные инструменты Read, Edit и Write настраиваются разрешениями Claude Code. Песочница — не коробка вокруг всей сессии, а пол под командами оболочки; для файловых инструментов правила нужны отдельные.

Два слоя принуждения — два конфига. Как писать второй, разбирает страница про разрешения.Смотреть с 7:32