Безопасность и лицензирование

MultiAgent хранит чувствительные данные всей инфраструктуры: SSH-ключи серверов, пароли агентов, токены реестров и API-ключи. Эта страница — о том, как всё это защищено, как настроено резервное копирование и как устроены лицензии.

Шифрование секретов

Все секреты шифруются на хранении симметричным шифрованием AES-256-GCM. 32-байтный ключ лежит в /data/keys/management-secret.key — внутри volume MultiAgent, вне базы данных. Что защищено:

  • SSH-пароли и приватные ключи серверов (включая учётные данные proxy jump);
  • пароли Postgres и Forgejo на серверах;
  • токены реестров образов (Registry Auth);
  • пароли менеджеров агентов и переменные-секреты моделей и инструментов;
  • ключи программного интерфейса и пароли служб сервера (Postgres, Forgejo, центральный вход, резервное копирование).

Проверка входа пользователей — JWT-токены со сроком 90 дней, подписанные отдельным ключом из /data/keys. Все действия API требуют проверки ключа; анонимна только страница входа, а программный интерфейс /api/agent/* открывается отдельным ключом X-API-Key.

Agent API — программный интерфейс

Программный интерфейс /api/agent/* предназначен для автоматических вызовов — например, из агентов и внешних систем. Каждый запрос проверяется заголовком X-API-Key: в переменной окружения MULTIAGENT_HASH хранится только «отпечаток» ключа (SHA-256), а сам ключ задаётся один раз при установке. Без переменной интерфейс отвечает 503 и не работает вовсе.

Особенности безопасности: GET /api/agent возвращает каталог всех операций с описаниями; секреты можно только записать — назад они не выдаются, только приметы «есть значение»; удалённого выполнения кода нет — только заранее определённые операции; долгие операции запускаются по схеме «запустил — проверяй» по адресу operations/{id}. Подробнее — Agent API.

Публичность портов

Агенты, приложения и инструменты по умолчанию не видны из интернета: их порты публикуются только на самом сервере (на адресе 127.0.0.1) и доступны его приложениям и nginx. Наружу порт открывается по желанию — переключателем «Публичный порт» у нужной привязки. Он есть и в мастере создания, и позже на вкладке «Порты» у агента или приложения: у каждой привязки свой переключатель, а новые строки появляются закрытыми. Изменение вступает в силу при следующем пересоздании, а смена основного порта сразу обновляет маршрут. Так развёртывания на одной машине не видят друг друга: чужой контейнер до закрытого порта не достучится.

Публичными всегда остаются только сам nginx (входная дверь) и служба резервного копирования — они и должны быть доступны снаружи. Всё остальное закрыто, а управление закрытыми портами идёт через защищённый туннель, поэтому закрытый порт не мешает MultiAgent проверять состояние агента и управлять им.

Резервное копирование

На каждом сервере MultiAgent поднимает службу резервного копирования — rsync с семью разделами, доступными только на чтение: папки docker, домашней страницы, данных, проектов и инструментов, а также две папки дампов (Postgres и Forgejo). Ваши машины-бэкаперы забирают данные по расписанию — типичной ночной задачей:

# nightly backup of all server data
rsync -avz rsync://backup@server-host:873/data/    /backups/server-host/data/
rsync -avz rsync://backup@server-host:873/projects/ /backups/server-host/projects/

Сам MultiAgent бэкапится вместе с volume /data: база, ключи шифрования и лицензия лежат там же. Подробнее о структуре данных — в документации.

Лицензии агентов

Раздел «Лицензии» — центральное хранилище лицензионных ключей Pastukhov Agent. Ключ проверяется при добавлении, шифруется на хранении и никогда не возвращается из API — интерфейс показывает только распарсенные метаданные (тип, владелец, срок, покрытые продукты) и никогда сам ключ. На странице лицензий и в диалоге деталей показывается поле «Продукты»: перечень продуктов из ключа, а у универсального ключа — «Универсальная». Ключ, подписанный верно, но не покрывающий нужный продукт, выдаёт ошибку покрытия вместо срока действия — статус говорит, что именно не так. Один ключ назначается любому числу агентов и автоматически попадает в их переменную AGENT_LICENSE при развёртывании. Лицензия, назначенная хотя бы одному агенту или выбранная лицензией по умолчанию на сервере, не удалится, пока её не отсоединить.

Ключ можно не только вставить, но и выпустить прямо в интерфейсе: если на узле лежит закрытый ключ подписи, в диалоге лицензии появляется пункт «Сгенерировать лицензию». В нём заполняются тип, кому выдана, email, описание и срок; готовый ключ сразу уходит в зашифрованное хранилище и становится лицензией сервера по умолчанию — наружу сам ключ не показывается, как и у вставленного. Без ключа подписи на узле этот пункт не появляется, и ничего не меняется.

Видно и куда лицензия выдана: в диалоге её деталей перечислены серверы и агенты, которые её используют, — по именам и со ссылками, а не только числом. Так можно отсоединить лицензию перед удалением, не обходя вручную все серверы. Лицензия выбирается и на странице сервера — она становится лицензией по умолчанию для всех новых агентов на нём.

Лицензирование MultiAgent

Сам MultiAgent распространяется с 30-дневным пробным периодом, уже включённым в продукт. Лицензия — самодостаточная подписанная строка: загружается через переменную AGENT_LICENSE (ту же, что читают все продукты семейства) или файлом активации в папке данных и проверяется офлайн по встроенному ключу. Универсальный ключ (без списка продуктов) покрывает все продукты; действующая лицензия блокирует только создание новых сущностей и отправку сообщений. Лицензия входит в подписку «Фабрика агентов».

Статус лицензии подгружается сразу после входа: строка лицензии в интерфейсе показывает состояние, как только вы вошли, — в том числе при первом открытии панели в новом браузере, где вход происходит уже после загрузки страницы. Обновлять страницу вручную не нужно.

Язык интерфейса

Язык интерфейса выбирает сам пользователь в окне «Внешний вид»: английский или русский. Русский — только значение по умолчанию русской сборки; на английской сборке интерфейс открывается на английском, но каждый может переключить его себе, и выбор сохраняется за учётной записью. Даты и числа при этом остаются в формате сборки.

← Оглавление документации