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. Ключ не вложен в обычную точку монтирования состояния. Аккаунты каналов каждого тенанта обслуживаются внутри владеющей ими ячейки; Fleet не предоставляет общий аккаунт канала или маршрутизатор входящих сообщений.
Официальный образ по умолчанию использует непривилегированного пользователя node с UID 1000. Fleet применяет совместимые с хостом сопоставления пользователей, чтобы закрытые привязанные тома оставались доступными для записи: Podman использует keep-id, Docker в привилегированном режиме использует идентификатор запустившего его непривилегированного пользователя, а Docker в непривилегированном режиме сопоставляет пользователя root контейнера с непривилегированным пользователем демона. Когда на хосте активен SELinux, Docker и Podman применяют закрытую перемаркировку :Z. Профиль контейнера не использует привилегированные функции хоста и поддерживает непривилегированный режим, однако работа без привилегий — это выбор и предварительное требование среды выполнения хоста, а не функция, которую Fleet включает автоматически.
Граница доверия
Мультитенантность защищает тенантов друг от друга. Оператор Fleet и хост являются доверенными для каждого тенанта. Защита от скомпрометированного хоста не является целью.
Это означает, что администратор хоста может проверять конфигурацию и окружение контейнеров, читать смонтированные данные ячеек, заменять образы или входить в контейнеры. Токены Gateway и значения, переданные через --env, видны администратору при проверке Docker или Podman. Поэтому используйте соответствующие средства защиты хоста, политику административного доступа, мониторинг, резервное копирование и одобренный менеджер секретов.
Базовая конфигурация предотвращает случайное открытие сетевого доступа по маске и устраняет распространённые механизмы повышения привилегий контейнера, но не делает недоверенный хост безопасным.
Уровни изоляции
Выберите границу, соответствующую размещаемым тенантам:
- Базовый защищённый контейнер. Fleet удаляет все возможности Linux, включает
no-new-privileges, применяет ограничения PID, памяти, CPU и, при необходимости, дискового пространства записываемого слоя, использует отдельные постоянные точки монтирования и сети для каждой ячейки и публикует порт только на loopback-интерфейсе хоста. Мостовая сеть не ограничивает исходящий трафик; если ячейка не должна инициировать исходящие подключения, используйте--network internalв Podman или политику межсетевого экрана хоста для Docker. Это профиль по умолчанию для тенантов, доверяющих оператору и хосту. - Усиленная изоляция контейнеров или виртуальных машин. Для рабочих нагрузок повышенного риска настройте Docker или Podman на использование более строгой среды изоляции OCI, например gVisor или Kata Containers, либо размещайте ячейки в микровиртуальных машинах. Это настройка среды выполнения или инфраструктуры; параметр Fleet
--runtime docker|podmanвыбирает CLI контейнеров, а не серверную часть изоляции OCI. См. документацию Docker об альтернативных средах выполнения контейнеров и руководство по среде выполнения Docker в виртуальной машине. - Отдельные машины для враждебных тенантов. Не размещайте враждебных тенантов в одном процессе OpenClaw или под одним пользователем ОС. Если тенанты не доверяют одному оператору хоста или нуждаются в более строгой административной границе, используйте отдельные виртуальные машины или физические хосты с раздельным администрированием сред выполнения.
Ни один уровень этой схемы не изменяет модель доверия приложения OpenClaw: один Gateway по-прежнему представляет один доверенный домен оператора.
Быстрый старт
Создайте ячейку. Команда выводит сгенерированный токен Gateway только один раз, поэтому немедленно сохраните его:
openclaw fleet create acmeОткройте указанный URL http://127.0.0.1:<port> на хосте Fleet, пройдите аутентификацию с токеном этого тенанта и настройте учётные данные провайдеров и аккаунты каналов внутри ячейки.
Проверьте состояние контейнера и работоспособность Gateway:
openclaw fleet status acmeВыполните обновление, сохранив порт хоста, смонтированные данные, профиль ресурсов, заданное пользователем окружение и токен Gateway:
openclaw fleet upgrade acmeУдалите контейнер и запись реестра, сохранив данные тенанта:
openclaw fleet rm acme --forceЧтобы также удалить постоянные данные тенанта, добавьте --purge-data. Для очистки требуется --force; эта операция необратима и перед удалением чего-либо проверяет, что разрешённый путь находится в допустимых границах:
openclaw fleet rm acme --purge-data --forceВсе команды и параметры приведены в справочнике CLI openclaw fleet.
Текущая область применения
Fleet не предоставляет следующие возможности:
- Общие аккаунты каналов или общий маршрутизатор входящего трафика
- Облегчённые процессы хоста для отдельных тенантов вместо полноценных экземпляров OpenClaw
- Удалённые хосты ячеек, управляемые одним диспетчером
- Портал самообслуживания тенантов, система биллинга или пользовательский интерфейс делегированного администрирования
Для этих возможностей необходимы явные контракты идентификации, маршрутизации, авторизации и доменов отказа. Не пытайтесь имитировать их, совместно используя один Gateway или его учётные данные для нескольких тенантов. Fleet — это диспетчер жизненного цикла для одного хоста; для парков на нескольких машинах с управлением на основе идентификации требуется отдельный уровень плоскости управления.