Skip to content

安全模型 ​

本页汇总共工空间的安全设计:谁能登录、机器怎么认证、Bot 能做多大的事、哪些数据加密或脱敏、预览如何隔离,以及仍然存在的风险。部署前请通读。

信任边界 ​

  • server 负责账号、调度与转发,保存消息、运行记录和附件,但不运行 Agent,也不保存成员的模型供应商密钥。
  • 成员机器上的 daemon 调用本机已登录的 Claude Code / Codex 真正干活。Bot 的操作发生在 Bot 主人的机器上,由主人负责并审批。
  • 系统管理员能管理账号和全局配置,但不能替 Bot 主人放开命令审批,也不能操作别人机器上的 Agent 工具和供应商。

账号与会话 ​

  • 密码用 argon2 哈希存储。同一账号 5 分钟内登录失败 5 次后暂时锁定。
  • 登录成功后下发会话 Cookie gonggong_session:HttpOnly、SameSite=Lax,有效期 30 天;数据库只存其哈希。
  • Cookie 的 Secure 标记:server 自己配置 TLS 时自动开启;由 Nginx 终止 HTTPS 时必须设置 GONGGONG_SECURE_COOKIES=1。
  • 修改密码后,该账号的其他会话全部失效;管理员重置密码后,该账号所有会话失效。
  • 停用账号立即吊销其所有会话和机器 token,见 账号与角色。
  • 浏览器发起的写请求和 WebSocket 必须来自本站(Origin 与 Host 一致),否则返回「拒绝跨站请求」。

机器认证 ​

  • 成员在 Web 生成一次性绑定码(10 分钟内有效,用过即作废),在机器上执行 gg login 换取长期的机器 token。
  • server 只存 token 的哈希;token 保存在成员机器的 ~/.gonggong/config.json。
  • 绑定码输错会按来源 IP 限流:10 分钟内错 10 次后暂停绑定 10 分钟。
  • 机器 token 只能用于 daemon 自身的接口,没有任何修改 Bot 的权限;桌面端与 gg 对 Bot 设置只读。
  • 吊销机器或停用账号后 token 立即失效,daemon 会清理本机托管工作区。

传输 ​

  • daemon 可用 http:// 或 https:// 连接任意服务器;跨网络使用时建议服务器启用 HTTPS 加密传输。
  • daemon 接受服务器出示的任何证书(含自签),不校验 CA 链也不固定指纹,绑定即用,换证书无需重新绑定。代价是无法防御主动的中间人冒充服务器。

详见 HTTPS 与证书。

Bot 权限与审批 ​

机制说明
权限档位只读 / 工作区写入 / 完全访问,决定 Bot 默认能动多大范围。「完全访问」档只允许「指定名单」触发
触发范围任何群成员 / 指定名单 / 仅本人,决定谁能 @ 它干活
权限请求超出档位的操作会弹出审批卡片,只有 Bot 主人能批准或拒绝;等待超时(默认 30 分钟,可按群调整)自动拒绝
命令审批每次询问 / 白名单自动 / 全部自动,配置存在 server、随每轮下发,由 daemon 在本机执行。只有 Bot 主人能改,系统管理员也不行;管理员为他人创建的 Bot 固定从「每次询问」开始

详见 Bot 设置与权限 和 审批与提问。

静态加密 ​

使用 GONGGONG_DATA_KEY(AES-256-GCM)加密:

数据方式
附件文件(数据目录 attachments/)流式加密存储,下载时解密;文件被篡改时下载会中断
每轮 diff加密后存入数据库
运行过程中的自由文本(流式输出、思考、工具详情)加密后存入数据库;类型、状态、工具标题、步骤保持明文,以便搜索
成员绑定的 Git 账号 token加密后存入数据库

不加密:消息正文、运行卡片(步骤与摘要)、审批与提问记录——它们需要全文搜索,入库前已脱敏。基准分支镜像(数据目录 mirrors/)是明文 git 仓库,必须开启服务器磁盘加密(如 LUKS)。

密钥管理:

  • 生产环境必须显式设置 GONGGONG_DATA_KEY(openssl rand -base64 32),不要和数据库、数据目录放在一起备份。
  • 密钥丢失 = 附件、diff、运行过程无法解密(消息与卡片不受影响)。
  • 目前没有自动换钥工具,换钥需要停机并用旧密钥解密、新密钥重新加密。

脱敏 ​

运行事件、diff、最终回复、失败信息、审批请求的标题与命令、附件文件名(不含内容)在入库前统一替换为「[已脱敏]」,规则见 apps/server/src/modules/runs/redact.ts:

  • GONGGONG_REDACT_VALUES 中列出的已知密钥值(逗号分隔);
  • 私钥块(-----BEGIN … PRIVATE KEY-----);
  • 常见 token 格式:GitHub、GitLab、npm、OpenAI / Anthropic(sk-…)、AWS Access Key、Slack、Google API Key、Stripe、JWT;
  • Authorization、Bearer、X-Api-Key、X-Auth-Token、Private-Token 等请求头的值;
  • password=…、TOKEN="…" 这类赋值和 JSON 里 "api_key": "…" 这类字段(键名含 password / passwd / secret / token / api_key 等);
  • 密钥类关键字附近的 40 位以上十六进制串。

WARNING

脱敏基于规则,格式不常见的密钥可能漏过。团队内部专用的密钥值,建议加进 GONGGONG_REDACT_VALUES。

模型供应商密钥只在本机 ​

Bot 使用的模型供应商配置(Key、Base URL、默认供应商)只保存在成员机器本地。Web 上的「供应商」页面只是经 server 转发给在线的 daemon 读写,server 不落库,也不会同步到其他机器;只有机器主人能管理。见 Agent 工具与供应商。

配置中心里全局层 MCP 的环境变量和请求头则以明文存在 server,见 配置中心。

预览隔离 ​

Bot 的预览页面由 Agent 编写,应视为不可信内容:

  • 泛域名模式(推荐):预览放在与主站不同的独立可注册域名下,浏览器不会把主站 Cookie 发给它,它也读写不到主站 Cookie。
  • 端口模式:预览与主站同一主机名、不同端口,浏览器会带上主站 Cookie。server 转发前会删掉 Cookie,并拒绝跨站的写请求和 WebSocket,但隔离不如泛域名模式彻底,只建议在局域网使用。
  • 隧道只能访问 daemon 登记过的预览端口和工作区只读文件,不能访问成员机器上的其他端口。
  • 访问预览需要登录且是该群成员;公开链接必须设有效期(上限见系统参数),可随时收回,每次访问都记入审计。

配置见 反向代理与预览域名。

审计 ​

管理员操作(账号、为他人管理 Bot、吊销机器、MCP、系统参数、群管理、客户端发布)、审批、提问、/stop、/cd、/new、公开链接的生成与访问等都写入审计记录,永久保存。见 审计记录。

数据保留 ​

数据保留
完整运行过程与 diff运行结束后默认 30 天(系统参数「完整运行过程保留」),到期删除,卡片摘要保留
预览默认连续 24 小时无人访问后自动关闭
公开链接按创建时设定的有效期,最长默认 30 天
会话30 天
审计记录、消息永久
服务器备份backup.sh 保留最近 7 份

残余风险 ​

  • 拿到 GONGGONG_DATA_KEY 和数据库的人可以解密全部加密数据;server 进程内存中可见明文。
  • 消息、卡片、审批命令虽已脱敏,但为明文存储。
  • daemon 不校验服务器证书,在不可信网络上可能遭遇中间人冒充服务器——敏感场景请在内网或 VPN 内使用,并确认服务器地址无误。
  • 未开启磁盘加密时,基准分支代码以明文落盘。
  • 附件在读到末尾时才校验完整性,篡改表现为下载中断,而不是事先拒绝。
  • server 放在反向代理后时按 IP 的限流由所有人共享,见 反向代理 · 客户端 IP。

相关页面 ​

基于 Apache License 2.0 开源