Skip to content

[安全] hub+edge 配置面审计(默认值风险/文档缺口/命名一致性) #2124

Description

@DeliciousBuding

背景

hub+edge 的配置面(env 变量/config 结构体/默认值)从未系统盘点。本次只读审计覆盖 hub-server/internal/config/edge-server/cmd/agenthub-edge/config.go + 散落的 os.Getenv 调用点,按三点核查:①默认值风险 ②文档缺口 ③命名不一致。

基线 commit: 4b3f236b66cd417b600beb032e0c278891849ce9;主检出事后 git status --short 为空(只读审计)。

关联:#2098(edge 安全盘点)、#2067(授权点)— 本 issue 聚焦配置面,不重复 /debug/panic 门禁等已合规项。

1. 默认值风险(P1)

# 配置项 位置 当前默认 风险
1 AuthFailClosedDefault hub-server/internal/config/constants.go:145 false Redis 故障时 access-token jti 黑名单检查 fail-open,已登出(吊销)的 JWT 可复活进入产品 API。生产 compose 模板置 true,但代码默认不安全;新部署若漏配即裸奔
2 RateLimitFailOpenDefault hub-server/internal/config/constants.go:136 true Redis 故障时非 auth 限流失效放行请求(仅写 warn + X-Rate-Limit-Degraded 头)。auth 路径始终 fail-closed,但普通 API 可被洪水
3 db.sslmode hub-server/internal/config/config.go:58 + config_server_db.go:37 "disable" 未显式配置即明文连 PG;validateDB 仅校验合法值不强制 require/verify-*。跨公网/多租户部署易中招

建议:(a) 将 AuthFailClosedDefault 改为 trueRateLimitFailOpenDefault 改为 false,配合启动日志明确提示;或 (b) 在 Validate() 中当 server.env ∈ {production, prod, release} 时强制校验这两项已显式设置,否则拒绝启动。db.sslmode 在生产 env 下应强制非 disable

2. 命名不一致(P2/P3)

# 现象 位置 影响
N1 Log level env 名分裂 Hub AGENTHUB_SERVER_LOG_LEVEL (config_env_overrides.go:55) vs Edge AGENTHUB_LOG_LEVEL (main.go:133) 运维需记两套;compose 模板易错配
N2 TokenDance ID 双前缀并存 AGENTHUB_TOKENDANCE_ID_* (新) + AGENTHUB_TOKENDANCE_* (legacy),config_env_overrides.go:70-95 + handler/oidc.go:256-266 同时接受 兼容期合理,但应有废弃时间表与启动告警
N3 S3 双前缀 AGENTHUB_S3_* + 裸 S3_* (config_env_overrides.go:102-120) 同上
N4 AGENTHUB_EDGE_AUTH_TOKEN 语义重载 Edge 本地 bearer (cmd/agenthub-edge/config.go:156) vs Hub→Edge dispatch client (config.go:33 EdgeDispatchConfig.AuthToken) 同名不同义;阅读/排障成本高
N5 GIN_MODE 作为 server.env / CORS 回退 cors.go:43, ws.go:277 Gin 约定但与 AGENTHUB_ 体系不一致;生产误设 GIN_MODE=debug 会放宽 CORS
N6 第三方 key 直通 ANTHROPIC_API_KEY / OPENAI_API_KEY / CLAUDE_API_KEY / *_BASE_URL (adapters/claude/claude_code.go:403-412, sdk/*.go) 预期行为但跨命名空间;EnvSanitizer 责任重
N7 外部工具路径 CC_SWITCH_HOME / CLAUDE_CONFIG_DIR / CODEX_HOME 非 AgentHub 命名空间,记录即可

建议:N1 统一为 AGENTHUB_LOG_LEVEL(Hub 增加别名过渡);N2/N3 加启动 deprecation warning + 6 个月移除计划;N4 拆分 Hub 侧为 AGENTHUB_EDGE_DISPATCH_AUTH_TOKEN

3. 文档缺口(P2)

以下配置项在代码中存在且有默认值/行为影响,但 未在 docs/architecture/05-deployment.md 必填表或对应 owner 文档中列出

Hub Server

配置项 位置 备注
AGENTHUB_PPROF_USER / AGENTHUB_PPROF_PASS app/admin.go:36-37 debug 端点门禁;未配=404(fail-closed),但运维不知有此开关
AGENTHUB_CORS_ORIGINS middleware/cors.go:18 覆盖硬编码默认;生产默认列表在 cors.go:53-58
AGENTHUB_ADMIN_USERS middleware/auth.go:452 01-hub-server.md:71 一行;无格式/示例/安全注意
agent_team.* 全套 9 字段 config_agent_team.go max_delegation_depth/max_active_subagents_per_run/max_route_repeats/max_tasks_per_team_run/assignment_timeout/max_team_run_budget_tokens/max_team_run_budget_usage_pct/compete_max_agents/human_review_enabled — 无任何文档
egress.allow_cidrs/allow_hostnames/allow_plain_http/timeout config.go + config.yaml:67-76 08-outbound-http.md 描述行为但未列 env 名(viper AGENTHUB_EGRESS_*
upload.dir/max_size/allowed_mime_types + AGENTHUB_UPLOAD_ALLOWED_MIME_TYPES config_jwt_upload.go + config_env_overrides.go:121 未文档
s3.* 全套 + AGENTHUB_S3_* / 裸 S3_* config_s3.go + config_env_overrides.go:102-120 未文档
tokendance_id.http_timeout / max_response_body_bytes config_tokendance.go (#1564) 未在 05-deployment.md 列出

Edge Server

配置项 位置 备注
AGENTHUB_EVIDENCE_GATE_ENABLED lifecycle/evidence_gate.go:25 默认 true;未在 edge README 或 docs 列出
AGENTHUB_FAULT_ESCALATION_ENABLED / AGENTHUB_ESCALATION_TIMEOUT lifecycle/fault_escalation.go:43,53 仅 MAX_RETRIES 在 03-runtime-adapters.md:81 提及;另两个未文档
AGENTHUB_EVENT_WORKERS events/bus.go:114 默认 4;未文档
AGENTHUB_DELIVERY_JOURNAL_DB httpserver/server.go:342 durable journal 开关;未文档
AGENTHUB_DEPLOY_HOST / AGENTHUB_DEPLOY_PATH / AGENTHUB_PAGES_DOMAIN api/deploy.go:28-30 默认 remote-edge / /opt/agenthub-pages / example.agenthub.dev(占位);完全未文档
AGENTHUB_MEMORY_LIMIT_MB main.go:160 edge README:72 已列 ✅
AGENTHUB_HUB_MCP_SYNC_URL / AGENTHUB_HUB_MCP_SYNC_INTERVAL edge README:73 已列 ✅

建议:以 docs/architecture/05-deployment.md 为 SSOT 补全上述条目;Edge 侧同步更新 edge-server/README.md。agent_team 与 egress 可独立小节。

4. 修复切片建议(≤3 条)

  1. P1 默认值硬化(单 PR):改 AuthFailClosedDefault=true + RateLimitFailOpenDefault=falseValidate() 在 production env 下强制 db.sslmode != "disable";配套更新 05-deployment.md 安全配置节与 .env.example 注释。
  2. 命名统一 + deprecation(单 PR):Hub 增加 AGENTHUB_LOG_LEVEL 别名(优先于 AGENTHUB_SERVER_LOG_LEVEL);TokenDance/S3 legacy 前缀加启动 warn log + 文档标注废弃时间;Hub dispatch token 改名 AGENTHUB_EDGE_DISPATCH_AUTH_TOKEN(保留旧名 alias 一版)。
  3. 文档补全(单 PR):按上表补 05-deployment.md + edge-server/README.md;agent_team/egress/upload/s3 各开小节;PPROF/CORS/ADMIN_USERS 加入安全配置节。

5. 未覆盖面(诚实声明)

  • 未审计 hub-server/.env.example / deployments/production/docker-compose.yml 的实际值是否与代码默认一致(只读了 entrypoint 与 config 包)
  • 未审计 edge-server/internal/adapters/ 内各 adapter 的 model/env passthrough 完整清单(仅抽查 claude/codex/opencode/sdk)
  • 未跑测试套件、未连数据库/Redis(任务书约束)
  • 未覆盖前端 app/*/ 的环境变量(VITE_* 等)—— 范围限定 hub+edge 后端
  • AGENTHUB_RATE_LIMIT_FAIL_OPEN / AUTH_FAIL_CLOSED 已有文档(05-deployment.md §安全配置),但仍列入 P1 因代码默认与生产推荐相反

6. 抽查级证据(3 条)

$ grep -n "AuthFailClosedDefault\|RateLimitFailOpenDefault" hub-server/internal/config/constants.go
136:const RateLimitFailOpenDefault = true
145:const AuthFailClosedDefault = false

$ grep -n "sslmode" hub-server/internal/config/config.go
58:	v.SetDefault("db.sslmode", "disable")

$ grep -n "AGENTHUB_LOG_LEVEL\|AGENTHUB_SERVER_LOG_LEVEL" hub-server/internal/config/config_env_overrides.go edge-server/cmd/agenthub-edge/main.go
hub-server/internal/config/config_env_overrides.go:55:	if envLogLevel := os.Getenv("AGENTHUB_SERVER_LOG_LEVEL"); envLogLevel != "" {
edge-server/cmd/agenthub-edge/main.go:133:	switch strings.ToLower(getEnv("AGENTHUB_LOG_LEVEL", "info")) {

7. 主检出事态

$ git status --short --branch
## master...origin/master

空输出,只读审计未污染工作区。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Medium prioritysize-MMedium effort后端Hub Server、Edge-Hub 通信和后端服务

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions