Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ node_modules/
__pycache__/
results/local-*/
.DS_Store
results/install.log
117 changes: 82 additions & 35 deletions README.md

Large diffs are not rendered by default.

28 changes: 15 additions & 13 deletions RECOMMENDATION.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion SEARCH.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Разведка: песочницы кодовых агентов

Обновление 2026-10-29: появились [runtime-прогоны](results/2026-10-29/README.md) и [рекомендация](RECOMMENDATION.md). Ниже сохранены решения разведки; проверенными считаются только явно измеренные сценарии.
Обновление 2026-10-30: [runtime-прогоны](results/2026-10-30/README.md) и [рекомендация](RECOMMENDATION.md). Ниже сохранены решения разведки; проверенными считаются только явно измеренные сценарии.

Два варианта изоляции кодового агента из постановки.

Expand Down
27 changes: 18 additions & 9 deletions claude-sandbox/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,41 @@

Базовая конфигурация стенда для варианта A, составленная по официальной документации. Это **не** политика, закрывающая найденное, — только включение песочницы так, чтобы её нельзя было обойти настройками репозитория. Политику разрешений под конкретные находки добавляют после первого прогона.

На 2026-10-29 выполнен [отдельный прогон SRT CLI](../results/2026-10-29/srt/matrix.md). Он проверяет runtime, но не загрузку этого файла в Claude Code и не managed precedence. Интеграционный прогон Claude ещё не выполнен. Сетевой allowlist ниже пуст: перед пилотом его нужно согласовать с рабочими сервисами; это не готовый профиль повседневной разработки.
Отдельные прогоны SRT CLI лежат в [results](../results/2026-10-30/README.md). Они проверяют runtime, но не загрузку этого файла в Claude Code и не managed precedence. Интеграционный прогон Claude ещё не выполнен. Сетевой allowlist ниже пуст: перед пилотом его нужно согласовать с рабочими сервисами; это не готовый профиль повседневной разработки.

Установка: `./install-wizard.sh`. Это шаг человека: файл ложится в системный каталог и требует прав администратора.

## Что делает каждый ключ и откуда он взят

Все имена ключей сверены с settings-reference Claude Code 2026-10-19 (каждый присутствует в документе); форма блока `credentials` (`files` с `{path, mode:"deny"}`, `envVars` с `{name, mode}`) — из раздела «Protect credentials» того же источника. Источники загружены 2026-10-19:
Ключи и их смысл сверены 2026-10-30 со страницами документации Claude Code (Markdown-версии страниц, загружены 2026-10-30):
- [Sandboxing](https://code.claude.com/docs/en/sandboxing) — S;
- [Settings reference](https://code.claude.com/docs/en/settings-reference) — R;
- [Managed settings](https://code.claude.com/docs/en/managed-settings) — M;
- [Permissions](https://code.claude.com/docs/en/permissions) — P.

`scripts/check.py` сверяет таблицу с `managed-settings.json`: у каждого ключа в колонке «Значение» должно стоять то же значение, что в файле, а у списков — каждый элемент.

| Ключ | Значение | Зачем | Источник |
|---|---|---|---|
| файл | `/Library/Application Support/ClaudeCode/managed-settings.json` | системный каталог managed settings на macOS | M |
| `allowManagedHooksOnly` | `true` | выполняются только хуки из managed settings. Хук из `.claude/settings.json` репозитория выполняется вне песочницы с полными правами пользователя | R: «only managed hooks run»; S: «command hooks, local MCP servers … status line command and `apiKeyHelper` run with your full access» |
| `allowManagedMcpServersOnly` | `true` | список разрешённых MCP-серверов берётся только из managed settings | R: «reads `allowedMcpServers` from managed settings alone» |
| `allowedMcpServers` | `[]` | пустой список: блокируются все MCP-серверы, которые добавляет пользователь или репозиторий (`.mcp.json`). Серверы для пилота вносятся сюда поимённо | R: «an empty array blocks every server users add» |
| `enableAllProjectMcpServers` | `false` | серверы из `.mcp.json` репозитория не одобряются без вопроса | R, `enableAllProjectMcpServers` |
| `sandbox.enabled` | `true` | включить песочницу для команд оболочки | S, «Enforce sandboxing with managed settings» |
| `sandbox.failIfUnavailable` | `true` | если песочница не стартует, Claude Code не запускается, а не работает без неё | S: «a missing dependency … blocks Claude Code from starting rather than falling back to unsandboxed execution» |
| `sandbox.allowUnsandboxedCommands` | `false` | выключить запасной выход: модель не может повторить упавшую команду вне песочницы. Заодно песочница становится admin-required, и настройки репозитория, которые её ослабляют, игнорируются | S: «Claude Code ignores the `dangerouslyDisableSandbox` escape hatch»; про admin-required: «Requires Claude Code v2.1.285 or later» |
| `sandbox.autoAllowBashIfSandboxed` | `true` | значение по умолчанию, но заданное в managed settings: репозиторий не может его поменять | S: «Set the key in managed settings to keep a repository from changing it» |
| `sandbox.allowUnsandboxedCommands` | `false` | выключить запасной выход: модель не может повторить упавшую команду вне песочницы. Песочница становится admin-required, и настройки репозитория, которые её ослабляют, игнорируются | S: «Claude Code ignores the `dangerouslyDisableSandbox` escape hatch»; про admin-required: «Requires Claude Code v2.1.285 or later» |
| `sandbox.autoAllowBashIfSandboxed` | `false` | команды в песочнице идут через обычные подтверждения. При `true` они выполняются без вопроса, в том числе запись в рабочий каталог файлов, которые потом исполнит кто-то вне песочницы (Makefile, `package.json`, `.envrc`; см. матрицу). Строгий старт для пилота; включение — решение по итогам замера числа подтверждений | R: «`true`: Claude Code runs sandboxed Bash commands without a permission prompt»; S: «Don't rely on any of the sandbox's restrictions … In auto-allow mode, that command can run without a permission prompt» |
| `sandbox.enableWeakerNetworkIsolation`, `sandbox.allowAppleEvents` | `false` | ключи, которые ослабляют песочницу и которые иначе можно включить из пользовательских настроек | S, «Keep developers from widening the policy» |
| `sandbox.filesystem.allowManagedReadPathsOnly` | `true` | учитываются только `allowRead` из managed settings — разработчик не может своим `allowRead` заново открыть чтение путей, закрытых через `credentials.files` выше (защита в глубину) | R: «only `allowRead` entries from managed settings are honored» |
| `sandbox.network.allowedDomains` | `[]` | сеть для команд закрыта полностью; список разрешённых доменов задаётся политикой развёртывания | S: allowed domains «start empty» |
| `sandbox.filesystem.allowManagedReadPathsOnly` | `true` | учитываются только `allowRead` из managed settings: разработчик не может своим `allowRead` снова открыть закрытые пути | R: «only `allowRead` entries from managed settings are honored» |
| `sandbox.filesystem.denyRead` | `~/**/.env` | команды не читают `.env` ни в одном каталоге под домашним, в том числе в репозитории | S, пример: «`"denyRead": ["~/**/.env"]` … Every `.env` under the home directory stays blocked»; синтаксис путей — R, «Sandbox path prefixes» |
| `sandbox.network.allowedDomains` | `[]` | сеть для команд закрыта полностью; список доменов задаётся политикой развёртывания | S: allowed domains «start empty» |
| `sandbox.network.allowManagedDomainsOnly` | `true` | учитываются только домены из managed settings; остальные блокируются без вопроса | S, «Managed lockdown» |
| `sandbox.credentials.files` | `deny` для `~/.ssh`, `~/.aws` и других каталогов с ключами | по умолчанию песочница **разрешает** их читать | S: «Reads: Most of the machine, including credential files such as `~/.ssh` and `~/.aws/credentials`»; «There is no built-in credential deny list» |
| `sandbox.credentials.envVars` | `deny` для токенов | переменные удаляются из окружения команд | S, «Protect credentials» |
| `permissions.deny` с `Read(~/...)` | те же каталоги | песочница не закрывает встроенные инструменты Claude: «A `denyRead` entry doesn't stop the Read tool» | S; синтаксис `~/path` — P |
| `sandbox.credentials.files` | `deny` для `~/.ssh`, `~/.aws`, `~/.azure`, `~/.config/gcloud`, `~/.kube`, `~/.docker/config.json`, `~/.netrc`, `~/.npmrc`, `~/.pypirc`, `~/.git-credentials`, `~/.vault-token`, `~/.config/gh` | по умолчанию песочница **разрешает** их читать | S: «Reads: Most of the machine, including credential files such as `~/.ssh` and `~/.aws/credentials`»; «There is no built-in credential deny list» |
| `sandbox.credentials.envVars` | `deny` для `ANTHROPIC_API_KEY`, `GITHUB_TOKEN`, `GH_TOKEN`, `NPM_TOKEN`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN` | переменные удаляются из окружения команд. `ANTHROPIC_API_KEY` нужен самому Claude Code, но не его командам | S, «Protect credentials» |
| `permissions.deny` | `Read(~/.ssh/**)`, `Read(~/.aws/**)`, `Read(~/.azure/**)`, `Read(~/.config/gcloud/**)`, `Read(~/.kube/**)`, `Read(~/.docker/config.json)`, `Read(~/.netrc)`, `Read(~/.npmrc)`, `Read(~/.pypirc)`, `Read(~/.git-credentials)`, `Read(~/.vault-token)`, `Read(~/.config/gh/**)`, `Read(**/.env)`, `WebFetch`, `WebSearch` | песочница не закрывает встроенные инструменты Claude: «A `denyRead` entry doesn't stop the Read tool», «`allowedDomains` doesn't limit WebFetch». `WebFetch` и `WebSearch` запрещены целиком, как и сеть команд; для пилота разрешённые адреса добавляются правилами `WebFetch(domain:…)` | S; синтаксис `Read(**/.env)` и `WebFetch(domain:…)` — P |

Чего этот файл не закрывает. `apiKeyHelper` и `statusLine` из настроек репозитория: отдельного managed-ключа, который запрещал бы `apiKeyHelper`, в R нет; `statusLine` не из managed settings не запускается при `allowManagedHooksOnly` (R, `statusLine`: «When `allowManagedHooksOnly` is on … only the managed settings value runs»). Остаётся полагаться на защиту файлов `.claude` от записи командами (S, «Protected paths») и на просмотр репозитория до запуска. Это не проверено прогоном Claude Code.

## На чём держится граница

Expand Down
Loading
Loading