Files
Nexus/docs/reports/2026-06-06-external-attack-hardening-backlog.md
T
Nexus Agent eab35a35be fix(security): BL-06 强制 Agent per-server key 并合并心跳单次查库
移除 Agent 认证与安装链路的 global API_KEY 回退,收口 risk-acceptance 接受项 2;巡检补修心跳重复 get_server 并加 assert_called_once 回归测试。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-07 11:17:41 +08:00

4.1 KiB
Raw Blame History

外网攻击面加固 Backlogaudit_only 产出)

日期2026-06-06
来源2026-06-06-external-attack-surface-audit.md
状态BL-01BL-07 已实施/已接受BL-08 不需要(运维确认);BL-06 已实施2026-06-07


P2 — 建议优先

BL-01 收紧 PUBLIC_PREFIXES 前缀匹配 已实施

字段 内容
问题 EXT-01 /health/detail、EXT-02 bing-wallpapers/sync 被前缀误放行
方案 A /health 改为精确路径列表;/api/settings/bing-wallpapers 仅匹配 GET(或拆路由前缀)
方案 B _is_public_path 改为精确匹配 + 显式允许方法
涉及文件 server/api/auth_jwt.py
验收 无 JWT 时 GET /health/detail → 401POST .../sync → 401
回滚 恢复 PUBLIC_PREFIXES 元组

BL-02 /health/detail 强制鉴权(防御纵深) 已实施

字段 内容
问题 /api/ 路径不走 JwtAuthMiddleware
方案 handler 内显式 if admin is None: raise 401;或把 detail 移到 /api/health/detail
涉及文件 server/api/health.pyserver/main.py DbSessionMiddleware 路径列表
验收 生产探测 401

BL-03 bing_wallpapers_sync 拒绝 admin is None 已实施

字段 内容
方案 Depends(get_current_admin) 返回 None 时 raise 401(与 BL-01 双保险)
涉及文件 server/api/settings.py

H — 信息暴露与运维

BL-04 生产关闭 OpenAPI / Swagger / ReDoc 已实施

字段 内容
问题 EXT-03 全 API schema 公网可读
方案 A FastAPI(..., docs_url=None, redoc_url=None, openapi_url=None)
方案 B Nginx/1Panel location deny 或 internal only
验收 GET /openapi.json → 404
备注 开发环境可保留文档

BL-05 已安装后隐藏 install 指纹 已实施

字段 内容
实现 _raise_not_found_if_locked();全部 install 端点锁定后 404
涉及文件 server/api/install.pytests/test_install_locked_404.py
验收 锁定后所有 /api/install/* → 404

BL-06 Agent per-server key 迁移 已实施

字段 内容
问题 global API_KEY legacy 回退(原 risk-acceptance 接受项 2
方案 移除 agent.py / servers.py / script_service.py 中 global 回退;强制 per-server key
实施日期 2026-06-07(生产 0 台子机窗口)
验收 tests/test_agent_per_server_key.pyglobal key 打 heartbeat → 401
changelog docs/changelog/2026-06-07-agent-per-server-key-enforced.md

BL-07 WebSocket 外网探测与反代 已澄清/接受

字段 内容
原问题 外网无 token 探测见 HTTP 403,误以为反代未转发 WS
结论 直连 8600 同为 4031Panel 反代已带 Upgrade有效 JWT 可连 /ws/alerts/ws/sync
根因 websocket.close(4001/4401)accept() 前 → 黑盒见 HTTP 403,非安全缺陷
证据 2026-06-06-external-hardening-deploy-verification.md §WebSocket
动作 更新 security_probe_external.sh:无 token 拒绝即 PASS无需改 Nginx

BL-08 全站 IP 白名单 不需要

字段 内容
决定 2026-06-06 运维确认:不实施
理由 单人自用;2000+ 子机 Agent 需放行 /api/agent/*,全站白名单 ROI 低
维持 仅 login IP allowlistLOGIN_ALLOWLIST_ENABLED)即可

验证清单(修复批次)

NEXUS_PROBE_BASE=https://api.synaglobal.vip bash scripts/security_probe_external.sh
# 期望:health/detail 401bing sync 401openapi 404(若 BL-04
bash scripts/local_verify.sh

不建议本轮做

原因
WS ticket 首帧鉴权 单人运维 ROI 低,已接受
登录暴破 CAPTCHA 已有 15min 锁定
关闭 /agent/install.sh 公网 破坏远程安装流程