多租户托管
OpenClaw 的默认安全模型是每个 Gateway 对应一个受信任的操作员边界,而不是在单个共享 Gateway 内部进行对抗性多租户隔离。因此,托管不共享信任边界的用户或组织,意味着需要为每个租户运行一个独立的完整 OpenClaw 实例。
openclaw fleet 将每个隔离实例称为一个 cell。cell 是运行在加固容器中的完整 Gateway,拥有自己的状态、凭据、工作区、频道账户、token,以及仅限回环的主机端口。
Fleet 目前为实验性功能:其命令、标志和容器配置在不同版本之间可能发生变化,且没有弃用过渡期。
Fleet 已在 Linux 和 macOS 主机上通过测试。Windows 主机目前尚未测试。
为什么每个租户需要一个 cell¶
单个 Gateway 内的已认证操作员拥有受信任的控制平面角色。会话 ID 用于选择路由,而不是用于在一个租户与另一个租户之间进行授权。Agent 沙箱可以降低不受信任内容和工具执行带来的影响,但并不能将单个共享 Gateway 变成租户授权边界。
为每个租户使用一个 cell,使每个信任域拥有独立的 Gateway 进程、容器、持久化状态树和 Gateway 凭据。这遵循 Gateway 安全模型:不要将互不信任的用户共置于同一个 OpenClaw 进程或同一个操作系统用户中。
架构¶
Fleet CLI 是主机侧的生命周期监管器。它在 OpenClaw 状态数据库中记录 cell,并请求本地 Docker 或 Podman 运行时来创建、检查、启动、停止、替换和移除这些容器。Fleet 不支持远程运行时端点,因为 Fleet 的绑定路径和回环 URL 属于本地主机。Fleet 不代理租户消息,也不会在 cell 之间增加共享的应用层数据通路。
每个 cell 都在自己的用户自定义桥接网络上运行官方 ghcr.io/openclaw/openclaw 镜像。独立的桥接网络可阻止 cell 之间的直接容器 IP 流量,同时保留提供商和频道所需的出站 NAT 访问。默认情况下,出站流量不受限制。Podman cell 可以使用 --network internal 来阻止出站流量,同时保留已发布的回环 Gateway 端口。Docker 的内部网络会导致该已发布端口失效,因此 Fleet 会拒绝这种组合;请改用主机防火墙规则(例如 DOCKER-USER 链)来实施 Docker 的出站策略。cell 的 Gateway 在容器内监听 18789 端口,而运行时仅将其发布到主机的 127.0.0.1:<allocated-port>。当需要远程访问时,操作员可以在此回环端点前放置经过批准的反向代理、SSH 隧道或 tailnet。
持久化的 Gateway 状态来自 <state-dir>/fleet/cells/<tenant>/,并挂载到 /home/node/.openclaw。当前的 OAuth access token、refresh token 和 ID token 值以明文形式存储在该普通状态挂载点下的 SQLite 中,因此请将 cell 状态的备份和副本视为凭据。另一个独立的 <state-dir>/fleet/auth-profile-secrets/<tenant>/ 主机路径挂载到 /home/node/.config/openclaw,与官方 Docker 持久化布局 一致,但其中仅包含用于旧版加密 sidecar 恢复的密钥。它不会加密当前的 SQLite 记录,也无法保护仅包含状态的备份或副本。每个租户的频道账户在其所属的 cell 内部终止;Fleet 不提供共享的频道账户或入站消息路由器。
官方镜像默认使用 UID 1000 的非 root node 用户。Fleet 使用与主机兼容的用户映射,以确保私有 bind 挂载保持可写:Podman 使用 keep-id,rootful Docker 使用调用方的非 root 身份,而 rootless Docker 将容器 root 映射到非特权守护进程用户。当主机启用 SELinux 时,Docker 和 Podman 会应用私有的 :Z 重新标记。容器配置避免使用特权主机特性,并且对 rootless 友好,但 rootless 运行是主机运行时的选择和前提条件,而不是 Fleet 自动启用的功能。
信任边界¶
多租户机制可防止租户之间相互侵害。每个租户都信任 Fleet 操作员和主机。抵御主机被攻破并非目标。
这意味着主机管理员可以检查容器配置和环境、读取已挂载的 cell 数据、替换镜像或进入容器。管理员可以通过 Docker 或 Podman 的 inspection 查看通过 --env 传入的 Gateway token 和值。请相应地使用主机控制措施、管理访问策略、监控、备份以及经批准的密钥管理器。
该基线可防止意外的通配符网络暴露,并移除常见的容器提权原语,但并不能让不受信任的主机变得安全。
隔离阶梯¶
选择与您托管的租户相匹配的边界:
- 加固容器基线。 Fleet 会丢弃所有 Linux capabilities,启用
no-new-privileges,应用 PID、内存、CPU 以及可选的可写层磁盘限制,使用独立的持久化挂载和每 cell 独立网络,并且仅发布到主机回环。桥接网络使出站流量不受限制;当 cell 不得发起出站连接时,请使用 Podman 的--network internal或 Docker 主机防火墙策略。这是适用于信任操作员和主机的租户的默认配置。 - 更强的容器或虚拟机隔离。 对于高风险工作负载,请将 Docker 或 Podman 配置为使用更强的 OCI 隔离运行时(例如 gVisor 或 Kata Containers),或者将 cell 放入 microVM 中。这属于运行时或基础设施配置;Fleet 的
--runtime docker|podman选项选择的是容器 CLI,而不是 OCI 隔离后端。请参阅 Docker 的替代容器运行时和Docker VM 运行时指南。 - 为敌对租户使用独立机器。 不要将敌对租户共置于同一个 OpenClaw 进程或操作系统用户中。当租户不信任同一主机操作员,或需要更强的管理边界时,请使用独立的虚拟机或物理主机,并分别进行运行时管理。
在这组递进操作中,没有任何一级会改变 OpenClaw 应用信任模型:一个 Gateway 仍然是一个受信任的运营者域。
快速开始¶
创建一个 cell。该命令会打印一次生成的 Gateway token,请立即保存:
在 Fleet 主机上打开报告的 http://127.0.0.1:<port> URL,使用该租户的 token 进行身份验证,并在 cell 内配置提供方凭据和频道账户。
检查容器状态和 Gateway 存活状态:
升级时保留主机端口、挂载数据、资源配置、用户提供的环境以及 Gateway token:
移除容器和注册表记录,同时保留租户数据:
若也要删除持久化租户数据,请添加 --purge-data。Purge 需要 --force、不可逆,并且会在删除任何内容之前执行解析路径的包含性检查:
有关所有命令和选项,请参阅 openclaw fleet CLI 参考。
当前范围¶
Fleet 不提供以下功能面:
- 共享频道账户,或共享的入口路由器
- 精简的每租户主机进程,而不是完整的 OpenClaw 实例
- 由单个监管器管理的远程 cell 主机
- 租户自助服务门户、计费平面或委派管理 UI
这些能力需要明确的身份、路由、授权和故障域契约。不要通过跨租户共享一个 Gateway 或其凭据来近似实现这些能力。Fleet 是单主机生命周期监管器;多机器、由身份治理的 fleet 需要单独的控制平面层。
相关¶
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw