Изоляция файлов интерпретатора#

Защита файлов интерпретатора ограничивает Python-код файлами текущего Чата, временными данными и необходимыми библиотеками. Настройку выполняет администратор сервера с доступом к Docker и каталогу установки.

Подготовка сервера#

Для запуска защищенного интерпретатора необходим Linux с включенным Landlock ABI 1 или новее. Политика применяется до выполнения кода и наследуется дочерними процессами. Если ядро, архитектура или политика Docker не поддерживают ограничение, Python-код не выполняется.

На ядрах с Landlock ABI 1 или 2 перед выполнением кода дополнительно проверяется конфигурация контейнера. Процесс должен работать от пользователя с UID 1000. Все дополнительные привилегии Linux capabilities должны быть отключены. Корневая файловая система контейнера и служебный скрипт /opt/main.py должны быть подключены только для чтения. Дополнительные подключения с возможностью записи вне штатной конфигурации Docker не допускаются. Поставляемая конфигурация запуска Docker задает эти ограничения. Если проверка не пройдена, код не выполняется. Перехода к запуску без изоляции нет.

Необходимо согласованно обновить образ aiserver, образ aiserver-code-interpreter и docker-compose.yml из одного комплекта поставки. Образ mypy должен содержать необходимые библиотеки. Сборка описана в инструкции подготовки образа.

Настройка сервисного токена#

Для связи backend с интерпретатором необходим AI_INTERPRETER_SERVICE_TOKEN длиной не менее 32 символов. Установщик и скрипт обновления создают случайный токен в .env, сохраняют существующее значение и устанавливают для файла права 600. Короткое существующее значение вызывает отказ настройки.

При ручной установке необходимо сгенерировать токен:

python3 -c 'import secrets; print(secrets.token_hex(32))'

Результат необходимо сохранить в .env как значение AI_INTERPRETER_SERVICE_TOKEN. Одинаковое значение должно поступать в сервисы aiserver и aiserver-code-interpreter. Токен не следует отправлять в Чат или включать в диагностические журналы.

После загрузки согласованного комплекта образов и настройки .env необходимо пересоздать оба сервиса в согласованное окно обслуживания:

docker compose up -d --no-deps --force-recreate aiserver aiserver-code-interpreter

Во время пересоздания backend временно недоступен. Простой перезапуск старого контейнера не применяет новые образы и параметры. Порт 3001 не публикуется на хосте. Обращения к интерпретатору проходят через backend.

Работа с файлами Чата#

В Чате файлы доступны Python в /sandbox. Они сохраняются между запросами одного Чата. Другой Чат получает отдельную папку.

В режиме интерпретатора прикрепленные файлы и содержимое папок Ассистента, включая подпапки, переносятся в папку текущего Чата. По умолчанию обрабатывается до 40 файлов за запрос. Предел задается LLM_MAX_ATTACHMENT_FILES. Отсутствующие на диске файлы пропускаются. Новый файл с совпадающим именем заменяет прежний. В режиме Агента передача выбранного файла выполняется отдельным инструментом.

Загрузка и скачивание поддерживают обычные файлы размером до 100 МиБ и имена на русском языке. Символические ссылки, специальные файлы и пути за пределы папки Чата не выдаются. Необходимо сохранять результаты непосредственно в /sandbox под именем без вложенных каталогов.

Для проверки необходимо загрузить небольшой CSV в режиме интерпретатора и запросить расчет суммы и сохранение результата в XLSX. Результат должен скачиваться. Повторный запрос в том же Чате должен видеть CSV. Новый Чат без загрузки файла не должен видеть его.

Ограничения и восстановление работы#

Перечисление /etc, /opt, /home и чтение /etc/passwd или служебных скриптов запрещены. Для импорта разрешены необходимые каталоги библиотек, шрифтов и выбранные утилиты. Разрешенные библиотеки доступны коду. Их состав и отдельные файловые метаданные не являются секретом. Токены, пароли и конфигурацию приложения нельзя помещать в образ mypy.

Если появляется сообщение Sandbox requires enabled Landlock ABI 1 or newer, администратору необходимо проверить поддержку Landlock ядром и разрешение его системных вызовов политикой Docker. При отсутствии поддержки необходимо обновить среду. При ошибке проверки контейнера на ABI 1 или 2 необходимо восстановить ограничения поставляемой конфигурации Docker.

При ошибке авторизации необходимо проверить наличие одинакового токена в обоих сервисах и пересоздать их после изменения .env. Если библиотеке нужен дополнительный системный ресурс, необходимо передать администратору имя библиотеки и текст ошибки без содержимого файлов и секретов.