请不要开公开 Issue 报告安全问题。
- Gitee:向仓库负责人发私信,或提交 Gitee 安全响应中心渠道
- 邮件:
linwei688668@gmail.com
请在报告里说明版本或提交号(git rev-parse --short HEAD)。我们会在 7 天内回复确认,30 天内给出评估结论。修复发布后,我们可以在披露时间到达后把你列为致谢人。
本项目没有 LTS 分支,只对 master 提供安全修复。
这是一套面向内网 / 私有部署的配置中心与发布编排工具,安全模型假设它运行在受控网络里。把它直接暴露到公网之前先读完下面这一节。
configure-server/manifest/config/config.yaml 不进仓库(各模块 .gitignore 排除了它),但 config.example.yaml 里的占位值会被打进 FROM scratch 镜像。部署时必须用卷覆盖这三个值,否则等于用公开在仓库里的凭据运行:
| 配置项 | 示例值 | 风险 |
|---|---|---|
auth.jwtSecret |
configure-center-dev-secret-change-me |
HS256 密钥公开 ⇒ 任何人可伪造 admin token |
auth.users[].password |
admin123 / operator123 |
弱口令;若 auth_users 表为空会直接生效 |
auth.agentToken / agent.token |
dev-agent-token |
拿到即可在任意节点执行 docker rm -f / docker run |
auth.observabilityToken / OBS_TOKEN |
dev-observability-token |
仅能写日志缓冲;与 agentToken 分开,避免业务进程获得部署权限 |
生成随机密钥:
openssl rand -base64 48这些不是漏洞,是使用前必须知道的边界。
auth.agentToken 所有节点共用一个,不是每节点独立令牌。持有该令牌 = 能在任意已注册节点上以 root 权限执行 docker load / docker rm -f / docker run。
缓解:把 /api/v1/agent/* 限制在运维网段;令牌轮换流程见 deploy-agent。
探针必须能调本机 docker,等价于配置中心对这些机器拥有 docker 级控制权。不要把配置中心的 jwtSecret 交给不受信任的使用方——拿到 admin token 可以通过发布接口在节点上跑任意镜像。
etcd 里的 YAML 是明文。数据库口令、第三方 API key 会出现在 /config-center/shared/database 这样的 key 上,任何有 etcd 读权限的账号都能看到。
缓解:生产必须开 etcd RBAC(configure-server/scripts/etcd-rbac.sh),给每个服务只授 shared/ 前缀 + 自己那条精确 key 的 read。开发 compose 默认不开认证,不要直接搬到生产。
HS256 token 在 auth.expire(默认 24h)内一直有效,服务端没有撤销列表。改了 jwtSecret 会让所有已签发 token 立刻失效,这也是目前唯一的吊销手段。
登录失败锁定(5 次 / 10 分钟)计数在进程内存里,重启即清零,多实例部署时不共享。
GET /api.json 和 /swagger/ 不经过 JWT 路由,未登录可读,会暴露所有接口的字段结构。里面没有密钥,但对外网部署建议在反向代理上关掉。
配置中心计算并记录 sha256,但不做签名校验。能访问发布页并上传的账号,可以在节点上跑任意镜像。发布页权限等同于节点 root,分配 role 时按此考虑。目前只有 admin / operator 两档,没有更细的权限。
middleware.CORS 对开发便利做了宽松处理。中台与 API 同源部署(nginx 反代 /api)时,建议在代理层收紧跨域头。
配置中心和探针之间走 HTTP。跨主机部署应由反向代理终止 TLS,或把整条链路放在内网隔离环境里。探针的 agent.server 支持 https://,但需要自行处理证书。
四个 Go 模块的依赖集中在 go.work(见 仓库结构与构建)。定期自查:
go vet ./...
govulncheck ./... # 需要 golang.org/x/vuln/cmd/govulncheck
npm --prefix web audit前端构建依赖 Vite / React / shadcn(Radix),运行时不含 Node——web/dist 是纯静态文件,服务器不需要 Node 运行时。
| 日期 | 内容 |
|---|---|
| 2026-10 | 文档整理时确认:本地 manifest/config/config.yaml(含 jwtSecret、账户口令、agentToken)在三个模块的 .gitignore 里均已排除,未被提交。写配置的 controller 忽略请求体 operator、一律取 JWT 登录名,审计记录不可被调用方伪造。 |