Gateway

Мультитенантный хостинг

Мультитенантный хостинг

Модель безопасности OpenClaw по умолчанию предусматривает одну границу доверия оператора на Gateway, а не изоляцию недоверяющих друг другу арендаторов внутри одного общего Gateway. Поэтому для размещения пользователей или организаций, не имеющих общей границы доверия, необходимо запускать отдельный полноценный экземпляр OpenClaw для каждого арендатора.

openclaw fleet называет каждый изолированный экземпляр ячейкой. Ячейка — это полноценный Gateway в защищённом контейнере с собственными состоянием, учётными данными, рабочим пространством, учётными записями каналов, токеном и портом хоста, доступным только через loopback-интерфейс.

Fleet является экспериментальной функцией: пока интерфейс стабилизируется, её команды, флаги и профиль контейнера могут изменяться между выпусками без периода устаревания.

Fleet тестируется на хостах Linux и macOS. Хосты Windows в настоящее время не тестировались.

Почему каждому арендатору нужна отдельная ячейка

Аутентифицированный оператор внутри одного Gateway выполняет доверенную роль в плоскости управления. Идентификаторы сеансов определяют маршрутизацию; они не авторизуют одного арендатора по отношению к другому. Песочница агента может уменьшить последствия недоверенного содержимого и выполнения инструментов, но она не превращает общий Gateway в границу авторизации арендаторов.

Используйте отдельную ячейку для каждого арендатора, чтобы у каждого домена доверия были отдельный процесс Gateway, контейнер, постоянное дерево состояния и учётные данные Gateway. Это соответствует модели безопасности Gateway: не размещайте взаимно недоверяющих пользователей в одном процессе OpenClaw или под одной учётной записью ОС.

Архитектура

Fleet CLI — это работающий на стороне хоста диспетчер жизненного цикла. Он регистрирует ячейки в базе данных состояния OpenClaw и поручает локальной среде выполнения Docker или Podman создавать, проверять, запускать, останавливать, заменять и удалять их контейнеры. Удалённые конечные точки среды выполнения отклоняются, поскольку пути привязки Fleet и loopback-URL принадлежат локальному хосту; поддержка удалённых хостов ячеек отложена до появления явного контракта для хранилища и конечных точек. Fleet не проксирует сообщения арендаторов и не добавляет общий путь данных на уровне приложения между ячейками.

Каждая ячейка запускает официальный образ ghcr.io/openclaw/openclaw в собственной пользовательской мостовой сети. Раздельные мосты предотвращают прямой обмен трафиком между IP-адресами контейнеров разных ячеек, сохраняя исходящий доступ через NAT для провайдеров и каналов. По умолчанию исходящий трафик не ограничен. Ячейки Podman могут использовать --network internal, чтобы блокировать исходящий трафик, сохраняя опубликованный loopback-порт Gateway. Внутренние сети Docker нарушают работу этого опубликованного порта, поэтому Fleet отклоняет такую комбинацию; вместо этого применяйте политику исходящего трафика Docker с помощью правил межсетевого экрана хоста, например цепочки DOCKER-USER. Gateway ячейки прослушивает порт 18789 внутри контейнера, а среда выполнения публикует его на хосте только по адресу 127.0.0.1:<allocated-port>. Когда требуется удалённый доступ, оператор может разместить перед этой loopback-конечной точкой одобренный обратный прокси-сервер, SSH-туннель или tailnet.

Постоянное состояние Gateway берётся из <state-dir>/fleet/cells/<tenant>/ и монтируется в /home/node/.openclaw. Ключи шифрования профилей аутентификации берутся из отдельного пути хоста <state-dir>/fleet/auth-profile-secrets/<tenant>/ и монтируются в /home/node/.config/openclaw, что соответствует официальной схеме постоянного хранения Docker. Ключ не находится внутри обычной точки монтирования состояния. Учётные записи каналов каждого арендатора обрабатываются внутри принадлежащей ему ячейки, поэтому в MVP Fleet нет общей учётной записи канала или общего маршрутизатора входящих сообщений.

Официальный образ по умолчанию использует непривилегированного пользователя node с UID 1000. Fleet использует совместимые с хостом сопоставления пользователей, чтобы приватные точки монтирования с привязкой оставались доступными для записи: Podman использует keep-id, привилегированный Docker использует идентификатор вызвавшего его непривилегированного пользователя, а непривилегированный Docker сопоставляет пользователя root контейнера с непривилегированным пользователем демона. Когда на хосте активен SELinux, Docker и Podman применяют приватную перемаркировку :Z. Профиль контейнера не использует привилегированные функции хоста и подходит для непривилегированной работы, однако непривилегированный режим является выбором и предварительным требованием среды выполнения хоста, а не функцией, которую Fleet включает автоматически.

Граница доверия

Мультитенантность защищает арендаторов друг от друга. Оператор Fleet и хост считаются доверенными для каждого арендатора. Устойчивость к компрометации хоста не является целью.

Это означает, что администратор хоста может проверять конфигурацию и окружение контейнеров, читать смонтированные данные ячеек, заменять образы или входить в контейнеры. Токены Gateway и значения, переданные с помощью --env, видны администратору при проверке через Docker или Podman. Поэтому используйте соответствующие средства защиты хоста, политики административного доступа, мониторинг, резервное копирование и одобренный менеджер секретов.

Базовый профиль предотвращает случайное открытие сетевого доступа по шаблону и устраняет распространённые механизмы повышения привилегий контейнера, но не делает недоверенный хост безопасным.

Уровни изоляции

Выберите границу, соответствующую размещаемым арендаторам:

  1. Базовый защищённый контейнер. Fleet удаляет все возможности Linux, включает no-new-privileges, применяет ограничения PID, памяти, ЦП и необязательные ограничения дискового пространства записываемого слоя, использует отдельные постоянные точки монтирования и отдельные сети для каждой ячейки, а также публикует порт только на loopback-интерфейсе хоста. Мостовая сеть не ограничивает исходящий трафик; если ячейка не должна инициировать исходящие соединения, используйте --network internal в Podman или политику межсетевого экрана хоста для Docker. Это профиль MVP для арендаторов, доверяющих оператору и хосту.
  2. Усиленная изоляция контейнеров или виртуальных машин. Для рабочих нагрузок повышенного риска настройте Docker или Podman на использование среды выполнения OCI с усиленной изоляцией, например gVisor или Kata Containers, либо размещайте ячейки в микровиртуальных машинах. Это конфигурация среды выполнения или инфраструктуры; параметр Fleet --runtime docker|podman выбирает CLI контейнеров, а не серверную среду изоляции OCI. См. документацию Docker об альтернативных средах выполнения контейнеров и руководство по среде выполнения Docker в виртуальной машине.
  3. Отдельные машины для враждебных арендаторов. Не размещайте враждебных арендаторов в одном процессе OpenClaw или под одной учётной записью ОС. Если арендаторы не доверяют одному оператору хоста или им нужна более строгая административная граница, используйте отдельные виртуальные или физические хосты с раздельным администрированием сред выполнения.

Ни один уровень этой схемы не изменяет модель доверия приложения OpenClaw: один Gateway остаётся одним доверенным доменом оператора.

Быстрый старт

Создайте ячейку. Команда выводит сгенерированный токен Gateway только один раз, поэтому сразу сохраните его:

bash
openclaw fleet create acme

Откройте указанный URL http://127.0.0.1:<port> на хосте Fleet, выполните аутентификацию с помощью токена этого арендатора и настройте учётные данные провайдеров и учётные записи каналов внутри ячейки.

Проверьте состояние контейнера и работоспособность Gateway:

bash
openclaw fleet status acme

Выполните обновление с сохранением порта хоста, смонтированных данных, профиля ресурсов, заданного пользователем окружения и токена Gateway:

bash
openclaw fleet upgrade acme

Удалите контейнер и запись реестра, сохранив данные арендатора:

bash
openclaw fleet rm acme --force

Чтобы также удалить постоянные данные арендатора, добавьте --purge-data. Для очистки требуется --force; эта операция необратима и перед удалением чего-либо проверяет, что разрешённый путь находится в допустимых границах:

bash
openclaw fleet rm acme --purge-data --force

Полный список команд и параметров см. в справочнике CLI openclaw fleet.

Отложено после MVP

В первом выпуске Fleet следующие компоненты намеренно оставлены для последующей разработки:

  • Общие учётные записи каналов или общий маршрутизатор входящего трафика
  • Облегчённые процессы хоста для каждого арендатора вместо полноценных экземпляров OpenClaw
  • Удалённые хосты ячеек под управлением одного диспетчера
  • Портал самообслуживания арендаторов, система выставления счетов или интерфейс делегированного администрирования

Этим функциям необходимы явные контракты идентификации, маршрутизации, авторизации и доменов отказа. Их не следует имитировать путём совместного использования одного Gateway или его учётных данных несколькими арендаторами. Они также не относятся к области ответственности Fleet: Fleet остаётся диспетчером жизненного цикла на одном хосте, а управление многоузловыми парками с контролем идентификации должно осуществляться отдельным уровнем плоскости управления над ним.

Связанные материалы

Was this useful?
On this page

On this page