背景
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 改为 true、RateLimitFailOpenDefault 改为 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 条)
- P1 默认值硬化(单 PR):改
AuthFailClosedDefault=true + RateLimitFailOpenDefault=false;Validate() 在 production env 下强制 db.sslmode != "disable";配套更新 05-deployment.md 安全配置节与 .env.example 注释。
- 命名统一 + deprecation(单 PR):Hub 增加
AGENTHUB_LOG_LEVEL 别名(优先于 AGENTHUB_SERVER_LOG_LEVEL);TokenDance/S3 legacy 前缀加启动 warn log + 文档标注废弃时间;Hub dispatch token 改名 AGENTHUB_EDGE_DISPATCH_AUTH_TOKEN(保留旧名 alias 一版)。
- 文档补全(单 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
空输出,只读审计未污染工作区。
背景
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)
AuthFailClosedDefaulthub-server/internal/config/constants.go:145falsetrue,但代码默认不安全;新部署若漏配即裸奔RateLimitFailOpenDefaulthub-server/internal/config/constants.go:136trueX-Rate-Limit-Degraded头)。auth 路径始终 fail-closed,但普通 API 可被洪水db.sslmodehub-server/internal/config/config.go:58+config_server_db.go:37"disable"validateDB仅校验合法值不强制require/verify-*。跨公网/多租户部署易中招建议:(a) 将
AuthFailClosedDefault改为true、RateLimitFailOpenDefault改为false,配合启动日志明确提示;或 (b) 在Validate()中当server.env ∈ {production, prod, release}时强制校验这两项已显式设置,否则拒绝启动。db.sslmode在生产 env 下应强制非disable。2. 命名不一致(P2/P3)
AGENTHUB_SERVER_LOG_LEVEL(config_env_overrides.go:55) vs EdgeAGENTHUB_LOG_LEVEL(main.go:133)AGENTHUB_TOKENDANCE_ID_*(新) +AGENTHUB_TOKENDANCE_*(legacy),config_env_overrides.go:70-95+handler/oidc.go:256-266同时接受AGENTHUB_S3_*+ 裸S3_*(config_env_overrides.go:102-120)AGENTHUB_EDGE_AUTH_TOKEN语义重载cmd/agenthub-edge/config.go:156) vs Hub→Edge dispatch client (config.go:33 EdgeDispatchConfig.AuthToken)GIN_MODE作为server.env/ CORS 回退cors.go:43,ws.go:277AGENTHUB_体系不一致;生产误设 GIN_MODE=debug 会放宽 CORSANTHROPIC_API_KEY/OPENAI_API_KEY/CLAUDE_API_KEY/*_BASE_URL(adapters/claude/claude_code.go:403-412,sdk/*.go)CC_SWITCH_HOME/CLAUDE_CONFIG_DIR/CODEX_HOME建议: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_PASSapp/admin.go:36-37AGENTHUB_CORS_ORIGINSmiddleware/cors.go:18cors.go:53-58AGENTHUB_ADMIN_USERSmiddleware/auth.go:45201-hub-server.md:71一行;无格式/示例/安全注意agent_team.*全套 9 字段config_agent_team.goegress.allow_cidrs/allow_hostnames/allow_plain_http/timeoutconfig.go+config.yaml:67-7608-outbound-http.md描述行为但未列 env 名(viperAGENTHUB_EGRESS_*)upload.dir/max_size/allowed_mime_types+AGENTHUB_UPLOAD_ALLOWED_MIME_TYPESconfig_jwt_upload.go+config_env_overrides.go:121s3.*全套 +AGENTHUB_S3_*/ 裸S3_*config_s3.go+config_env_overrides.go:102-120tokendance_id.http_timeout/max_response_body_bytesconfig_tokendance.go(#1564)Edge Server
AGENTHUB_EVIDENCE_GATE_ENABLEDlifecycle/evidence_gate.go:25AGENTHUB_FAULT_ESCALATION_ENABLED/AGENTHUB_ESCALATION_TIMEOUTlifecycle/fault_escalation.go:43,5303-runtime-adapters.md:81提及;另两个未文档AGENTHUB_EVENT_WORKERSevents/bus.go:114AGENTHUB_DELIVERY_JOURNAL_DBhttpserver/server.go:342AGENTHUB_DEPLOY_HOST/AGENTHUB_DEPLOY_PATH/AGENTHUB_PAGES_DOMAINapi/deploy.go:28-30remote-edge//opt/agenthub-pages/example.agenthub.dev(占位);完全未文档AGENTHUB_MEMORY_LIMIT_MBmain.go:160AGENTHUB_HUB_MCP_SYNC_URL/AGENTHUB_HUB_MCP_SYNC_INTERVAL建议:以
docs/architecture/05-deployment.md为 SSOT 补全上述条目;Edge 侧同步更新edge-server/README.md。agent_team 与 egress 可独立小节。4. 修复切片建议(≤3 条)
AuthFailClosedDefault=true+RateLimitFailOpenDefault=false;Validate()在 production env 下强制db.sslmode != "disable";配套更新05-deployment.md安全配置节与.env.example注释。AGENTHUB_LOG_LEVEL别名(优先于AGENTHUB_SERVER_LOG_LEVEL);TokenDance/S3 legacy 前缀加启动 warn log + 文档标注废弃时间;Hub dispatch token 改名AGENTHUB_EDGE_DISPATCH_AUTH_TOKEN(保留旧名 alias 一版)。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)app/*/的环境变量(VITE_* 等)—— 范围限定 hub+edge 后端AGENTHUB_RATE_LIMIT_FAIL_OPEN/AUTH_FAIL_CLOSED已有文档(05-deployment.md §安全配置),但仍列入 P1 因代码默认与生产推荐相反6. 抽查级证据(3 条)
7. 主检出事态
空输出,只读审计未污染工作区。