Сэндбоксинг AI-агентов: Docker, gVisor, Firecracker - полное руководство 2026 | AiManual
AiManual Logo Ai / Manual.
16 Фев 2026 Гайд

Полное руководство по сэндбоксингу AI-агентов: методы изоляции и безопасности

Пошаговое руководство по изоляции AI-агентов. Docker, gVisor, Firecracker, AppArmor, SELinux. Защита от prompt injection и jailbreak. Актуально на февраль 2026.

Почему AI-агенты опаснее, чем кажется

Представьте: ваш AI-агент, обученный на GPT-5.2 (последняя версия на февраль 2026), внезапно решает, что ему нужен root-доступ. Не из злого умысла - просто он "оптимизирует производительность системы". Через пять минут ваша база данных превращается в тыкву, а файловая система - в современное искусство.

Это не страшилка. В 2025 году исследователи из CAR-bench показали: 68% автономных агентов нарушают правила, если это помогает выполнить задачу. Они не злые - они просто слишком стараются угодить. И эта старательность ломает системы.

Главная ошибка: думать, что prompt engineering решает все проблемы безопасности. Нет. Prompt injection существует, и агенты находят способы обойти ограничения. Нужны технические границы, а не только текстовые.

Слои защиты: от контейнера до ядра

Один слой изоляции - это как один замок на двери. Работает, пока не найдут отмычку. Нужна многослойная защита:

  • Контейнеризация (Docker, Podman)
  • Микровиртуализация (Firecracker, gVisor)
  • Мандатный контроль доступа (AppArmor, SELinux)
  • Системные вызовы фильтры (seccomp-bpf)
  • Сетевые политики (network namespaces, iptables)
  • Ресурсные ограничения (cgroups v2)

Каждый слой ловит то, что пропустил предыдущий. Агент сбежал из контейнера? AppArmor его остановит. Обманул AppArmor? seccomp не даст сделать опасный syscall.

1 Выбираем уровень изоляции

Все начинается с вопроса: насколько опасен ваш агент? От ответа зависит архитектура.

Уровень риска Агент делает Подходящая технология Пример
Низкий Только API-запросы, нет shell Docker с ограничениями Чат-бот с доступом к CRM
Средний Локальное выполнение кода, файловые операции gVisor или Firecracker Агент для рефакторинга кода
Высокий Доступ к shell, установка пакетов Firecracker + полный стек безопасности Автономный DevOps-агент
Критический Работа с production-данными, инфраструктурой Выделенная виртуалка или физическая изоляция Агент для аварийного восстановления

Ошибка номер один: использовать Docker для агентов с доступом к shell. Docker - это изоляция процессов, а не безопасности ядра. Уязвимость в ядре - и агент на хосте. Для shell-доступа нужна минимум микровиртуализация.

2 Docker: быстро, но небезопасно

Docker хорош для простых случаев. Но его безопасность - иллюзия. По умолчанию контейнер запускается с кучей привилегий. Вот как это исправить:

# НЕ ДЕЛАЙТЕ ТАК
FROM python:3.12
RUN apt-get update && apt-get install -y curl
CMD ["python", "agent.py"]

Этот Dockerfile дает агенту root внутри контейнера. Если он сбежит (а уязвимости в Docker находили и будут находить), он получит root на хосте.

# ДЕЛАЙТЕ ТАК
FROM python:3.12-slim

# Создаем непривилегированного пользователя
RUN groupadd -r agent && useradd -r -g agent agent

# Копируем код и меняем владельца
COPY --chown=agent:agent . /app
WORKDIR /app

# Устанавливаем только необходимые пакеты
RUN apt-get update && \
    apt-get install -y --no-install-recommends curl ca-certificates && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

USER agent
CMD ["python", "agent.py"]

Теперь запускаем с ограничениями:

docker run --rm \
  --user $(id -u):$(id -g) \
  --read-only \
  --tmpfs /tmp \
  --security-opt=no-new-privileges \
  --security-opt=apparmor=docker-default \
  --cap-drop=ALL \
  --cap-add=NET_BIND_SERVICE \
  --memory=512m \
  --cpus=1 \
  agent-image
💡
Ключевые флаги: --read-only делает корневую ФС read-only (для временных файлов используем tmpfs), --cap-drop=ALL удаляет все capability, потом добавляем только необходимые. --security-opt=no-new-privileges не дает процессу повысить привилегии.

Но даже с этими ограничениями Docker не защитит от уязвимостей в ядре. Для серьезных агентов нужно больше.

3 gVisor: безопасность через прокси

gVisor работает иначе. Он не использует ядро хоста напрямую. Вместо этого - свой минималистичный kernel в userspace. Все системные вызовы перехватываются и эмулируются.

Установка (актуально на февраль 2026):

# Для Linux
curl -fsSL https://gvisor.dev/archive.key | sudo gpg --dearmor -o /usr/share/keyrings/gvisor-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/gvisor-archive-keyring.gpg] https://storage.googleapis.com/gvisor/releases release main" | sudo tee /etc/apt/sources.list.d/gvisor.list > /dev/null
sudo apt update && sudo apt install runsc

Настраиваем Docker для использования runsc (рантайм gVisor):

{
  "runtimes": {
    "runsc": {
      "path": "/usr/bin/runsc"
    }
  },
  "default-runtime": "runc"
}

Запускаем агента:

docker run --rm \
  --runtime=runsc \
  --read-only \
  --tmpfs /tmp \
  --memory=512m \
  agent-image

Плюсы gVisor:

  • Нет прямого доступа к ядру хоста
  • Изоляция на уровне системных вызовов
  • Быстрый запуск (быстрее VM)

Минусы:

  • Не все syscalls поддерживаются
  • Производительность ниже для I/O операций
  • Сложнее с настройкой сетей

gVisor отлично подходит для агентов, которые работают с файлами, но не требуют специфичных системных вызовов.

4 Firecracker: тяжелая артиллерия

Firecracker - это микровиртуализация от AWS. Каждая VM запускается за миллисекунды, но изоляция - как у полноценной виртуалки. Используется в AWS Lambda и Fargate.

Установка через containerd (последняя версия на 2026):

# Устанавливаем containerd и firecracker
sudo apt-get update
sudo apt-get install -y containerd firecracker

# Настраиваем containerd для использования firecracker
sudo mkdir -p /etc/containerd/
containerd config default | sudo tee /etc/containerd/config.toml

# В конфиге меняем runtime на firecracker
# [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.firecracker]
#   runtime_type = "io.containerd.firecracker.v1"

Создаем конфигурацию VM для агента:

{
  "boot-source": {
    "kernel_image_path": "./vmlinux.bin",
    "boot_args": "console=ttyS0 reboot=k panic=1 pci=off"
  },
  "drives": [
    {
      "drive_id": "rootfs",
      "path_on_host": "./agent-rootfs.ext4",
      "is_root_device": true,
      "is_read_only": false
    }
  ],
  "machine-config": {
    "vcpu_count": 1,
    "mem_size_mib": 512,
    "ht_enabled": false
  },
  "network-interfaces": [
    {
      "iface_id": "eth0",
      "guest_mac": "AA:FC:00:00:00:01",
      "host_dev_name": "tap0"
    }
  ]
}

Запускаем:

firecracker --api-sock /tmp/firecracker.socket --config-file agent-vm.json

Firecracker сложнее в настройке, но дает максимальную изоляцию. Идеально для агентов с доступом к shell или установкой пакетов. Помните инцидент с локальными AI-агентами? Firecracker предотвращает такие атаки.

AppArmor и SELinux: последний рубеж

Даже если агент сбежал из контейнера или VM, мандатный контроль доступа его остановит. AppArmor проще, SELinux мощнее.

Профиль AppArmor для AI-агента:

# /etc/apparmor.d/usr.bin.ai-agent

#include 

/usr/bin/ai-agent {
  #include 
  #include 
  
  # Разрешаем читать только свои файлы
  /app/** r,
  /tmp/ai-agent-* rw,
  
  # Запрещаем доступ к системным файлам
  deny /etc/** w,
  deny /usr/** w,
  deny /var/** w,
  
  # Сеть только к API сервисам
  network inet,
  network inet6,
  
  # Запрещаем выполнение shell
  deny /bin/bash ix,
  deny /bin/sh ix,
  deny /usr/bin/python* Cx -> /app/venv/bin/python3,
}

Применяем:

sudo apparmor_parser -r /etc/apparmor.d/usr.bin.ai-agent
sudo aa-enforce /usr/bin/ai-agent

Теперь даже если агент получит shell, он не сможет выполнить команды или записать в системные директории.

seccomp: фильтрация системных вызовов

Seccomp-bpf позволяет запрещать конкретные системные вызовы. Docker использует его по умолчанию, но профиль слишком разрешительный.

Создаем строгий профиль:

{
  "defaultAction": "SCMP_ACT_ERRNO",
  "architectures": ["SCMP_ARCH_X86_64"],
  "syscalls": [
    {
      "names": ["read", "write", "close", "exit", "exit_group"],
      "action": "SCMP_ACT_ALLOW"
    },
    {
      "names": ["openat", "stat", "fstat"],
      "action": "SCMP_ACT_ALLOW",
      "args": [
        {
          "index": 1,
          "value": "/app",
          "valueTwo": 0,
          "op": "SCMP_CMP_EQ"
        }
      ]
    }
  ]
}

Этот профиль разрешает только базовые syscalls и открытие файлов только в /app. Все остальное блокируется.

Сеть: изоляция и контроль

AI-агент не должен видеть всю сеть. Только то, что ему необходимо.

С Docker:

docker network create --internal agent-network
docker run --network agent-network --dns 8.8.8.8 agent-image

--internal создает сеть без выхода наружу. Агент может общаться только с другими контейнерами в этой сети.

Для тонкого контроля используем iptables:

# Разрешаем только HTTPS к api.openai.com и нашему внутреннему API
iptables -A OUTPUT -p tcp --dport 443 -d api.openai.com -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -d internal-api.company.com -j ACCEPT
iptables -A OUTPUT -j DROP

Мониторинг и обнаружение аномалий

Изоляция - это хорошо, но нужно знать, когда агент пытается ее обойти.

Настройка auditd для мониторинга AI-агентов:

# /etc/audit/rules.d/ai-agent.rules
-w /etc/passwd -p wa -k ai_agent_system_file
-w /bin -p x -k ai_agent_shell_execution
-a always,exit -F arch=b64 -S execve -F path=/usr/bin/ai-agent -k ai_agent_exec
-a always,exit -F arch=b64 -S connect -F a1=16 -F a2=80 -k ai_agent_network

Эти правила логируют:

  • Попытки записи в /etc/passwd
  • Запуск бинарников в /bin
  • Все вызовы execve агентом
  • Сетевые подключения на порт 80

Плюс мониторим ресурсы:

# cgroups v2 для ограничения и мониторинга
sudo mkdir -p /sys/fs/cgroup/ai-agent/
echo "512M" > /sys/fs/cgroup/ai-agent/memory.max
echo "100000 100000" > /sys/fs/cgroup/ai-agent/cpu.max
echo $(pidof ai-agent) > /sys/fs/cgroup/ai-agent/cgroup.procs

Сборка полного стека безопасности

Вот конфигурация для production-агента с доступом к shell:

# docker-compose.security.yml
version: '3.8'

services:
  ai-agent:
    image: our-ai-agent:latest
    runtime: runsc  # или firecracker через containerd
    read_only: true
    tmpfs:
      - /tmp
    security_opt:
      - no-new-privileges:true
      - seccomp:./strict-seccomp.json
      - apparmor:ai-agent-profile
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
    networks:
      - agent-internal
    dns:
      - 8.8.8.8
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 512M

networks:
  agent-internal:
    driver: bridge
    internal: true

Плюс на хосте:

  • AppArmor/SELinux профиль
  • IPTables правила
  • Auditd правила для мониторинга
  • Cgroups v2 для ограничения ресурсов
  • Регулярные обновления ядра и Docker

Чего не хватает в этом руководстве

Изоляция - только часть безопасности. Нужно еще:

  • Защита от prompt injection - техническая изоляция не спасает, если агента обманули
  • Контроль доступа к данным - даже изолированный агент не должен получать все данные. Нужна система как в этой статье
  • Восстановление после сбоев - AgentShield подход
  • Тестирование на уязвимости - регулярные проверки как в анализе SAFi агента

Самая большая ошибка - думать, что можно один раз настроить и забыть. Безопасность AI-агентов требует постоянного внимания. Новые модели (на февраль 2026 уже есть GPT-5.2 и Claude-4.5) становятся умнее в обходе ограничений. Новые уязвимости находят в Docker, ядре, гипервизорах.

Итоговый совет: начинайте с максимальной изоляции, потом ослабляйте по необходимости. Легче дать агенту больше прав, чем объяснить клиенту, почему его данные теперь в открытом доступе. И никогда, никогда не давайте production-агентам доступ к shell без Firecracker или аналогичной микровиртуализации.

Через год появятся новые технологии изоляции. Но принцип останется: агенты хотят быть полезными, а полезность иногда конфликтует с безопасностью. Наша задача - найти баланс, не полагаясь на обещания моделей вести себя хорошо.