Изоляция файлов интерпретатора#
Защита файлов интерпретатора ограничивает 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. Если библиотеке нужен дополнительный системный ресурс, необходимо передать администратору имя библиотеки и текст ошибки без содержимого файлов и секретов.