Enterprise-бастион для кода: Claude работает над проектом без доступа к файлам и шеллу
Защитный слой между AI-агентом и кодовой базой предприятия. Claude разбирается в коде и решает задачу — но лишён штатных инструментов. Всё, что он хочет сделать, проходит через фильтрующего посредника и исполняется в изолированном контейнере; агент получает только результат.
Проблема
Крупная организация не может дать AI-инструменту неконтролируемый доступ к исходному коду, секретам и инфраструктуре. Но при этом хочет, чтобы Claude разбирался в проекте и выполнял в нём реальную работу. Наивная схема даёт агенту штатные инструменты файлов и шелла — а это ровно тот доступ, который безопасность не согласует: ничто не мешает агенту прочитать секрет, записать за пределами задачи или запустить деструктивную команду.
Методология
Ограничивать агента не промптом, а архитектурой. Полностью убрать штатные инструменты и пропустить любое взаимодействие через фильтрующего посредника, который исполняет команды в песочнице.
-
1. Единица работы — «проект + задача». Есть каталог
projects/и каталогtasks/. Под каждую пару стартует выделенный Docker-контейнер, куда монтируется только этот проект в/workspace. Сессии не видят друг друга. -
2. Claude без инструментов. Claude Code запускается
с
--tools ""— штатные чтение, запись файлов и запуск команд отключены. Сам по себе агент не может ни прочитать, ни изменить, ни выполнить ничего в системе. -
3. Доступ только через MCP. Вместо штатных
инструментов Claude обращается к MCP-серверу по HTTP (в продакшене — вынесенному за
пределы проекта). Сервер привязан к сессии и работает с её контейнером. Доступные
инструменты:
ping,echo,secureBash. - 4. Строгая фильтрация. Каждая команда перед исполнением проходит проверку (в продакшене — отдельной небольшой LLM-моделью, выступающей фильтром). Деструктивные и выходящие за рамки задачи действия отсекаются до запуска.
-
5. Изолированное исполнение. Прошедшая фильтр
команда выполняется через
docker execвнутри контейнера сессии, а не на хосте. Результат возвращается Claude.
Гарантии enterprise-уровня:
| Контроль | Как обеспечивается |
|---|---|
| Изоляция рабочих нагрузок | Отдельный контейнер на каждую пару «проект+задача»; смонтирован только нужный проект; сессии изолированы |
| Наименьшие привилегии | Нет штатных tools (--tools ""); единственный путь — MCP-сервер с ограниченным набором операций |
| Контроль периметра | MCP-guard вынесен за пределы проекта; доступ к коду, секретам и инфраструктуре не передаётся агенту напрямую |
| Фильтрация операций | Каждая команда проходит проверку (в продакшене — отдельной LLM); деструктивные действия отсекаются до исполнения |
| Аудируемость | Все запросы к MCP логируются (logs/mcp.log, JSON Lines) — полный след для разбора и комплаенса |
| Отзыв доступа | Реестр сессий (sessions.csv) и контейнеры, которые можно остановить/удалить в любой момент |
Команда запуска Claude — обратите внимание, чего в ней нет:
# старт изолированной сессии под пару «проект+задача»
./scripts/start_session.py demo demo-001
# → генерирует idp-<uuid>, запускает контейнер с projects/demo → /workspace
# → добавляет запись в sessions.csv
# сборка и запуск команды Claude
eval "$(./scripts/claude_command.py demo demo-001)"
# сгенерированная команда выглядит так:
IDP_SESSION_ID=idp-aae519cd... \
claude --append-system-prompt "..." \
-p "Выясни, есть ли в этом проекте файл packages.json" \
--tools ""
# IDP_SESSION_ID привязка к сессии; подставляется в URL MCP-сервера из .mcp.json
# --append-system-prompt добавляет правила guard'а из system-prompt.md
# -p текст задачи из tasks/demo-001.md
# --tools "" отключает штатные tools; остаётся только MCP (secureBash, ...)
Артефакт
github.com/dobryakov/enterprise-code-bastion
(Python, Docker, MCP-over-HTTP). Рабочий бастион: лаунчер сессий, сборщик команды,
MCP-сервер с secureBash и
CSV-реестр сессий — запускается, а не слайд.
Где это ломается
- Фильтр сам по себе — модель. Если командный gate — это LLM, у него своя поверхность prompt-injection / jailbreak. Для жёсткой гарантии рядом с моделью нужен детерминированный allowlist, а не модель как единственный арбитр — архитектурный разговор именно о том, где проходит эта граница.
-
secureBashвсё равно исполняет произвольные команды внутри контейнера. Изоляция настолько сильна, насколько закалён контейнер: non-privileged, контролируемый сетевой egress, лимиты ресурсов. Скомпрометированный контейнер всё ещё blast radius — граница защищает хост, а не всё внутри коробки. -
Плоский реестр не масштабируется до governance.
sessions.csv— нормальный append-only журнал, но в нём нет контроля конкурентности, нет RBAC, нет кто-что-согласовал. На масштабе организации нужен настоящий session store и workflow согласований за ним.
Кому и зачем
Это модель безопасности для AI-над-кодом там, где должна согласовать безопасность: изоляция, наименьшие привилегии, фильтрация каждой операции, полный аудит. Это не туториал «как запустить агента» — это архитектурный разговор о том, где проходит граница между «дать агенту достаточно, чтобы он был полезен» и «оставить его физически неспособным действовать за рамками». Итог: Claude рассуждает и решает, но не может сделать ничего за пределами разрешённого — нет инструментов, нет прямого доступа, каждая команда проверяется и запускается в песочнице.
Пустить AI-агентов к кодовой базе — безопасно?
Изоляция, наименьшие привилегии, фильтрация каждой операции и аудит для AI-над-кодом — с рабочим артефактом, а не презентацией политик.
Написать мнеДругие разборы
Серия инженерных разборов: реальная задача → методология → рабочий артефакт → честный разбор того, где это ломается.
К серии →