安全模型
本页汇总共工空间的安全设计:谁能登录、机器怎么认证、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 固定从「每次询问」开始 |
静态加密
使用 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。