Изолированный Bash

Песочница Claude Code: включаем изоляцию Bash по шагам

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

Claude Code sandbox approval prompt reading Network request outside of sandbox for host github.com, offering Yes, Yes and do not ask again for github.com, or No and tell Claude what to do differently
Один вопрос на домен: github.com нет в списке разрешённых, поэтому прокси останавливает запрос и спрашивает, вместо того чтобы пропустить его.

Тринадцать шагов со скриншотами — примерно 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. 1

    Ставим bubblewrap и socat

    В том дистрибутиве Linux, где вы действительно запускаете Claude Code, ставятся два пакета: sudo apt-get install bubblewrap socat. apt разрешает здесь три — bubblewrap, libwrap0 и socat — и сообщает про 472 kB архивов. В macOS весь шаг пропускаем: Seatbelt — часть системы.

    Ubuntu terminal installing the Claude Code sandbox dependencies with apt, listing bubblewrap libwrap0 and socat as three newly installed packages beside the guide step 3 Install Sandbox Dependencies
    Три пакета и 472 kB. Ничего «клавовского» здесь нет: bubblewrap — та же технология, на которой работают Flatpak-приложения.Смотреть с 1:52
  2. 2

    Ставим Claude Code нативным установщиком

    После зависимостей ставим сам CLI: curl -fsSL https://claude.ai/install.sh | bash. В записи используют нативный установщик, а не npm; в конспекте сказано, что работают оба пути, но песочнице нужна достаточно свежая сборка Claude Code.

    Ubuntu terminal finishing Setting up bubblewrap and Setting up socat and then running curl -fsSL https://claude.ai/install.sh piped to bash to install Claude Code with its native installer
    apt заканчивается строками Setting up bubblewrap и Setting up socat, а команда установки уже набрана ниже.Смотреть с 2:16
  3. 3

    Добавляем песочный рантайм Anthropic

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

    Claude Code sandboxing notes open in Visual Studio Code showing the npm install -g @anthropic-ai/sandbox-runtime command next to an empty .claude/settings.json file in a WSL workspace
    Пустой settings.json — честная отправная точка. Дальше его заполнят.Смотреть с 3:10

Описываем границы в settings.json

Один объект sandbox и два вложенных — filesystem и network. Всё поведение сессии дальше строится на том, что вы здесь написали.

  1. 4

    Пишем объект sandbox

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

    Claude Code project file .claude/settings.json with the sandbox object open in the editor showing enabled true, failIfUnavailable true and a filesystem block whose denyRead is ../ while allowRead is .
    Два массива по одному элементу: allowRead "." и denyRead "../" — на этом вся файловая граница обзора и держится.Смотреть с 4:12
  2. 5

    Перечисляем только нужные домены

    Поведение подтверждений задаёт вложенный объект network. В записи allowUnixSockets пустой, allowAllUnixSockets: false и allowLocalBinding: false, а в allowedDomains ровно одна запись — example.com. Трафик уходит через прокси за пределами «клетки», и домен без правила не отбрасывается молча — о нём спрашивают.

    Claude Code sandbox network block in settings.json listing allowUnixSockets, allowAllUnixSockets false, allowLocalBinding false and allowedDomains containing the single entry example.com
    Одного разрешённого домена хватает, чтобы показать оба исхода: запрос, который прошёл, и запрос, который встал.Смотреть с 4:20
  3. 6

    Понимаем, куда смотрят значения по умолчанию

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

    Claude Code sandboxing notes explaining the Default Read and Write behavior, that reads are anywhere in the machine while writes are only in the project, and that setting allowUnsandboxedCommands false closes the escape hatch
    Чтение — слабая половина дефолтов, поэтому пример запрещает ../, вместо того чтобы добавлять новые разрешений.Смотреть с 6:56

Запускаем сессию и проверяем, что она в песочнице

Claude Code говорит об этом на первом же экране, а первая же команда это доказывает.

  1. 7

    Запускаем claude и читаем баннер

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

    Claude Code v2.1.118 session in a WSL terminal printing the yellow line Your bash commands will be sandboxed. Disable with /sandbox. under the welcome box and above an empty prompt
    Баннер в одной строке сообщает и то, что вы внутри границы, и то, как из неё выйти.Смотреть с 4:44
  2. 8

    Проверяем файловую границу из bash-режима

    Набираем ! cat ../hello.txt, чтобы выполнить команду прямо из приглашения. Файл существует — он открыт в редакторе выше и виден в проводнике на уровне домашней папки, — но изолированная оболочка отвечает cat: ../hello.txt: No such file or directory. Так работает denyRead: ["../"]: путь не спрятан за диалогом, его просто нет.

    Claude Code bash mode running cat ../hello.txt inside the sandbox and getting cat: ../hello.txt: No such file or directory while the same hello.txt is open in the editor above
    Отказ в чтении выглядит как отсутствующий файл, а не как запрет. Именно поэтому промпт-инъекции с этим не спорят.Смотреть с 5:56
  3. 9

    Достаём домен, который в списке

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

    Claude Code bash mode receiving 528 bytes of Example Domain HTML from curl https://example.com through the sandbox proxy and then starting curl https://github.com which is still running
    Разрешённый трафик тихий. Интерес начинается там, где нет правила ни в одну сторону.Смотреть с 6:12
  4. 10

    Перезапускаем сессию и убеждаемся, что применилось

    Шаг 8 в конспекте — та же проверка, которую стоит делать после любой правки настроек: закройте claude и откройте заново, дождитесь сообщения о том, что сессия в песочнице. Конфиг читается на старте, значит правка, после которой баннер так и не появилась, просто не загрузилась.

    Claude Code sandboxing guide step 8 Verify sandboxing in claude telling the reader to close and reopen claude and look for the message indicating that Claude is sandboxed
    Некрасиво, но это отдельный шаг: файл настроек о своих ошибках молчит, баннер — нет.Смотреть с 7:26

Запрос на доступ в сеть — и что происходит после

Это то самое подтверждение, заменившее диалоги на каждую команду: один вопрос на домен, который задаёт прокси, а не ваша реакция на автопилоте.

  1. 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). Средний вариант и экономит неделю: один раз подтвердив хост, вы больше о нём не слышите.

    Claude Code sandbox approval dialog reading Network request outside of sandbox for host github.com with three choices Yes, Yes and do not ask again for github.com, and No and tell Claude what to do differently
    Важна гранулярность: обещание дано на хост, а не на команду, — и диалог не скатывается обратно в тот поток, от которого вы убегали.Смотреть с 6:18
  2. 12

    Сколько стоит отказ в доступе

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

    Terminal output after a Claude Code sandbox network request is declined, showing curl: (56) CONNECT tunnel failed, response 403 under a transfer table of zero-byte rows
    Отказ сессию не убивает. Команда завершается ошибкой, и Claude продолжает работу.Смотреть с 6:26
  3. 13

    Помните, что песочница закрывает не всё

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

    Claude Code sandboxing Caveats section stating that sandboxing only applies to how Claude uses the Bash tool while the built-in file tools Read, Edit and Write are configured using Claude Permissions instead
    Два слоя принуждения — два конфига. Как писать второй, разбирает страница про разрешения.Смотреть с 7:32

Вопросы, на которые эта страница отвечает