Настройка изолированного инструмента Bash
Узнайте, как изолированный инструмент Bash в Claude Code обеспечивает изоляцию файловой системы и сети для более безопасного и автономного выполнения агента.
Bash sandbox позволяет Claude выполнять большинство команд оболочки без остановки для запроса разрешения. Вместо одобрения каждой команды вы определяете, какие файлы и сетевые домены могут использовать команды, и операционная система применяет эту границу для каждой команды Bash и её дочерних процессов.
Для сравнения других подходов к изоляции, таких как dev containers, пользовательские контейнеры и виртуальные машины, см. Sandbox environments. Чтобы уменьшить количество запросов разрешений для инструментов, отличных от Bash, см. permission modes.
Начало работы
Sandbox встроен в Claude Code и работает на macOS, Linux и WSL2. Нативная Windows не поддерживается. На Windows запустите Claude Code внутри дистрибьютива WSL2.
На macOS нет необходимости в установке: sandboxing использует встроенную платформу Seatbelt. На Linux и WSL2 sandbox зависит от двух пакетов, описанных в разделе Настройка Linux и WSL2. Даже если вы их ещё не установили, вы можете начать с /sandbox, так как его панель показывает, что-либо отсутствует.
Запустите /sandbox
Начните сеанс Claude Code и выполните команду /sandbox:
/sandbox
Это открывает панель sandbox с тремя вкладками, плюс вкладка Dependencies на Linux, когда отсутствует опциональный фильтр seccomp:
- Mode: выберите способ одобрения изолированных команд, описанный на следующем шаге
- Overrides: выберите, могут ли команды, которые не работают в sandbox, вернуться к выполнению без изоляции. Это параметр
allowUnsandboxedCommands - Config: просмотрите разрешённые параметры sandbox
Если панель показывает только вкладку Dependencies, отсутствует требуемый пакет. Установите его, как описано в разделе Настройка Linux и WSL2, перезагрузите Claude Code и снова выполните /sandbox.
Выберите режим
На вкладке Mode выберите автоматическое разрешение или обычные разрешения. Автоматическое разрешение выполняет изолированные команды без запроса, а обычные разрешения сохраняют обычные запросы разрешений даже когда команды изолированы. См. Sandbox modes для информации о том, какие команды всё ещё требуют запроса в режиме автоматического разрешения.
Выполните команду Bash
Попросите Claude выполнить команду, например сборку или набор тестов. По умолчанию команды внутри sandbox могут писать в рабочий каталог, каталог временных файлов сеанса и любые каталоги, которые вы добавили с помощью --add-dir, /add-dir или permissions.additionalDirectories. Первый раз, когда команде требуется новый сетевой домен, Claude Code запрашивает одобрение, или в режиме auto отправляет запрос классификатору.
Команды, которые не могут выполняться в sandbox, возвращаются к обычному потоку разрешений. Claude Code озаглавливает их запрос разрешения как "Bash command (unsandboxed)" вместо "Bash command", чтобы вы могли определить, какие команды выполнялись вне sandbox. Чтобы расширить или сузить эти границы, см. Настройка sandboxing.
Если изолированные команды не работают с ошибкой Operation not permitted внутри контейнера, см. запись Bubblewrap в разделе Troubleshooting.
Выбор режима на панели записывает в локальные параметры вашего проекта в .claude/settings.local.json, которые применяются к текущему проекту. Claude Code добавляет этот файл в вашу глобальную gitignore при сохранении параметра там. Чтобы включить sandbox во всех ваших проектах, установите sandbox.enabled в true в ваших пользовательских параметрах в ~/.claude/settings.json. Чтобы применить sandboxing для каждого разработчика в организации, используйте управляемые параметры.
Чтобы изменить sandbox для одного сеанса без записи в файл параметров, запустите Claude Code с --settings. Например, эта команда запускает изолированный сеанс, в котором Claude не может повторить заблокированную команду вне sandbox:
claude --settings '{"sandbox": {"enabled": true, "allowUnsandboxedCommands": false}}'
По умолчанию, если sandbox не может запуститься из-за отсутствия зависимостей или неподдерживаемой платформы, Claude Code показывает предупреждение и выполняет команды без sandboxing. Чтобы сделать это жёстким отказом, установите sandbox.failIfUnavailable в true. Это предназначено для управляемых развёртываний, которые требуют sandboxing в качестве шлюза безопасности.
Настройка Linux и WSL2
На Linux и WSL2 sandbox зависит от двух пакетов:
bubblewrap: инструмент непривилегированной изоляции, который применяет изоляцию файловой системыsocat: ретранслятор, используемый для маршрутизации сетевого трафика через прокси sandbox
Установите их с помощью менеджера пакетов вашего дистрибьютива:
sudo apt-get install bubblewrap socat
sudo dnf install bubblewrap socat
Когда зависимость отсутствует, вкладка Dependencies в /sandbox показывает, какие из ripgrep, bubblewrap, socat и фильтра seccomp отсутствуют на вашей платформе. Если вы не видите вкладку после установки и перезагрузки Claude Code, все зависимости присутствуют.
Ripgrep поставляется в комплекте с нативным двоичным файлом Claude Code. Фильтр seccomp является опциональным и добавляет блокировку Unix domain socket. Установите его с помощью npm install -g @anthropic-ai/sandbox-runtime, если он отсутствует.
Когда отсутствует требуемая зависимость, вкладка Dependencies является единственной показываемой вкладкой до её установки. Когда отсутствует только опциональный фильтр seccomp, вкладка Dependencies появляется наряду с другими вкладками. Проверка зависимостей выполняется при запуске, поэтому перезагрузите Claude Code после установки пакетов, чтобы /sandbox их обнаружил.
Чтобы проверить, применяется ли это ограничение в вашей среде, включая внутри WSL2, выполните `sysctl kernel.apparmor_restrict_unprivileged_userns`. Если команда возвращает `0`, пропустите этот шаг. Если она выводит ошибку `No such file or directory`, ключ не существует и вы можете пропустить этот шаг. Если она возвращает `1`, добавьте профиль AppArmor, который предоставляет `bwrap` эту возможность:
```bash theme={null}
sudo tee /etc/apparmor.d/bwrap > /dev/null <<'EOF'
abi <abi/4.0>,
include <tunables/global>
profile bwrap /usr/bin/bwrap flags=(unconfined) {
userns,
include if exists <local/bwrap>
}
EOF
```
Профиль применяется только к самому `bwrap`, а не к командам, которые он выполняет внутри sandbox. Перезагрузите AppArmor, чтобы применить его:
```bash theme={null}
sudo systemctl reload apparmor
```
Примечания WSL2
Проверьте версию WSL с помощью wsl -l -v из PowerShell. Если вы видите Sandboxing requires WSL2, ваш дистрибьютив работает на WSL1. Обновите его на WSL2 или запустите Claude Code без sandboxing.
На WSL2 WSL передаёт запуск двоичного файла Windows, такого как cmd.exe, powershell.exe или что-либо под /mnt/c/, хосту Windows через Unix socket, поэтому то, может ли изолированная команда запустить один из них, следует параметрам sandbox для Unix-socket: опциональный фильтр seccomp должен быть установлен, чтобы в первую очередь заблокировать socket. Чтобы разрешить эти запуски, установите allowAllUnixSockets; чтобы полностью исключить их из sandbox, добавьте команду в excludedCommands.
Режимы sandbox
Claude Code предлагает два режима sandbox. В обоих sandbox применяет одни и те же ограничения файловой системы и сети; разница только в том, разрешены ли изолированные команды автоматически или требуют явного разрешения.
Режим автоматического разрешения
Когда команда может быть изолирована, Claude Code выполняет её внутри sandbox и автоматически разрешает её без запроса вашего разрешения. Команды, которые не могут быть изолированы, такие как те, которые требуют сетевого доступа к неразрешённым хостам, возвращаются к обычному потоку разрешений, где Claude Code проверяет ваши правила разрешений и запрашивает у вас разрешение для любой команды, которую эти правила не разрешают, с запросом в режиме Manual.
Даже в режиме автоматического разрешения применяется следующее:
- Явные правила отказа всегда соблюдаются
- Команды
rmилиrmdir, которые нацелены на критический путь, по-прежнему вызывают обычный поток разрешений - Правила ask с областью действия контента, такие как
Bash(git push *), по-прежнему требуют запроса даже для изолированных команд - Простое правило
Bashask, или эквивалентная формаBash(*), пропускается для команд, которые выполняются в изолированном режиме; оно по-прежнему применяется к командам, которые возвращаются к обычному потоку разрешений. В режиме plan правило не пропускается: оно запрашивает разрешение для изолированных команд, включая команды только для чтения. До версии 2.1.212 пропуск применялся и в режиме plan
Режим автоматического разрешения работает независимо от вашего параметра режима разрешений, с одним исключением: режим plan. Даже если вы не находитесь в режиме "принять правки", изолированные команды Bash выполняются автоматически при включении автоматического разрешения. Это означает, что команды Bash, которые изменяют файлы в границах sandbox, выполняются без запроса, даже в режиме Manual, где инструменты редактирования файлов запрашивали бы разрешение.
В режиме plan автоматическое разрешение не расширяет одобрения; см. режим plan для информации о том, как Claude Code управляет командами во время планирования. До версии 2.1.212 автоматическое разрешение выполняло изолированные команды без запроса и в режиме plan.
Режим обычных разрешений
Все команды Bash проходят через обычный поток разрешений, даже когда они изолированы. Это обеспечивает больше контроля, но требует больше одобрений.
Механизм выхода для неизолированного повтора
Некоторые команды вообще не могут выполняться внутри sandbox, такие как инструменты, несовместимые с ним, или те, которые требуют хоста, который вы не разрешили. Claude Code сообщает о нарушениях sandbox в результате заблокированной команды, называя путь или хост, который sandbox отклонил, чтобы Claude видел, что sandbox заблокировал. Вместо того чтобы не выполнить задачу или потребовать отключения sandboxing, Claude Code включает механизм выхода: Claude анализирует нарушение и может повторить команду с параметром dangerouslyDisableSandbox.
Повторная команда выполняется вне sandbox, поэтому она проходит через обычный поток разрешений. В режиме Manual вы получаете запрос подтверждения. В режиме auto классификатор оценивает базовую команду. Пока permissions.blockReadsOutsideWorkingDirectories включен, повтор, который требует одобрения для выполнения вне sandbox, запрашивает у вас разрешение вместо этого. Чтобы получить запрос на каждый неизолированный повтор даже в режиме auto, добавьте правило ask для Bash(dangerouslyDisableSandbox:true).
Вы можете отключить этот механизм выхода, установив "allowUnsandboxedCommands": false в ваши параметры sandbox. При отключении механизма выхода Claude Code игнорирует параметр dangerouslyDisableSandbox, и каждая команда, которую выполняет Claude, должна выполняться в sandbox, если только вы не указали её в excludedCommands. Вкладка Overrides в /sandbox показывает этот параметр как Strict sandbox mode.
Режим strict sandbox применяется к командам, которые выполняет Claude. Команды, которые вы вводите сами в приглашение shell-mode с префиксом !, выполняются вне sandbox, если только сеанс не является одним из следующих:
- Фоновый сеанс: режим strict sandbox охватывает и команды shell-mode
- Сеанс Linux с установленной переменной
CLAUDE_CODE_SUBPROCESS_ENV_SCRUB: каждая команда выполняется в sandbox, включая команды shell-mode
До версии 2.1.260 режим strict sandbox изолировал команды shell-mode в каждом сеансе.
Временные каталоги
Каталог временных файлов сеанса доступен для записи внутри sandbox по умолчанию, наряду с рабочим каталогом. Если вы не отключите изоляцию файловой системы, Claude Code устанавливает $TMPDIR в этот каталог для изолированных команд, поэтому инструменты, которые записывают временные файлы, работают без дополнительной конфигурации. Неизолированные команды наследуют $TMPDIR вашей оболочки без изменений, поэтому пока изоляция файловой системы включена, изолированные и неизолированные команды разрешают $TMPDIR в разные каталоги. Чтобы передавать временные файлы между ними, записывайте их в рабочий каталог вместо этого.
Настройка sandboxing
Настройте поведение sandbox через ваш файл settings.json. Полную справку по конфигурации см. в разделе Settings.
По умолчанию изолированные команды могут писать в текущий рабочий каталог, временный каталог сеанса и любые каталоги, которые вы добавили с помощью --add-dir, /add-dir или permissions.additionalDirectories. Если команды подпроцесса, такие как kubectl, terraform или npm, должны писать вне этих каталогов, используйте sandbox.filesystem.allowWrite для предоставления доступа к определённым путям:
{
"sandbox": {
"enabled": true,
"filesystem": {
"allowWrite": ["~/.kube", "/tmp/build"]
}
}
}
Эти пути применяются на уровне ОС, поэтому все команды, работающие внутри sandbox, включая их дочерние процессы, соблюдают их. Это рекомендуемый подход, когда инструменту требуется доступ на запись к определённому местоположению, вместо полного исключения инструмента из sandbox с помощью excludedCommands.
Когда один и тот же массив файловой системы определён в нескольких областях параметров, Claude Code объединяет их, комбинируя пути из каждой области, а не заменяя массив одной области на массив другой.
Если вы исключите источник с помощью --setting-sources в CLI или settingSources в Agent SDK, Claude Code игнорирует его записи sandbox.filesystem, его правила разрешения Edit и его правила отказа Read при построении конфигурации sandbox. Требуется Claude Code v2.1.246 или позже.
Когда вы редактируете эти списки файловой системы во время сеанса, Claude Code применяет изменение к работающему сеансу, поэтому следующая изолированная команда выполняется под новыми путями.
Префиксы пути контролируют способ разрешения путей:
| Префикс | Значение | Пример |
|---|---|---|
/ |
Абсолютный путь от корня файловой системы | /tmp/build остаётся /tmp/build |
~/ |
Относительно домашнего каталога | ~/.kube становится $HOME/.kube |
./ или без префикса |
Относительно корня проекта для параметров проекта или к ~/.claude для параметров пользователя |
./output в .claude/settings.json разрешается в <project-root>/output |
Этот синтаксис отличается от правил разрешений Read и Edit, которые используют //path для абсолютных и /path для относительных к проекту. Пути файловой системы sandbox используют стандартные соглашения: /tmp/build — это абсолютный путь. О том, как Claude Code обрабатывает завершающий слэш или подстановочный знак в этих путях, см. Префиксы путей Sandbox.
Вы также можете запретить доступ на запись или чтение, используя sandbox.filesystem.denyWrite и sandbox.filesystem.denyRead, и повторно разрешить определённые пути в запрещённой области, используя sandbox.filesystem.allowRead. Когда правила чтения перекрываются, более специфичный путь побеждает:
| Примеры правил | Результат |
|---|---|
"denyRead": ["~/"] с "allowRead": ["~/projects"] |
~/projects доступен для чтения, а остальная часть домашнего каталога остаётся заблокирована. Более узкое разрешение повторно открывает эту часть запрещённой области |
"allowRead": ["~/"] с "denyRead": ["~/.env"] |
~/.env остаётся заблокирован, а остальная часть домашнего каталога доступна для чтения. Точный запрет действует внутри более широкого разрешения, поэтому широкое разрешение не может скрытно повторно открыть секрет |
"allowRead": ["~/"] с "denyRead": ["~/**/.env"] |
Каждый .env под домашним каталогом остаётся заблокирован, а остальное доступно для чтения. Подстановочный запрет действует внутри более широкого разрешения так же, как точный путь |
Пример ниже блокирует чтение из всего домашнего каталога, но при этом разрешает чтение из текущего проекта. Поместите его в .claude/settings.json вашего проекта, потому что относительный путь . разрешается в корень проекта только когда конфигурация находится в параметрах проекта:
{
"sandbox": {
"enabled": true,
"filesystem": {
"denyRead": ["~/"],
"allowRead": ["."]
}
}
}
Если вы поместили ту же конфигурацию в ~/.claude/settings.json, . разрешился бы в ~/.claude вместо этого, и файлы проекта остались бы заблокированы правилом denyRead.
Чтобы запретить изолированным командам доступ на чтение к домашним каталогам и смонтированным томам, сохраняя при этом доступность рабочих каталогов, установите permissions.blockReadsOutsideWorkingDirectories вместо написания правил пути.
Отключение изоляции файловой системы
Установите sandbox.filesystem.disabled в true, чтобы пропустить изоляцию файловой системы, сохраняя при этом изоляцию сети. Пример ниже отключает изоляцию файловой системы, сохраняя список разрешённых доменов сети:
{
"sandbox": {
"enabled": true,
"filesystem": {
"disabled": true
},
"network": {
"allowedDomains": ["github.com", "*.npmjs.org"]
}
}
}
Sandbox имеет два независимых слоя: изоляция файловой системы контролирует, какие пути могут читать и писать изолированные команды, и изоляция сети контролирует, какие домены они могут достичь. С отключённым слоем файловой системы изолированные команды получают неограниченный доступ на чтение и запись к файловой системе хоста, в то время как их исходящий трафик сети остаётся ограниченным вашими разрешёнными доменами. Отключите слой, когда вы используете sandbox для контроля того, где команды подключаются, а не того, что они пишут.
Параметр отключён по умолчанию и применяется на платформах, где работает sandbox: macOS, Linux и WSL2. Требуется Claude Code v2.1.216 или позже.
С отключённой изоляцией файловой системы и автоматически разрешёнными командами изолированная команда может писать файлы, которые позже выполняют или читают другие команды, такие как файлы запуска оболочки, исполняемые файлы на $PATH или ~/.claude/settings.json, и использовать их для расширения собственного доступа при следующем запуске. Установите filesystem.disabled в true только для рабочих нагрузок, которым вы доверяете не расширять собственный доступ. Блокировка доменов сети с помощью allowManagedDomainsOnly сужает риск, но не устраняет его, поскольку эта блокировка применяется только к командам, работающим внутри sandbox.
Какие параметры могут отключить это
Поскольку отключение изоляции файловой системы расширяет возможности изолированных команд, Claude Code соблюдает filesystem.disabled только из этих источников параметров:
- Параметры пользователя, управляемые параметры и флаг CLI
--settingsмогут установить его. Параметры проекта в.claude/settings.jsonи.claude/settings.local.jsonне могут, поэтому проверенный проект не может отключить изоляцию файловой системы. - Когда управляемые параметры конфигурируют
sandbox.filesystemвообще или перечисляют любую записьsandbox.credentials.filesс"mode": "deny", только управляемые параметры могут установить ключ. Это сохраняет ограничения файловой системы, развёрнутые администратором; чтобы ослабить такое развёртывание, установите"disabled": trueв управляемых параметрах. - Когда установлена
CLAUDE_CODE_SUBPROCESS_ENV_SCRUB, Claude Code игнорируетfilesystem.disabledиз каждого источника, включая управляемые параметры, и сохраняет изоляцию файловой системы включённой.
Закрепляет ли управляемая запись credentials.files filesystem.disabled, блокируя ключ для управляемых параметров, чтобы разработчики не могли отключить изоляцию файловой системы, зависит от mode записи и того, что происходит с записью при запуске sandbox:
| Управляемая запись | Закрепляет filesystem.disabled |
Что защищает файл при отключённой изоляции |
|---|---|---|
"mode": "deny" |
Да | Ничего: блок чтения является частью слоя файловой системы |
"mode": "mask", применённый как маска |
Нет | Само маскирование: копия-дозорное значение и прокси на Linux и WSL2, собственные правила чтения sandbox на macOS |
"mode": "mask", вернулся к deny при настройке |
Нет | Ничего, как deny. Перечислите путь, который не может быть замаскирован, такой как каталог, как явную запись deny, которая закрепляет ключ |
"mode": "mask", деградирован до deny валидацией |
Да, как явный deny |
Ничего, как deny |
Возврат происходит при запуске sandbox, после того как Claude Code уже прочитал параметры, на которых выполняется проверка закрепления, поэтому вернувшаяся запись никогда не закрепляет. Валидация переписывает недействительную запись в deny при загрузке параметров, поэтому деградированная запись закрепляется как та, которую вы написали как deny.
Что изменяется при отключённой изоляции файловой системы
Установка filesystem.disabled снимает защиту, которую сам слой файловой системы применяет. Защиты, которые применяют другие слои, продолжают применяться:
| Защита | С отключённой изоляцией файловой системы |
|---|---|
filesystem.denyRead и credentials.files блоки чтения deny |
Не применяется. Слой файловой системы применяет оба |
credentials.envVars записи deny и mask |
Применяется. Очистка переменных окружения независима от слоя файловой системы |
credentials.files записи mask применённые как маски |
Применяется: маскирование независимо от слоя файловой системы. Запись, которая вернулась к deny, не применяется, как любая запись deny |
Два других вещи изменяются:
-
Изолированные команды наследуют
$TMPDIRвашей оболочки вместо временного каталога сеанса, потому что каждый временный каталог доступен для записи и Claude Code больше не перенаправляет команды в сеансовый.На Linux переменная часто не установлена в родительской оболочке, поэтому она может расширяться пусто внутри изолированных команд; Claude Code сообщает Claude через руководство инструмента Bash создавать временные каталоги с помощью
mktemp -dвместо полагания на$TMPDIR. -
autoAllowBashIfSandboxedпо-прежнему по умолчаниюtrue, поэтому изолированные команды продолжают выполняться без подсказок. Установите его вfalse, чтобы изолированные команды запрашивали подтверждение.
Защита учётных данных
Параметр sandbox.credentials объявляет файлы учётных данных и переменные окружения для защиты от изолированных команд. Каждая запись называет путь файла или переменную окружения и mode. Выделенный блок credentials сохраняет правила учётных данных сгруппированными и отдельно от общих правил файловой системы. Требуется Claude Code v2.1.187 или позже.
Для записей с "mode": "deny" пути файлов запрещены для чтения внутри sandbox, применяется то же ограничение, что и filesystem.denyRead, и переменные окружения удаляются перед каждой изолированной командой. Защита файлов является частью слоя файловой системы, поэтому она не применяется, если вы отключите изоляцию файловой системы; защита переменной окружения по-прежнему применяется.
Пример ниже блокирует чтение файла учётных данных AWS и каталога SSH и удаляет GITHUB_TOKEN и NPM_TOKEN из окружения изолированных команд:
{
"sandbox": {
"enabled": true,
"credentials": {
"files": [
{ "path": "~/.aws/credentials", "mode": "deny" },
{ "path": "~/.ssh", "mode": "deny" }
],
"envVars": [
{ "name": "GITHUB_TOKEN", "mode": "deny" },
{ "name": "NPM_TOKEN", "mode": "deny" }
]
}
}
}
Записи переменных окружения и записи файлов также принимают "mode": "mask", описанные в разделе Маскирование учётных данных.
Пути файлов следуют тем же правилам префиксов, что и параметры sandbox.filesystem.*.
Claude Code объединяет записи deny из каждой области параметров, которую загружает сеанс. Запись deny только сужает доступ, поэтому любая область может добавить одну, но ни одна не может удалить ту, которую добавила другая область.
Когда вы исключите источник параметров:
- Параметры проекта или локальные: Claude Code не применяет ни одну из их записей
credentials. Требуется Claude Code v2.1.246 или позже. - Параметры пользователя: Claude Code по-прежнему применяет записи
denyв~/.claude/settings.jsonи сохраняет свои записиmaskфайла как ограничения, но отбрасывает свои записиmaskпеременной окружения.
Встроенного списка запрещённых учётных данных нет, поэтому ограничены только файлы и переменные, которые вы указали.
sandbox.credentials влияет только на изолированные команды Bash. Чтобы удалить учётные данные из всех подпроцессов независимо от sandboxing, установите CLAUDE_CODE_SUBPROCESS_ENV_SCRUB.
Маскирование учётных данных
Маскирование идёт дальше, чем запись deny в разделе Защита учётных данных. Вместо блокировки учётных данных Claude Code показывает изолированным командам заполнитель, дозорное значение, и прокси sandbox подставляет реальное значение на исходящих запросах к хостам, которые вы разрешаете. Для файлов подстановка является поведением Linux и WSL2; macOS блокирует файл вместо этого.
Маскирование переменных окружения
"mode": "mask" защищает учётные данные, сохраняя работу инструментов, которые с ними аутентифицируются. deny удаляет переменную полностью, что также нарушает работу инструментов, которые её требуют, таких как gh или npm. Требуется Claude Code v2.1.199 или позже.
С mask изолированная команда видит значение-дозорное значение для каждого сеанса вместо реального. Каждая запись mask может перечислить injectHosts, хосты, на которые разрешено достичь реальное значение. Когда запрос покидает sandbox для одного из них, прокси sandbox заменяет дозорное значение на реальное. Команда и всё, что она логирует, никогда не содержат реальные учётные данные, но её запросы по-прежнему аутентифицируются.
Прокси подставляет учётные данные внутри содержимого запроса, поэтому он должен их видеть. Установите network.tlsTerminate так, чтобы прокси сам завершал TLS.
Без этого маскирование закрывается неудачей: команда по-прежнему видит только дозорное значение, но дозорное значение достигает сервера без изменений и аутентификация не удаётся. Claude Code сообщает об этой неправильной конфигурации при запуске.
Подстановка охватывает заголовки и тела запросов. Запросы, которые аутентифицируются с подписью, полученной из учётных данных, а не самих учётных данных, требуют повторного подписания на прокси; Повторное подписание запросов AWS охватывает, как это работает для AWS.
Прокси вводит только на соединениях, которые список разрешённых доменов допускает, поэтому каждое назначение injectHosts также должно быть достижимо через network.allowedDomains.
Пример ниже маскирует два токена. GH_TOKEN подставляется только на запросы к api.github.com, в то время как NPM_TOKEN не имеет injectHosts и подставляется на запросы ко всем хостам в network.allowedDomains.
{
"sandbox": {
"enabled": true,
"network": {
"tlsTerminate": {},
"allowedDomains": ["*.github.com", "registry.npmjs.org"]
},
"credentials": {
"envVars": [
{ "name": "GH_TOKEN", "mode": "mask", "injectHosts": ["api.github.com"] },
{ "name": "NPM_TOKEN", "mode": "mask" }
]
}
}
}
Напишите назначение IPv6 по-разному в двух списках, потому что каждый список имеет свой сопоставитель:
network.allowedDomains: форма в скобках, которую используют списки доменов, такая как"[::1]". Прокси проверяет этот список, чтобы допустить соединение.injectHosts: голый адрес в его канонической сжатой форме, такой как"::1"или"2001:db8::1". Прокси сопоставляет каждую запись с голым адресом назначения соединения, игнорируя порты, поэтому скобочная, зона-ID или иначе сжатая орфография никогда не совпадает и прокси никогда не вводит учётные данные там.
claude doctor помечает записи injectHosts, которые никогда не могут совпадать, предупреждением Sandbox credential injectHosts entries can never match their destination. Эта проверка требует Claude Code v2.1.229 или позже.
В отличие от deny, маскирование уполномочивает прокси отправлять ваши реальные учётные данные на указанные хосты, поэтому Claude Code соблюдает его только из параметров, которые вы или ваш администратор контролируете: параметры пользователя, управляемые параметры и флаг CLI --settings. Claude Code игнорирует записи mask в .claude/settings.json или .claude/settings.local.json репозитория. В этих файлах он также игнорирует network.tlsTerminate и credentials.allowPlaintextInject, параметр, который позволяет прокси вводить учётные данные в незашифрованные запросы. Если вы исключите параметры пользователя, Claude Code отбрасывает записи mask переменной окружения в ~/.claude/settings.json тоже.
Когда ваш администратор доставляет записи mask, network.tlsTerminate или credentials.allowPlaintextInject через управляемые параметры сервера, они считаются параметрами, требующими одобрения.
Когда одна и та же переменная указана с deny в любой области, deny имеет приоритет.
Маскирование заменяет всё значение переменной по умолчанию, что подходит для голого токена. Дополнительные поля записи, которые требуют Claude Code v2.1.224 или позже, обрабатывают значения со структурой:
extract: регулярное выражение, которое Claude Code применяет по всему значению, заменяя только текст, захваченный группой 1 каждого совпадения, поэтому инструмент, который анализирует значение, такой как строка подключенияDATABASE_URL, по-прежнему работает внутри sandbox. Шаблон должен содержать по крайней мере одну захватывающую группу.onExtractNoMatchконтролирует, что происходит, когда шаблон ничего не совпадает:warn, по умолчанию, предупреждает и передаёт переменную немаскированнойdenyотменяет переменную внутри sandboxerrorостанавливает настройку sandbox, пока вы не исправите конфигурацию
decode: "jwt": для переменной, содержащей JSON Web Token (JWT). Claude Code проверяет, что значение является JWT, и заменяет его структурно действительным поддельным токеном, поэтому код внутри sandbox, который декодирует токен, продолжает работать. ДобавьтеmaskClaims, чтобы перечислить утверждения полезной нагрузки верхнего уровня для маскирования отдельно вместо замены всего токена; другие утверждения остаются читаемыми. Когда значение не проверяется как JWT или ни одно перечисленное утверждение не совпадает, Claude Code передаёт переменную немаскированной с предупреждением.decodeне может быть объединён сextract.
Полный список полей см. в строках credentials.envVars[] в справке параметров.
Повторное подписание запросов AWS
Запросы AWS содержат подписи SigV4 по содержимому запроса, поэтому маскируйте AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY вместе. Прокси обнаруживает запрос SigV4 по дозорному значению ключа доступа и повторно подписывает его после подстановки реальных значений. Маскирование только секрета оставляет запросы подписанными заполнителем, который прокси не может обнаружить, поэтому они не удаются в AWS; Claude Code предупреждает об этом случае при запуске, но не когда маскируется только ID ключа доступа. Обнаруженный запрос, который прокси не может повторно подписать, такой как запрос без заголовка x-amz-date, не удаётся с ошибкой прокси вместо достижения сервера с нарушенной подписью.
Claude Code связывает обычные переменные AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY и AWS_SESSION_TOKEN в одно учётное данные автоматически, когда вы маскируете их целые значения. Если ваше учётное данные AWS находится в переменных с другими именами, сгруппируйте их сами с помощью credentials.awsPairs, которое требует Claude Code v2.1.224 или позже. Этот пример добавляет спаривание к конфигурации, которая уже маскирует MY_KEY_ID, MY_SECRET_KEY и MY_SESSION_TOKEN целое значение, как в конфигурации маскирования выше:
{
"sandbox": {
"credentials": {
"awsPairs": [
{
"accessKeyIdVar": "MY_KEY_ID",
"secretAccessKeyVar": "MY_SECRET_KEY",
"sessionTokenVar": "MY_SESSION_TOKEN"
}
]
}
}
}
Каждая запись следует этим правилам:
accessKeyIdVarиsecretAccessKeyVarназывают записиenvVarsмаски, содержащие ID ключа доступа и секретный ключ. ДополнительныйsessionTokenVarназывает запись, содержащую токен сеанса для временных учётных данных; когда установлен, прокси отправляет реальный токен какx-amz-security-tokenна повторно подписанных запросах.- Каждая названная переменная должна быть записью
mask, которая маскирует своё целое значение, безextractилиdecode. - Прокси повторно подписывает запросы на хостах, перечисленных в
injectHostsзаписи ID ключа доступа. - Именование любой из обычных переменных в паре заменяет автоматическое спаривание.
Как записи mask, awsPairs соблюдается только из параметров пользователя, управляемых параметров и флага CLI --settings.
Три формы запроса AWS содержат подписи, которые прокси не может пересчитать. Когда такой запрос подписан заполнителем маскированной пары, прокси не удаётся вместо пересылки нарушенной подписи; запросы, подписанные немаскированными учётными данными, никогда не затрагиваются. Параметр credentials.sigv4, который требует Claude Code v2.1.224 или позже, ослабляет это для каждой формы: установка ключа формы в passthrough пересылает запрос с его подписью, полученной из заполнителя, поэтому вызывающий инструмент получает собственный ответ отказа AWS вместо ошибки прокси. Как awsPairs, sigv4 соблюдается только из параметров пользователя, управляемых параметров и флага CLI --settings.
| Форма запроса | Ключ sigv4 |
Почему прокси не может повторно подписать это |
|---|---|---|
| потоковые загрузки aws-chunked | streaming |
Подписи за чанк цепляются от подписи семени, поэтому повторное подписание потребовало бы переписания тела |
| Предподписанные URL | presigned |
Подпись находится в самом URL, без заголовка Authorization |
| Асимметричные подписи SigV4A | sigv4a |
Нет общего ключа HMAC для пересчёта |
Маскирование файлов учётных данных
Записи файлов также принимают "mode": "mask", которое требует Claude Code v2.1.221 или позже. То, что видит изолированная команда, зависит от платформы:
- Linux и WSL2: изолированные команды читают копию-дозорное значение файла, заменитель, чей секрет заменён значением заполнителя, и прокси sandbox подставляет реальное значение на исходящем трафике.
- macOS: изолированные команды не могут читать перечисленный файл вообще. Claude Code не строит копию-дозорное значение и не подставляет ничего на исходящем трафике, поэтому инструменты, которые аутентифицируются с файлом, не работают внутри sandbox, тот же эффект, что и
deny. В отличие от записиdeny, блок чтения держится даже когда вы отключите изоляцию файловой системы.
На каждой платформе Claude Code применяет требование network.tlsTerminate и injectHosts так же, как для маскированных переменных окружения, и игнорирует параметры репозитория так же. Если вы исключите параметры пользователя, Claude Code сохраняет записи mask файла в ~/.claude/settings.json как ограничения, но записи больше не уполномочивают прокси подставлять реальное значение.
Пример ниже маскирует токен GitHub, хранящийся в ~/.config/gh/hosts.yml; шаблон extract, охватываемый ниже, сообщает Claude Code, какая часть файла является секретом. На Linux и WSL2 изолированные команды, которые читают файл, получают дозорное значение вместо токена, и прокси подставляет реальный токен на запросы к api.github.com:
{
"sandbox": {
"enabled": true,
"network": {
"tlsTerminate": {},
"allowedDomains": ["*.github.com"]
},
"credentials": {
"files": [
{
"path": "~/.config/gh/hosts.yml",
"mode": "mask",
"extract": "oauth_token:\\s*(\\S+)",
"injectHosts": ["api.github.com"]
}
]
}
}
}
Чтобы подтвердить, что маска активна, попросите Claude запустить cat ~/.config/gh/hosts.yml в изолированной команде: на Linux и WSL2 вывод показывает значение-дозорное значение вместо токена, а на macOS чтение не удаётся вместо этого.
На Linux и WSL2 шаблон extract — это то, что сохраняет остальную часть hosts.yml читаемой. Claude Code применяет регулярное выражение по всему файлу и заменяет только текст, захваченный группой 1 каждого совпадения, поэтому gh по-прежнему анализирует свою конфигурацию и только токен является заполнителем. Используйте extract для любого структурированного файла, который инструменты анализируют, такого как .netrc, JSON или YAML; шаблон должен содержать по крайней мере одну захватывающую группу. Без extract Claude Code заменяет всё содержимое файла одним значением-дозорным значением, что подходит для файла, который содержит один голый секрет и ничего больше.
Для файла, который содержит JSON Web Token (JWT), установите decode: "jwt" вместо или вместе с extract. decode требует Claude Code v2.1.224 или позже. Claude Code находит кандидатов JWT с встроенным шаблоном или с вашим шаблоном extract, когда установлен, проверяет каждого кандидата как JWT и заменяет его структурно действительным поддельным токеном, поэтому код, который декодирует токен внутри sandbox, продолжает работать. Добавьте maskClaims, чтобы маскировать только названные утверждения полезной нагрузки верхнего уровня внутри каждого проверенного токена и оставить другие утверждения читаемыми. Когда ни один кандидат не проверяется или ни одно названное утверждение не совпадает, поле onExtractNoMatch ниже управляет результатом, как оно делает для шаблона, который ничего не совпадает.
Два дополнительных поля уточняют, как ведёт себя сопоставление. Оба применяются только когда mode — это mask и extract или decode установлены. На macOS Claude Code применяет записи mask как deny перед запуском шаблона, когда изоляция файловой системы включена, поэтому эти поля и результаты отсутствия совпадения ниже вступают в силу там только когда изоляция файловой системы отключена:
-
onExtractNoMatchконтролирует, что происходит, когда сопоставление не находит ничего для маскирования в файле:warn, по умолчанию, предупреждает и пропускает запись, поэтому изолированные команды могут читать реальный файл немаскированным. По умолчанию подходит для учётных данных, которые могут быть законно отсутствующими; если секрет может быть присутствующим, но шаблон может его пропустить, используйтеdenydenyделает файл нечитаемым вместо этогоerrorостанавливает настройку sandbox, пока вы не исправите конфигурацию
Claude Code обрабатывает
denyкакerror, когда блок чтения не будет применяться: когда вы отключите изоляцию файловой системы и когда записьfilesystem.allowReadиз любого источника параметров повторно открывает путь файла. -
maskDuplicatesтакже заменяет дословные копии каждого маскированного значения учётных данных, захватextractили проверенный токенdecode, найденный вне совпадённых диапазонов, для секрета, повторённого где сопоставление не достигает. Он совпадает с сырыми подстроками, поэтому короткое или обычное значение было бы заменено везде, где оно появляется; зарезервируйте его для длинных, высокоэнтропийных секретов. По умолчанию: false.
mask применяется к одному файлу, поэтому перечислите каждый файл учётных данных отдельно. Claude Code возвращается к deny для записи mask, которую он не может безопасно маскировать: путь каталога, шаблон glob, файл больше 8 МиБ или файл, который не является текстом UTF-8. Напишите каталоги как явные записи deny вместо этого; таблица в разделе Какие параметры могут отключить это охватывает, закрепляет ли каждая форма filesystem.disabled и как она ведёт себя с отключённой изоляцией файловой системы.
Как работает sandboxing
Изоляция файловой системы
Изолированный инструмент Bash ограничивает доступ к файловой системе определёнными каталогами:
- Поведение записи по умолчанию: доступ на чтение и запись к текущему рабочему каталогу и его подкаталогам, любым каталогам, которые вы добавили с помощью
--add-dir,/add-dirилиpermissions.additionalDirectories, плюс временный каталог сеанса, на который указывает$TMPDIR - Поведение чтения по умолчанию: доступ на чтение ко всему компьютеру, кроме определённых запрещённых каталогов. Обратите внимание, что эта политика по умолчанию всё ещё разрешает чтение файлов учётных данных, таких как
~/.aws/credentialsи~/.ssh/. Используйтеsandbox.credentialsдля блокировки чтения этих файлов и отмены установки переменных окружения с секретами, или добавьте пути вdenyRead. - Заблокированный доступ: невозможно изменять файлы вне текущего рабочего каталога, добавленных каталогов и временного каталога сеанса без явного разрешения, включая файлы конфигурации оболочки, такие как
~/.bashrc, и системные двоичные файлы в/bin/ - Git worktrees: когда рабочий каталог является связанным git worktree, sandbox также разрешает запись в общий каталог
.gitосновного репозитория, чтобы команды, такие какgit commit, могли обновлять ссылки и индекс. Запись вhooks/иconfigвнутри этого каталога остаётся запрещённой. - Настраиваемо: определите пользовательские разрешённые и запрещённые пути через параметры
Чтобы полностью пропустить изоляцию файловой системы, сохраняя при этом изоляцию сети, установите sandbox.filesystem.disabled.
Защищённые пути
Внутри каталогов, в которые изолированные команды могут записывать данные, sandbox всё ещё запрещает запись в файлы, из которых Claude Code загружает конфигурацию и код. Команда, которая могла бы редактировать эти файлы, могла бы предоставить себе разрешения или добавить hook или MCP сервер, который Claude Code запускает вне sandbox. Система разрешений имеет свои собственные защищённые пути, которые контролируют, что Claude Code одобряет перед запуском инструмента; список sandbox применяется к команде, которая уже запущена. Он охватывает четыре группы путей:
- В вашем рабочем каталоге и каталогах выше него: файлы параметров
.claude, каталоги.claude/skills,.claude/agents,.claude/commandsи.claude/hooks,.mcp.json, а также файлы, которые Claude Code запускает самостоятельно, такие как.claude/workflowsи.claude/scheduled_tasks.json - Только в вашем рабочем каталоге: файлы запуска оболочки, такие как
.bashrcи.zshrc,.gitconfig, каталоги.vscodeи.idea, а такжеhooksиconfigвнутри.git - Файлы, которые превратили бы ваш рабочий каталог в голый git репозиторий:
HEAD,objectsиrefsна верхнем уровне, плюсconfigиhooksтам, когда они уже существуют, даже если каталогconfigпринадлежит вашему проекту, а не git. На Linux и WSL2 sandbox удаляет файлHEADверхнего уровня или каталогobjectsилиrefs, который появляется во время выполнения изолированной команды - В
~/.claudeили в каталоге, на который указываетCLAUDE_CONFIG_DIR: большая часть его содержимого, плюс~/.claude.jsonи хранилище учётных данных.credentials.json
Если симлинк появляется в пути защищённого файла параметров во время сеанса, sandbox также запрещает запись в файл, на который он указывает, начиная со следующей команды.
Нет способа исключить один из этих путей: запись allowWrite или правило разрешения Edit, которое охватывает путь, не снимает защиту. Единственный способ отключить защиту — это filesystem.disabled, который отключает изоляцию файловой системы для каждого пути. Чтобы увидеть большинство этих путей, разрешённых для вашей машины, запустите /sandbox и откройте вкладку Config, которая перечисляет их в разделе Denied within allowed, смешанные с вашими собственными записями denyWrite.
Если git merge или git checkout не удаётся с ошибкой unable to unlink old на одном из этих путей, см. Troubleshooting.
Сетевая изоляция
Доступ в сеть контролируется через прокси-сервер, работающий вне sandbox:
- Ограничения домена: Claude Code не предварительно разрешает никакие домены по умолчанию. Первый раз, когда команде требуется новый домен, Claude Code запрашивает одобрение, или в режиме автоматизации отправляет запрос классификатору. Если вы выберете «Да» при запросе, Claude Code разрешит хост для остальной части текущего сеанса и больше не будет запрашивать подтверждение для более поздних подключений к тому же хосту. Если вы выберете «Да, и больше не спрашивать», Claude Code сохранит правило разрешения
WebFetch(domain:...)в ваши локальные параметры, чтобы хост оставался разрешённым в будущих сеансах. Предварительно разрешите домены с помощьюallowedDomains, чтобы полностью избежать запроса. Claude Code также предварительно разрешает домены из правил разрешенияWebFetch(domain:...), как описано в Permission rules. - Строгий список разрешений: если вы установите
strictAllowlistв значениеtrueв пользовательских, управляемых или CLI параметрах--settings, Claude Code запретит изолированным командам доступ к любому хосту вне списка разрешений вместо запроса. Список разрешений — это тот же, против которого sandbox иначе запрашивает:allowedDomainsплюс домены из правил разрешенияWebFetch(domain:...), или только записи управляемых параметров, когда установленallowManagedDomainsOnly. Claude Code применяет это только для изолированных команд; встроенные инструменты, такие какWebFetch, всё ещё следуют своим правилам разрешения. Установка этого в.claude/settings.jsonили.claude/settings.local.jsonрепозитория не имеет эффекта. Требуется Claude Code версии 2.1.219 или позже. - Управляемая блокировка: если
allowManagedDomainsOnlyустановлен в управляемых параметрах, неразрешённые домены автоматически блокируются вместо запроса, и толькоallowedDomainsи правила разрешенияWebFetch(domain:...)из управляемых параметров учитываются. - Корпоративный прокси: когда ваша сеть требует, чтобы исходящий трафик проходил через корпоративный прокси, установите
HTTPS_PROXY,HTTP_PROXYиNO_PROXYкак описано в proxy configuration, в блокеenvваших параметров, чтобы фоновые агенты их получили, или в окружении, из которого вы запускаете Claude Code. Claude Code применяет список разрешений домена и затем туннелирует разрешённые подключения через этот вышестоящий прокси. - Поддержка пользовательского прокси: продвинутые пользователи могут реализовать пользовательские правила для исходящего трафика
- Полное покрытие: ограничения применяются ко всем скриптам, программам и подпроцессам, порожденным командами
В правиле WebFetch(domain:...) sandbox поддерживает две формы подстановочных символов: ведущий *., такой как *.example.com, и простой *. Простая форма * требует Claude Code версии 2.1.186 или позже. Подстановочный символ в любой другой позиции, такой как WebFetch(domain:example.*), всё ещё соответствует выборкам, но не влияет на изолированные команды.
Встроенный прокси применяет список разрешений на основе запрошенного имени хоста и, по умолчанию, не завершает и не проверяет трафик TLS. Экспериментальный параметр network.tlsTerminate, доступный в Claude Code версии 2.1.199 и позже, заставляет встроенный прокси самостоятельно завершать TLS, что требуется для mask записей учётных данных. См. Security limitations для понимания последствий поведения по умолчанию и Custom proxy configuration, если ваша модель угроз требует проверки TLS.
IPv6 адреса в списках доменов
Списки доменов sandbox — это allowedDomains, deniedDomains и правила WebFetch(domain:...), которые их питают. Чтобы соответствовать IPv6 адресу в любом из них, напишите литерал в скобках: "[::1]" соответствует этому адресу на каждом порту, и "[::1]:443" соответствует ему только на порту 443. Напишите порт как число от 1 до 65535 без ведущих нулей. Форма в скобках требует Claude Code версии 2.1.229 или позже. До версии 2.1.229, когда текст после последнего двоеточия записи без скобок был номером порта, Claude Code читал его как один, поэтому ::1:443 назывался адресом ::1 на порту 443.
Когда вы выбираете «Да, и больше не спрашивать» при запросе одобрения сети для IPv6 адреса, Claude Code сохраняет правило WebFetch(domain:...) с адресом в скобках, чтобы правило продолжало соответствовать адресу в будущих сеансах.
Запись без скобок с двумя или более двоеточиями неоднозначна: ::1:443 — это одновременно полный IPv6 адрес и адрес, за которым следует порт. Claude Code применяет неоднозначные написания консервативно вместо угадывания, какое прочтение вы имели в виду:
- Списки запретов: Claude Code запрещает каждое прочтение, которое запись анализирует как, поэтому какое бы прочтение вы ни имели в виду, оно блокируется. Для записи без анализируемого прочтения Claude Code ничего не блокирует.
- Списки разрешений: Claude Code никогда не разрешает больше, чем вы написали. Он переписывает неоднозначную запись в её прочтение хоста и порта, когда это прочтение анализируется чисто, и может полностью отбросить запись, а не расширять список разрешений.
Запустите claude doctor в вашем терминале, чтобы найти затронутые записи: предупреждение Sandbox network domain entries have unreliable spellings называет до трёх из них и считает остальные. Переписьте каждую в форме в скобках, чтобы очистить предупреждение. Предупреждение также называет записи, чьё написание ненадёжно по другим причинам, таким как @, символы пути или запроса, или подстановочные символы внутри скобок.
Применение на уровне ОС
Изолированный инструмент Bash использует примитивы безопасности операционной системы:
- macOS: использует Seatbelt для применения sandbox
- Linux: использует bubblewrap для изоляции
- WSL2: использует bubblewrap, как и Linux
WSL1 не поддерживается, потому что bubblewrap требует функций ядра, доступных только в WSL2.
Эти же примитивы доступны как отдельный пакет @anthropic-ai/sandbox-runtime, который страница Sandbox environments описывает как отдельный подход для обёртывания всего процесса Claude Code.
Как sandboxing связан с разрешениями и режимами разрешений
Sandboxing, правила разрешений и режимы разрешений являются дополняющими друг друга слоями. Разделы ниже описывают, как sandbox взаимодействует с каждым.
Правила разрешений
Правила разрешений и sandboxing контролируют разные вещи:
- Правила разрешений контролируют, какие инструменты может использовать Claude Code, и оцениваются перед запуском любого инструмента. Они применяются ко всем инструментам: Bash, Read, Edit, WebFetch, MCP и другим, за исключением того, что правило deny или ask не может заблокировать
EndConversation, пока остаётся любой другой инструмент. - Sandboxing обеспечивает применение на уровне ОС, которое ограничивает, к чему могут получить доступ команды Bash на уровне файловой системы и сети. Это применяется только к командам Bash и их дочерним процессам.
Два слоя также отличаются способом их применения. Claude Code оценивает решения разрешений перед запуском команды на основе строки команды и, в режиме auto, отдельного классификатора, который судит о безопасности команды. Операционная система применяет границу sandbox к работающему процессу, поэтому она действует независимо от того, что выбрала модель для запуска, и даже если разрешённая команда делает больше, чем предполагает её имя.
Ограничения файловой системы и сети настраиваются как через параметры sandbox, так и через правила разрешений:
| Параметр или правило | Что оно делает |
|---|---|
sandbox.filesystem.allowWrite |
Предоставляет доступ на запись подпроцесса к путям вне рабочего каталога |
sandbox.filesystem.denyWrite и sandbox.filesystem.denyRead |
Блокируют доступ подпроцесса к определённым путям |
sandbox.filesystem.allowRead |
Повторно разрешают чтение определённых путей в области denyRead |
sandbox.filesystem.disabled |
Полностью отключает слой файловой системы, сохраняя при этом изоляцию сети |
Правила разрешения Edit |
Предоставляют доступ на запись к определённым путям, так же как sandbox.filesystem.allowWrite |
Правила отказа Read и Edit |
Блокируют доступ к определённым файлам или каталогам |
Правила разрешения и отказа WebFetch(domain:...) |
Контролируют доступ к доменам |
Sandbox allowedDomains |
Контролирует, к каким доменам могут получить доступ команды Bash |
Sandbox deniedDomains |
Блокирует определённые домены даже когда более широкий подстановочный знак allowedDomains иначе разрешил бы их |
Пути и домены из обоих параметров sandbox и правил разрешений объединяются в окончательную конфигурацию sandbox.
Репозиторий claude-code, каталог примеров включает начальные конфигурации параметров для распространённых сценариев развёртывания, включая примеры, специфичные для sandbox. Используйте их как отправные точки и адаптируйте их в соответствии с вашими потребностями.
Режимы разрешений
/sandbox не является режимом разрешений. Режимы разрешений решают, выполняется ли вызов инструмента и запрашивается ли вас сначала, в то время как sandbox ограничивает, к чему может получить доступ команда Bash после её запуска. Они отличаются в том, что они контролируют и что заменяет запрос для каждого действия:
| Что контролирует | Что заменяет запрос | |
|---|---|---|
/sandbox |
К чему может получить доступ команда Bash после её запуска | Сама граница sandbox в режиме автоматического разрешения |
| Auto mode | Выполняется ли каждый вызов инструмента | Классификатор, который проверяет действия |
--dangerously-skip-permissions |
Выполняется ли каждый вызов инструмента | Ничего. Проверки защищённого пути также пропускаются; действия, которые ни один режим не одобряет автоматически по-прежнему применяются |
Режим автоматического разрешения sandbox отличается от режима auto: автоматическое разрешение одобряет команды Bash, потому что граница sandbox их содержит, в то время как режим auto использует классификатор для проверки действий. Два работают независимо и могут быть объединены. Чтобы выбрать границу изоляции для автоматических запусков, см. Sandbox environments. Для таблицы распространённых пар режимов разрешений и sandbox с флагами, которые запускают каждый из них, см. Common setups.
Настройка sandbox для вашей организации
Администраторы могут требовать sandboxing для каждого пользователя, препятствовать разработчикам расширять политику и маршрутизировать трафик sandbox через корпоративный прокси.
Применение sandboxing с управляемыми параметрами
Чтобы требовать sandbox для каждого разработчика, доставьте ключи sandbox через управляемые параметры, либо как файл, управляемый вашей MDM, либо через управляемые параметры сервера на Claude.ai.
Следующая конфигурация управляемых параметров включает sandbox, отказывает запустить Claude Code, если sandbox не может инициализироваться, и препятствует модели повторять команды вне sandbox:
{
"sandbox": {
"enabled": true,
"failIfUnavailable": true,
"allowUnsandboxedCommands": false
}
}
Два ключа помимо enabled контролируют, что происходит, когда sandbox не может выполнить команду:
failIfUnavailable: отсутствующая зависимость, такая как bubblewrap на Linux, блокирует запуск Claude Code вместо показа предупреждения и возврата к выполнению без изоляцииallowUnsandboxedCommands: false: Claude Code игнорирует механизм выходаdangerouslyDisableSandbox, поэтому когда команда не выполняется в sandbox, Claude не может повторить её вне sandbox
Два дополнения стоит рассмотреть вместе с ними. Добавьте excludedCommands для любых одобренных организацией инструментов, которые должны выполняться без изоляции. Добавьте записи sandbox.credentials для каталогов учётных данных, таких как ~/.aws и ~/.ssh, и для переменных окружения с секретами, поскольку политика чтения по умолчанию всё ещё разрешает их.
Эта конфигурация изолирует команды, которые выполняет Claude. Разработчик всё ещё может ввести команду в приглашение shell-режима с префиксом ! и выполнить её вне sandbox с тем же доступом, который у него уже есть в любом терминале вне Claude Code. Смотрите Механизм выхода для повторного выполнения без sandbox для сеансов, где введённые команды выполняются в sandbox.
Sandbox не работает на нативной Windows, поэтому если ваш парк включает хосты Windows, ограничьте эту конфигурацию macOS и Linux или попросите этих пользователей запустить Claude Code внутри WSL2 или контейнера.
Препятствование разработчикам расширять политику
Для логических ключей, таких как enabled и failIfUnavailable, Claude Code использует управляемое значение и игнорирует всё, что разработчик устанавливает локально. Для ключей массива, таких как excludedCommands и allowRead, Claude Code объединяет записи из каждой области, которую загружает сеанс, поэтому разработчик может добавлять записи, которые расширяют политику.
Установите allowManagedReadPathsOnly в true в управляемых параметрах, чтобы только записи allowRead из управляемых параметров учитывались. Это препятствует разработчикам расширять доступ на чтение за пределы одобренных организацией путей. Чтобы заблокировать сетевые домены таким же образом, установите allowManagedDomainsOnly.
Когда управляемые параметры конфигурируют sandbox.filesystem или указывают любую запись sandbox.credentials.files с "mode": "deny", только управляемые параметры могут установить filesystem.disabled, поэтому разработчики не могут отключить развёрнутые администратором ограничения изоляции файловой системы. Закрепляет ли запись mask ключ, зависит от того, как она разрешается; таблица в разделе Какие параметры могут отключить это охватывает четыре случая.
excludedCommands не имеет эквивалентной блокировки только для управляемых, поэтому разработчик всегда может добавлять записи, которые выполняют дополнительные команды вне sandbox. Держите управляемый список узким.
Конфигурация пользовательского прокси
Для организаций, требующих продвинутой сетевой безопасности, вы можете реализовать пользовательский прокси для:
- Расшифровки и проверки трафика HTTPS
- Применения пользовательских правил фильтрации
- Логирования всех сетевых запросов
- Интеграции с существующей инфраструктурой безопасности
Чтобы указать Claude Code на ваш прокси, установите порты прокси в параметрах sandbox:
{
"sandbox": {
"network": {
"httpProxyPort": 8080,
"socksProxyPort": 8081
}
}
}
Устранение неполадок
Некоторые команды не выполняются внутри sandbox, хотя они работают вне его. Исправления ниже охватывают наиболее распространённые случаи.
-
Команды не выполняются с ошибкой host-not-allowed: многие инструменты CLI должны достичь определённых хостов. Предоставление разрешения при запросе добавляет хост в ваш список разрешённых, поэтому инструмент выполняется внутри sandbox в будущем.
-
jestзависает или не выполняется:watchmanнесовместим с sandbox. Вместо этого запуститеjest --no-watchman. -
Go-based CLIs не выполняют проверку TLS на macOS: инструменты, такие как
gh,gcloudиterraform, могут не выполнять проверку TLS под Seatbelt. Перечислите эти инструменты вexcludedCommands, чтобы запустить их вне sandbox. Если вы используетеhttpProxyPortс MITM прокси и пользовательским CA, установитеenableWeakerNetworkIsolationвtrueвместо этого. -
open,osascriptили потоки аутентификации на основе браузера не выполняются с ошибкой-600на macOS: sandbox по умолчанию блокирует Apple Events. УстановитеallowAppleEventsвtrueв ваших пользовательских, управляемых или CLI параметрах, чтобы разрешить их. Параметры проекта игнорируются для этого ключа. Включение его удаляет изоляцию выполнения кода, так как изолированные команды могут затем запускать другие приложения без изоляции без запроса пользователя и отправлять команды AppleScript запущенным приложениям, подлежащим запросу автоматизации macOS (TCC). Кроме того, добавьте команду вexcludedCommands, чтобы запустить её вне sandbox. -
Команды
dockerне выполняются:dockerнесовместим с sandbox. Добавьтеdocker *вexcludedCommands, чтобы запустить его вне sandbox. -
pbcopy,xclipилиwl-copyне обновляют буфер обмена: эти утилиты буфера обмена могут не достичь системного буфера обмена изнутри sandbox, в этом случае текст, переданный в них, не поступает. Чтобы поместить вывод Claude в ваш буфер обмена, попросите Claude напечатать его в своём ответе, затем запустите/copy, который записывает в буфер обмена из процесса Claude Code, а не из изолированной команды. Кроме того, добавьтеpbcopy *,wl-copy *илиxclip *вexcludedCommands, чтобы запустить команду вне sandbox. -
Команда git не выполняется с ошибкой
unable to unlink old:git merge,git checkoutи подобные команды не выполняются таким образом, когда им нужно заменить файл, в который sandbox запрещает запись, независимо от того, находится ли этот файл под защищённым путём, таким как.claude/skills, под одной из ваших записейdenyWriteили вне каталогов, в которые sandbox позволяет командам писать вообще. На Linux и WSL2 ошибка заканчивается наRead-only file system.После сбоя Claude может предложить повторно запустить команду вне sandbox; одобрите этот повтор или запустите команду git самостоятельно в другом терминале. Если вы установили
allowUnsandboxedCommandsвfalse, Claude не может предложить повтор, поэтому запустите команду самостоятельно. Если одна и та же команда git часто не выполняется, добавьте её вexcludedCommands. -
Bubblewrap не запускается внутри контейнера: в непривилегированном контейнере bubblewrap не может смонтировать свежую файловую систему
/proc, поэтому изолированные команды не выполняются с ошибкойbwrap, такой какCan't mount proc on /newroot/proc: Operation not permitted. УстановитеenableWeakerNestedSandboxвtrue, чтобы внутренний sandbox привязал существующий/procконтейнера вместо этого. Используйте этот параметр только когда внешний контейнер уже обеспечивает границу изоляции, которая вам требуется, так как это раскрывает информацию о процессе для изолированных команд, которую свежее монтирование/procскрыло бы. -
Файлы размером 0 байт только для чтения появляются в путях параметров
.claude, и "Да, и больше не спрашивать" не сохраняется: на Linux и WSL2 sandbox удерживает запрет на запись в файл, который ещё не существует, создавая 0-байтовый заполнитель только для чтения там, пока выполняется изолированная команда. Sandbox удаляет заполнитель после этого. Если сеанс завершается до выполнения этой очистки, например по SIGKILL, заполнители остаются. Более поздние сеансы привязывают их только для чтения снова при каждом запуске, поэтому запись параметров, такая как сохранение выбора разрешения, не выполняется там, где она находится.Запустите
claude doctor, чтобы перечислить оставшиеся файлы заполнителей. ПредупреждениеStale sandbox mask files left by a killed sessionназывает до трёх из них и подсчитывает остальные. Удалите каждый файл с помощьюrm, пока в этом проекте не запущен другой сеанс Claude Code. До версии 2.1.257 Claude Code оставлял те же заполнители без их отмечания. -
--dangerously-skip-permissionsне выполняется как root: этот флаг блокируется при запуске как root или через sudo на Linux и macOS, потому что доступ root в сочетании с отсутствием запросов разрешений может изменять любой файл или сервис в системе. Проверка автоматически пропускается внутри признанного sandbox. Чтобы запустить автономно в контейнере, используйте конфигурацию dev container, которая запускает Claude Code как непривилегированного пользователя.
Ограничения
Sandboxing снижает риск, но не является полной границей изоляции. Просмотрите ограничения ниже перед тем, как полагаться на него как на жёсткий контроль безопасности.
Ограничения безопасности
- Фильтрация сети: sandbox ограничивает домены, к которым процессы могут подключаться. По умолчанию встроенный прокси не завершает и не проверяет TLS исходящего трафика, поэтому содержимое зашифрованных соединений не проверяется. Экспериментальный параметр
network.tlsTerminateзавершает TLS на прокси для подстановки учётных данныхmask, но не добавляет фильтрацию содержимого. Вы несёте ответственность за обеспечение того, чтобы в вашей политике разрешались только доверенные домены.
Разрешение широких доменов, таких как github.com, может создать пути для экспортирования данных. Потому что прокси принимает решение о разрешении на основе предоставленного клиентом имени хоста без проверки TLS, код, работающий внутри sandbox, потенциально может использовать domain fronting или аналогичные методы для достижения хостов вне списка разрешений. Если ваша модель угроз требует более сильных гарантий, настройте пользовательский прокси, который завершает TLS и проверяет трафик, и установите его сертификат CA внутри sandbox. Более сильная изоляция сети, осведомлённая о TLS, является активной областью разработки.
- Повышение привилегий через Unix sockets: конфигурация
allowUnixSocketsможет случайно предоставить доступ к системным сервисам, которые могут привести к обходам sandbox. Например, разрешение доступа к/var/run/docker.sockфактически предоставляет доступ к хост-системе через сокет Docker. Тщательно рассмотрите любые Unix sockets, которые вы разрешаете через sandbox. - Повышение привилегий разрешений файловой системы: чрезмерно широкие разрешения на запись в файловую систему могут включить атаки повышения привилегий. Разрешение записи в каталоги, содержащие исполняемые файлы в
$PATH, каталоги конфигурации системы или файлы конфигурации оболочки пользователя, такие как.bashrcили.zshrc, может привести к выполнению кода в разных контекстах безопасности, когда другие пользователи или системные процессы получают доступ к этим файлам. - Сила Linux sandbox: реализация Linux обеспечивает сильную изоляцию файловой системы и сети, но включает режим
enableWeakerNestedSandbox, который позволяет ему работать внутри окружений Docker без привилегированных пространств имён или на хостах Linux, где непривилегированные пользовательские пространства имён отключены sysctl. Эта опция значительно ослабляет безопасность и должна использоваться только когда дополнительная изоляция иным образом применяется. - Apple Events на macOS: sandbox на macOS по умолчанию блокирует Apple Events. Параметр
allowAppleEventsснимает это ограничение, чтобы инструменты, такие какopenиosascript, работали, но он удаляет изоляцию выполнения кода: изолированные команды могут запускать другие приложения без изоляции без запроса пользователя и могут отправлять команды AppleScript запущенным приложениям, в соответствии с запросом согласия на автоматизацию macOS для каждого приложения (TCC). Это учитывается только из пользовательских, управляемых или CLI параметров. Параметры проекта не могут включить это.
Совместимость платформ и инструментов
- Поддержка платформ: поддерживает macOS, Linux и WSL2. WSL1 и нативная Windows не поддерживаются.
- Накладные расходы производительности: минимальные, но некоторые операции файловой системы могут быть немного медленнее.
- Совместимость инструментов: некоторые инструменты, требующие определённых шаблонов доступа к системе, могут потребовать корректировки конфигурации или могут потребовать запуска вне sandbox.
Область
Sandbox изолирует подпроцессы Bash. Другие инструменты работают в разных границах:
- Встроенные инструменты файлов: Read, Edit и Write используют систему разрешений напрямую, а не работают через sandbox. См. permissions.
- Использование компьютера: когда Claude открывает приложения и управляет вашим экраном, он работает на вашем фактическом рабочем столе, а не в изолированной среде. Запросы разрешений для каждого приложения контролируют каждое приложение. См. computer use in the CLI или computer use in Desktop.
- Переменные окружения: изолированные команды Bash наследуют окружение родительского процесса по умолчанию, включая любые учётные данные, установленные там. Используйте
sandbox.credentialsдля удаления или маскирования определённых переменных для изолированных команд или установитеCLAUDE_CODE_SUBPROCESS_ENV_SCRUBдля удаления учётных данных из всех подпроцессов. - Subagents: subagents работают в том же процессе, что и родительский сеанс, и используют ту же конфигурацию sandbox. Команды Bash внутри subagent изолированы, когда sandboxing включен в родительском сеансе.
Эффективный sandboxing требует как изоляции файловой системы, так и сетевой изоляции. Без сетевой изоляции скомпрометированный агент может экспортировать конфиденциальные файлы, такие как ключи SSH. Без изоляции файловой системы, будь то из-за разрешительной политики или из-за отключения уровня файловой системы, скомпрометированный агент может установить бэкдор в системные ресурсы для получения сетевого доступа. Когда вы расширяете значения по умолчанию, проверьте, что путь allowWrite, широкая запись allowedDomains или исключение excludedCommands не отменяет ограничение на другой стороне.
См. также
- Sandbox environments: сравните встроенный sandbox с dev containers, контейнерами и ВМ
- Security: комплексные функции безопасности и лучшие практики
- Permissions: конфигурация разрешений и контроль доступа
- All settings: каждый ключ параметров
- CLI reference: параметры командной строки