跳转到内容
↑↓导航 ↵打开 esc关闭

安全

OpenChamber 让外界可以访问你的机器和代码,所以在除你之外的任何人能够访问它之前,请把它锁好。本页介绍 UI 密码、passkey,以及在将 OpenChamber 暴露到网络之前需要了解的内容。

设置 UI 密码

带密码启动 OpenChamber,浏览器 UI 就会要求输入它:

Terminal window
openchamber --ui-password be-creative-here

你也可以用 OPENCHAMBER_UI_PASSWORD 环境变量来设置它,而不是把它放在命令行上。登录后,OpenChamber 会记住该设备一段时间,这样你就不必每次都输入。

如果实例可以被其他任何人访问,请务必设置密码 — 尤其是通过 隧道 或公共互联网时。

Passkey

设置密码后,你可以添加 passkey(Face ID、Touch ID、安全密钥)以便更快登录。在 Settings → OpenChamber → Passkeys 中添加它们。

passkey 与当前密码绑定。如果你更改或移除密码,已保存的 passkey 会被清除,你需要重新添加它们。

设备令牌

通过 连接设备 配对的设备使用各自独立的设备令牌进行认证,而不是 UI 密码。配对链接只能使用一次,未使用也会过期;每台已配对的设备都会列在 Settings → Remote Instances → 连接到此服务器 中,你可以随时撤销任何一台。外出时的连接经由 Private Relay 传输,它是端到端加密的,无法读取你的流量。

在暴露它之前

  • 默认情况下 OpenChamber 只监听你自己的机器(127.0.0.1)。需要一次刻意的更改才能更广泛地监听,并且你应该先设置密码。
  • 对于你自己的设备,优先使用 配对 加 Private Relay — 完全不对外暴露任何内容。
  • 如果你需要一个公开 URL,相比向互联网开放一个端口,更推荐使用 隧道 或专用网络(比如 VPN)。
  • 如果你把 OpenChamber 放在你自己的 HTTPS 服务器后面,请参阅 反向代理。

企业模式

如果你的团队只能把对话内容发送给你在 OpenCode 中配置的模型提供商,请开启企业模式。有两种方式,任选其一即可。

机器上的策略文件

在你管理的笔记本电脑上应使用这种方式。把一个名为 policy.json 的文件放到只有管理员才能写入的文件夹中:

系统路径
macOS/Library/Application Support/OpenChamber/policy.json
WindowsC:\ProgramData\OpenChamber\policy.json
Linux/etc/openchamber/policy.json

路径与 OpenChamber 的安装方式无关。桌面应用、通过 npm 启动的 Web 服务器、CLI 和 VS Code 扩展都读取同一个文件。你可以用设备管理工具(Jamf、Intune 等)分发它。对于在 Docker 中运行的服务器,把文件挂载到 Linux 路径即可。

{
"enterpriseMode": true,
"organization": "Acme",
"relayUrl": "wss://relay.acme.com/ws",
"allowNetworkAccess": false,
"allowedExtensions": ["https://github.com/acme/"],
"jev": {
"url": "https://llm.acme.com/v1/systemone",
"model": "acme-classifier",
"apiKey": "..."
}
}

只有 enterpriseMode 是必需的。organization 会在设置中显示为“由 Acme 管理”,让大家知道是谁做的决定。relayUrl 和 jev 用于固定你自己的中继和你自己的 Jev 端点,allowNetworkAccess 允许其他设备通过网络访问 OpenChamber,allowedExtensions 则列出你信任的扩展仓库。这些都详见下文。

  • 用户在设置或环境中做的任何设置,都无法关闭文件开启的功能。
  • 当文件开启企业模式时,只由文件决定。下文中用于中继、Jev 和网络访问的环境变量会被忽略,因为用户可以自行设置它们。
  • 如果文件存在但无法读取,或不是有效的 JSON,企业模式保持开启,且不会固定任何内容。设置中会提示无法读取策略。损坏的文件绝不会悄悄解除保护。
  • 更改无需重启即可生效。
  • OpenChamber 以用户身份运行,因此用户可以读取这个文件。在里面放 API 密钥之前请考虑到这一点。

环境变量

在由你控制环境的服务器或容器中,这样就够了:

Terminal window
OPENCHAMBER_ENTERPRISE_MODE=1

在笔记本电脑上这是一把较弱的锁:桌面应用从登录 shell 的配置文件(例如 ~/.zshrc)读取它,而用户可以编辑这个文件。在笔记本电脑上请使用策略文件。

使用这个变量时,中继、Jev、网络访问和允许的扩展也来自各自的变量:OPENCHAMBER_RELAY_URL、OPENCHAMBER_JEV_URL、OPENCHAMBER_ALLOW_NETWORK_ACCESS=1、OPENCHAMBER_ALLOWED_EXTENSIONS(用逗号分隔的仓库 URL)和 OPENCHAMBER_ALLOW_LOCAL_EXTENSIONS=1。在 Docker 中你需要网络访问的那个变量,因为服务器必须监听来自容器之外的连接。

固定 OpenCode CLI

如果你的机器上已经装好了 OpenCode,并且希望 OpenChamber 使用这份安装,把它的路径写进策略文件即可。开不开企业模式都能用。

{
"opencodeBinary": "/usr/local/bin/opencode"
}
  • OpenChamber 只从这个路径启动 OpenCode。它会忽略设置里的路径、OPENCODE_BINARY 以及桌面应用自带的副本,那份副本留在磁盘上但不会被使用。
  • 如果这个路径下没有可运行的文件,OpenChamber 不会退回到其他副本,而是停下来并报错,错误里写明路径。
  • 设置里的路径变为只读,并注明由管理员设定。
  • OpenChamber 不会安装或更新被固定的 OpenCode,也不会提示新版本。更新随你的统一部署进行。
  • CLI 必须是 OpenCode 2.x,且不低于 OpenChamber 要求的版本。版本更旧时,OpenChamber 会停在”更新 OpenCode”的界面。
  • 也可以填一个文件夹,只要里面有 opencode(Windows 上是 opencode.exe)。这一项没有对应的环境变量,因为用户可以自己设置环境变量。

隐藏内置技能目录

OpenChamber 自带几个公开的技能目录(Anthropic、OpenAI、Cursor、Matt Pocock)。如果你的组织维护自己的目录,请将其添加为自定义目录,并在策略文件中隐藏内置目录。无论是否启用企业模式都有效。

{
"hideBuiltinSkillCatalogs": true
}

此后设置中只提供用户自行添加的目录,即使直接请求,OpenChamber 也不会加载内置目录。由于用户可以自行设置环境变量,因此没有对应的环境变量。

示例

要在 Mac 上放置策略文件,以管理员身份在终端中运行:

Terminal window
sudo mkdir -p "/Library/Application Support/OpenChamber"
sudo tee "/Library/Application Support/OpenChamber/policy.json" > /dev/null <<'JSON'
{
"enterpriseMode": true,
"organization": "Acme"
}
JSON

在 Linux 上也一样,只是文件夹换成 /etc/openchamber。

在 Windows 上,以管理员身份运行 PowerShell。最后一行让该文件夹只有管理员和系统可以写入:

Terminal window
New-Item -ItemType Directory -Force "C:\ProgramData\OpenChamber" | Out-Null
@'
{
"enterpriseMode": true,
"organization": "Acme"
}
'@ | Set-Content -Encoding UTF8 "C:\ProgramData\OpenChamber\policy.json"
icacls "C:\ProgramData\OpenChamber" /inheritance:r /grant:r "Administrators:(OI)(CI)F" "SYSTEM:(OI)(CI)F" "Users:(OI)(CI)RX"

对于 Docker 中的服务器,把下面的内容加到 docker-compose.yml 的 environment 里。容器需要监听来自自身之外的连接,所以要允许网络访问:

environment:
OPENCHAMBER_UI_PASSWORD: ${OPENCHAMBER_UI_PASSWORD}
OPENCHAMBER_ENTERPRISE_MODE: "1"
OPENCHAMBER_ALLOW_NETWORK_ACCESS: "1"
# Optional:
OPENCHAMBER_RELAY_URL: wss://relay.acme.com/ws
OPENCHAMBER_JEV_URL: https://llm.acme.com/v1/systemone
OPENCHAMBER_JEV_MODEL: acme-classifier
OPENCHAMBER_JEV_API_KEY: ${ACME_JEV_KEY}
OPENCHAMBER_ALLOWED_EXTENSIONS: https://github.com/acme/

要确认是否生效,打开“设置 → 提供商”:顶部会出现带有你组织名称的企业模式提示。

会有哪些变化

  • 模型提供商只来自你的 OpenCode 配置。在 OpenChamber 中连接提供商、登录提供商、添加密钥或创建自定义提供商都会关闭;移除或切换已有账户仍然可用。这只是关上了经由应用的入口;真正的锁是下文所述的 OpenCode 策略。登录 OpenCode 配置中的 MCP 服务器仍然可用,因为它连接的是该服务器,而不是模型提供商。
  • 分类提供方(Jev)保持关闭,有人在设置里填写的自定义端点也一样。安全网和 Auto 不会提供,进行中的会话也不会出现”看起来已完成”的提示。要通过你自己的基础设施使用 Jev,请用策略文件中的 jev 或用 OPENCHAMBER_JEV_URL 固定一个端点(再加上 OPENCHAMBER_JEV_MODEL,如有需要还有 OPENCHAMBER_JEV_API_KEY)。它会成为默认选项,仍然可以关闭,但不能选择其他任何来源。
  • 通过 OpenAI 朗读的功能会关闭。自定义的语音合成或转写服务器必须运行在同一台机器上。本地语音和本地口述模型照常工作。
  • 发往手机和浏览器的推送通知只带一个通用标题,例如“Agent response is ready”,不含消息文本或会话名称。桌面通知留在你的机器上,保留完整文本。
  • 更新检查照常运行,安全修复仍能送达,但它从不上报使用情况,连匿名安装 ID 也不上报。
  • 外部隧道(Cloudflare、ngrok)会关闭。隧道提供商会在其边缘解密流量,能以明文看到每一个请求。
  • .drawio 图表以 XML 文本打开。图表编辑器是 diagrams.net 的页面,在其中打开图表会把文件交给该页面。
  • 从公共 CDN 加载的界面和代码字体会改用系统字体。你的选择会保留,待该模式关闭时恢复。
  • Private Relay 只能通过你自己的中继使用。运行一个自托管中继,并用策略文件中的 relayUrl 或 OPENCHAMBER_RELAY_URL=wss://relay.example.com/ws 让 OpenChamber 指向它。共享中继同样无法读取你的流量,因为它是端到端加密的,但你自己的中继能把连接元数据和进入这台机器的通道留在你的网络内。没有你自己的中继,就完全无法配对设备。
  • OpenChamber 只在它所运行的机器上监听。允许本地网络中其他设备打开应用的桌面设置会关闭,服务器也会拒绝在网络地址上启动,无论是通过 CLI(--host、--lan)还是通过环境。如果应用运行期间出现了策略文件,来自其他机器的连接会被断开,直到下次启动。要允许网络访问,请在策略文件中设置 "allowNetworkAccess": true,或在由环境开启企业模式的情况下设置 OPENCHAMBER_ALLOW_NETWORK_ACCESS=1。请注意连接是未加密的 HTTP,在共享网络中任何人都能读取;其他人要访问的服务器,请放在你自己的 HTTPS 后面。
  • 能把数据发送到机器之外的扩展(与外部 API 通信、从外部地址加载内容或运行后台服务的扩展)只能从 allowedExtensions 中列出的 Git 仓库安装。不做这些事的扩展照常安装。从其他地方安装的扩展会保持关闭,设置中会说明原因。列表里填写仓库 URL,因为扩展的名字由它自己决定。以 / 结尾的条目(如 https://github.com/acme/)会允许其下的所有仓库。在开发扩展的人的机器上,"allowLocalExtensions": true 还允许从本地文件夹安装。ZIP 无论如何都不能安装。
  • 来自 设置 → 通用 和 opencode service set env 的环境变量不会传给 OpenCode,因为其中可能带有提供商密钥。Git、终端和项目操作仍然会拿到它们。
  • 在 VS Code 扩展中,连接提供商的功能会关闭,更新检查也不上报使用情况。它本来就没有 Jev、中继、隧道、推送通知或云端语音功能。

小模型任务(会话标题、摘要、提交信息、变更讲解)不需要任何特殊模式。它们始终使用你在设置中选择的小模型、你当前所用提供商的小模型,或你的 OpenCode 配置中的默认模型。它们绝不会退而使用你恰好连接着的其他提供商。

到底能使用哪些模型提供商,由 OpenCode 决定,而不是 OpenChamber。用 OpenCode 策略锁定它:先拒绝所有提供商,再允许你批准的那些。

{
"experimental": {
"policies": [
{ "action": "provider.use", "resource": "*", "effect": "deny" },
{ "action": "provider.use", "resource": "anthropic", "effect": "allow" }
]
}
}

被拒绝的提供商即使有人为它添加了密钥也会消失。把策略放在全局的 ~/.config/opencode/opencode.jsonc 中,项目无法解除它们;或者从拥有最终决定权的 OpenCode Console 工作区下发。企业模式在此之上负责 OpenChamber 自身发送的内容。

智能体的网页搜索和网页抓取同样经由 OpenCode,发往搜索服务和页面本身。如果它们不应离开你的网络,用同类策略拒绝它们:

{ "action": "permission", "resource": "websearch:*", "effect": "deny" },
{ "action": "permission", "resource": "webfetch:*", "effect": "deny" }

相关内容

  • 连接设备 — 一次性配对与设备级令牌
  • Private Relay — 从任何地方进行端到端加密访问
  • 隧道 — 需要时开放一个公开 URL
  • 反向代理 — 在你自己的服务器后面运行 OpenChamber