Sandbox
В этом документе объясняется, как запускать Qwen Code в изолированной среде (sandbox), чтобы снизить риски при выполнении shell-команд или изменении файлов с помощью инструментов.
Предварительные требования
Перед использованием изолированной среды необходимо установить и настроить Qwen Code:
npm install -g @qwen-code/qwen-codeЧтобы проверить установку:
qwen --versionОбзор изолированной среды
Изолированная среда изолирует потенциально опасные операции (такие как shell-команды или изменение файлов) от вашей хост-системы, обеспечивая защитный барьер между CLI и вашим окружением.
Преимущества изолированной среды:
- Безопасность: предотвращает случайное повреждение системы или потерю данных.
- Изоляция: ограничивает доступ к файловой системе только каталогом проекта.
- Воспроизводимость: обеспечивает воспроизводимые окружения на разных системах.
- Безопасность: снижает риск при работе с ненадёжным кодом или экспериментальными командами.
Примечание по именованию: Некоторые переменные окружения, связанные с изоляцией, исторически могли использовать префикс GEMINI_*. Все новые переменные окружения используют префикс QWEN_*.
Методы изоляции
Идеальный метод изоляции может различаться в зависимости от вашей платформы и предпочтительного контейнерного решения.
1. macOS Seatbelt (только macOS)
Лёгкая, встроенная изоляция с использованием sandbox-exec.
Профиль по умолчанию: permissive-open — ограничивает запись за пределами каталога проекта, но разрешает большинство других операций и исходящий сетевой доступ.
Лучше всего подходит для: Быстро, не требует Docker, надёжные ограничения на запись файлов.
2. Контейнерная изоляция (Docker/Podman)
Кроссплатформенная изоляция с полной изоляцией процессов.
По умолчанию Qwen Code использует опубликованный образ изоляции (настроенный в пакете CLI) и загружает его при необходимости.
Контейнерная изоляция монтирует вашу рабочую область и каталог ~/.qwen внутрь контейнера, чтобы аутентификация и настройки сохранялись между запусками.
Лучше всего подходит для: Сильная изоляция на любой ОС, единообразный набор инструментов внутри известного образа.
Выбор метода
- На macOS:
- Используйте Seatbelt, когда нужна лёгкая изоляция (рекомендуется для большинства пользователей).
- Используйте Docker/Podman, когда требуется полноценное окружение Linux (например, инструменты, требующие бинарных файлов Linux).
- На Linux/Windows:
- Используйте Docker или Podman.
Быстрый старт
# Включение изоляции с помощью флага команды
qwen -s -p "проанализировать структуру кода"
# Или включение изоляции для вашей shell-сессии (рекомендуется для CI / скриптов)
export QWEN_SANDBOX=true # true автоматически выбирает провайдера (см. примечания ниже)
qwen -p "запустить тестовый набор"
# Настройка в settings.json
{
"tools": {
"sandbox": true
}
}Примечания по выбору провайдера:
- На macOS,
QWEN_SANDBOX=trueобычно выбираетsandbox-exec(Seatbelt), если он доступен. - На Linux/Windows,
QWEN_SANDBOX=trueтребует установкиdockerилиpodman. - Чтобы принудительно указать провайдера, установите
QWEN_SANDBOX=docker|podman|sandbox-exec.
Конфигурация
Включение изоляции (в порядке приоритета)
- Переменная окружения:
QWEN_SANDBOX=true|false|docker|podman|sandbox-exec - Флаг / аргумент команды:
-s,--sandboxили--sandbox=<provider> - Файл настроек:
tools.sandboxв вашемsettings.json(например,{"tools": {"sandbox": true}}).
Если установлена QWEN_SANDBOX, она переопределяет флаг CLI и settings.json.
Настройка образа изоляции (Docker/Podman)
- Флаг CLI:
--sandbox-image <image> - Переменная окружения:
QWEN_SANDBOX_IMAGE=<image> - Файл настроек:
tools.sandboxImageв вашемsettings.json(например,{"tools": {"sandboxImage": "ghcr.io/qwenlm/qwen-code:0.14.1"}})
Порядок приоритета (от высшего к низшему):
--sandbox-imageQWEN_SANDBOX_IMAGEtools.sandboxImage- Встроенный образ по умолчанию из пакета CLI (например,
ghcr.io/qwenlm/qwen-code:<version>)
settings.env.QWEN_SANDBOX_IMAGE также работает как общий механизм внедрения переменных окружения, но tools.sandboxImage является предпочтительной постоянной настройкой.
Профили macOS Seatbelt
Встроенные профили (задаются через переменную окружения SEATBELT_PROFILE):
permissive-open(по умолчанию): ограничения на запись, сеть разрешенаpermissive-closed: ограничения на запись, без сетиpermissive-proxied: ограничения на запись, сеть через проксиrestrictive-open: строгие ограничения, сеть разрешенаrestrictive-closed: максимальные ограниченияrestrictive-proxied: строгие ограничения, сеть через прокси
Начните с permissive-open, затем ужесточите до restrictive-closed, если ваш workflow всё ещё работает.
Пользовательские профили Seatbelt (macOS)
Чтобы использовать пользовательский профиль Seatbelt:
- Создайте файл с именем
.qwen/sandbox-macos-<profile_name>.sbв вашем проекте. - Установите
SEATBELT_PROFILE=<profile_name>.
Пользовательские флаги изоляции
Для контейнерной изоляции вы можете внедрить пользовательские флаги в команду docker или podman, используя переменную окружения SANDBOX_FLAGS. Это полезно для расширенных конфигураций, например, для отключения функций безопасности в определённых сценариях.
Пример (Podman):
Чтобы отключить маркировку SELinux для монтирования томов, установите следующее:
export SANDBOX_FLAGS="--security-opt label=disable"Множественные флаги можно передавать в виде строки, разделённой пробелами:
export SANDBOX_FLAGS="--flag1 --flag2=value"Сетевой прокси (все методы изоляции)
Если вы хотите ограничить исходящий сетевой доступ только разрешёнными адресами, вы можете запустить локальный прокси-сервер вместе с изолированной средой:
- Установите
QWEN_SANDBOX_PROXY_COMMAND=<command> - Команда должна запустить прокси-сервер, который слушает на
:::8877
Это особенно полезно с профилями Seatbelt *-proxied.
Рабочий пример прокси-скрипта на основе белого списка см.: Пример прокси-скрипта.
Обработка UID/GID в Linux
На Linux Qwen Code по умолчанию включает сопоставление UID/GID, чтобы изолированная среда работала от вашего пользователя (и повторно использовала смонтированный ~/.qwen). Переопределить можно так:
export SANDBOX_SET_UID_GID=true # Принудительно использовать UID/GID хоста
export SANDBOX_SET_UID_GID=false # Отключить сопоставление UID/GIDУстранение неполадок
Частые проблемы
“Operation not permitted”
- Операция требует доступа за пределами изолированной среды.
- Для macOS Seatbelt: попробуйте более разрешающий профиль
SEATBELT_PROFILE. - Для Docker/Podman: убедитесь, что рабочая область смонтирована, и ваша команда не требует доступа за пределами каталога проекта.
Отсутствующие команды
- Контейнерная изоляция: добавьте их через
.qwen/sandbox.Dockerfileили.qwen/sandbox.bashrc. - Seatbelt: используются бинарные файлы хоста, но изолированная среда может ограничивать доступ к некоторым путям.
Java недоступна в Docker-изоляции
Официальный Docker-образ Qwen Code намеренно минимален, чтобы образ был маленьким, безопасным и быстро загружался. Разные пользователи требуют разных языковых сред выполнения (Java, Python, Node.js и т. д.), и объединение всех окружений в один образ непрактично. Поэтому Java не включена по умолчанию в Docker-изоляцию.
Если ваш workflow требует Java, вы можете расширить базовый образ, создав файл .qwen/sandbox.Dockerfile в вашем проекте:
FROM ghcr.io/qwenlm/qwen-code:latest
RUN apt-get update && \
apt-get install -y openjdk-17-jre && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*Затем пересоберите образ изоляции:
QWEN_SANDBOX=docker BUILD_SANDBOX=1 qwen -sБолее подробно о настройке изолированной среды см. Кастомизация окружения изоляции.
Сетевые проблемы
- Проверьте, разрешает ли профиль изоляции сетевой доступ.
- Проверьте конфигурацию прокси.
Режим отладки
DEBUG=1 qwen -s -p "отладочная команда"Примечание: Если у вас есть DEBUG=true в файле .env проекта, это не повлияет на CLI из-за автоматического исключения. Используйте файлы .qwen/.env для настроек отладки, специфичных для Qwen Code.
Проверка изолированной среды
# Проверка окружения
qwen -s -p "запустить shell-команду: env | grep SANDBOX"
# Список точек монтирования
qwen -s -p "запустить shell-команду: mount | grep workspace"Заметки по безопасности
- Изолированная среда снижает, но не устраняет все риски.
- Используйте наиболее строгий профиль, который позволяет выполнять вашу работу.
- Накладные расходы на контейнер минимальны после первой загрузки/сборки.
- GUI-приложения могут не работать в изолированных средах.
Связанная документация
- Конфигурация: Полные параметры конфигурации.
- Команды: Доступные команды.
- Устранение неполадок: Общие рекомендации по устранению неполадок.