Skip to content

Releases: xbzbing/dsh-auth-gateway

v0.4.1

Choose a tag to compare

@xbzbing xbzbing released this 18 Aug 11:07

0.4.1 安全增强:OTP 密钥静态加密(AES-256-GCM)(PR #6,by adra2n)。

变更

  • OTP 密钥加密存储:TOTP secret 落盘前以 AES-256-GCM 密封(v1.<iv>.<tag>.<cipher>),读取需 32 字节主密钥——$DSH_HOME 文件泄露不再直接交出第二因素根密钥;
  • 主密钥来源:环境变量 DSH_AUTH_GATEWAY_MASTER_KEY(hex/base64,建议生产置于 KMS / Docker secret / 加密卷)> 自动生成的 auth-gate/otp-master.key(0600);旧明文 otp.json 零迁移兼容(按 v1. 前缀判断);
  • 错误分类:解密失败不再退化为裸 500——otp-master-key-missing(503)/ otp-master-key-invalid(500)/ otp-secret-corrupted(500)均以带说明的 JSON 返回,指引恢复路径(恢复 key 或删 otp.json 重绑);
  • 重放水印钳制:未来步验证码仍可登录,但 lastCounter 不再超前——避免合法当前/下一步验证码被永久当作重放、把用户锁在 TOTP 外;
  • 运维.gitignore 忽略 otp-master.keydsh-auth-gateway-reset 提示丢失认证器时 otp.jsonotp-master.key 一并删除;
  • 测试 104 → 116(新增:磁盘密文、往返、篡改拒绝、密钥缓存、env 覆盖、明文迁移、缺失 key 不再静默再生成、typed 错误码、水印钳制回归)。

已知限制

  • 主密钥不支持热轮换(进程内缓存一次);轮换需删除 otp.json + key 文件后重新绑定;
  • 默认自动生成密钥文件时,密钥与密文同目录,仍属本机可信模型——生产请用环境变量注入主密钥并置于加密卷/外部密钥管理。

安装

dsh plugin --profile web add dsh-auth-gateway   # npm 0.4.1
dsh plugin --profile web add github:xbzbing/dsh-auth-gateway#v0.4.1

v0.4.0

Choose a tag to compare

@xbzbing xbzbing released this 17 Aug 15:09

0.4.0 重大更新:onboarding 引导流程重构为两步页面 + 桌面端 UI 彻底重排

变更

  • 两步 onboarding:首次登录引导拆分为 /onboarding(可选 OTP 绑定,加载即自动开始,可跳过)与 /onboarding/password(强制设置个人密码,全部功能在此之前保持锁定);
  • 绑定 OTP 不再中途踢出:onboarding 会话绑定成功后保留会话与 Cookie,直接进入密码步骤,由设置密码一次性吊销全部会话(此前绑定即吊销、需重新登录再走引导);
  • 禁用 OTP 修复:跳过 lastCounter 时间戳校验——同一时间步内刚用于登录的验证码不再被拒绝(禁用属破坏性操作,水印校验无安全增益);面板对 invalid-otp 显示友好提示;
  • 桌面端 UI 重构:卡片由固定 420px 加宽至 min(680px, …),绑定区改为两列布局(左 QR + 密钥,右验证表单 + 跳过);绑定成功后隐藏绑定区、仅展示备份码与「下一步」——整个流程一屏放下、无需滚动;手机端自动回退单列;
  • 页面打磨:登录页 / OTP 页验证码输入框双语 placeholder(替代 000000);OTP 设置页按来源显示「下一步」按钮;onboarding 与 OTP 页面统一全屏装饰相框;控制台首次部署通知补充 OTP 引导说明(中英双块);
  • 文档:README(中/英)与 DEPLOYMENT 补充卸载顺序提醒——先运行凭据命令(reset/uninstall),再 dsh plugin remove(remove 会使内置 bin 悬空);
  • 测试 102 → 104(新增:onboarding 中途绑定不吊销 + 禁用同时间步验证码回归)。

安装

dsh plugin --profile web add dsh-auth-gateway   # npm 0.4.0
dsh plugin --profile web add github:xbzbing/dsh-auth-gateway#v0.4.0

v0.3.1

Choose a tag to compare

@xbzbing xbzbing released this 17 Aug 10:21

0.3.1 修复与设计变更:启用 OTP 不再需要部署配置开关

变更

  • 2FA 成为用户操作:任何已登录用户可在「认证设置」面板直接启用 OTP(otpEnabled 配置字段废弃,不再拦截 /otp/enable/otp/verify-setup);
  • 启用即吊销全部会话:绑定验证成功后,所有在纯密码策略下建立的会话(含启用者自身)立即失效,响应带过期 Cookie 与 sessionRevoked 标记;面板展示一次性备份码后引导重新登录(此后登录需密码 + OTP);
  • onboarding 页 OTP 步骤改为按实际激活状态显示(otpBindingAvailable);
  • 文档同步:README 配置表标注 otpEnabled 废弃、SECURITY.md 更新 DoS 面说明(启用成功后吊销全部会话作为缓解);
  • 测试 101 → 102(新增完整 HTTP 流测试:无配置启用 → 会话踢出 → 备份码重新登录)。

安装

dsh plugin --profile web add dsh-auth-gateway   # npm 0.3.1
dsh plugin --profile web add github:xbzbing/dsh-auth-gateway#v0.3.1

v0.3.0

Choose a tag to compare

@xbzbing xbzbing released this 17 Aug 09:48

0.3.0 里程碑:设置面板重样式(dsh 设计令牌)+ 全链路中英双语,并修复 0.2.0 遗留的 settings key bug。

新功能

  • 设置面板重样式:按 dsh 设计令牌体系(--dsw-alias-*)重写——卡片式布局、状态徽标、五类按钮、令牌输入框、dsh 风格对话框;明暗主题自动跟随 dsh;
  • 设置面板中英切换:按 dsh 官方 i18n 模式(ctx.locale.register + t seat),随 dsh 界面语言实时切换(设置 → 语言);
  • 网关页面双语:登录 / 引导(onboarding)/ OTP 页面按语言偏好渲染——$DSH_HOME/settings.yamllocale.preference 优先(dsh 设置中切换、刷新即生效),未设置时跟随浏览器 Accept-Language,最后兜底中文;
  • 控制台提示中英对照:首次部署初始密码提示中文块 + 英文块,同一凭据。

修复

  • settings key 错配(0.2.0 携带):设置面板读取 config['dsh-auth-gate'],服务端返回 config['dsh-auth-gateway'] → OTP 启用后面板误显示"未启用"。已修复并加契约回归断言。

重构与质量

  • strengthError 提取到 lib/page-shell.js 共享(页面渲染字节等价);
  • 新增 lib/locale.js(语言决策链)与 tests/locale.test.mjs
  • 测试 93 → 101 全绿;README 双语切换行、安装三种方式(npm/github/file:)、双语功能说明。

安装

dsh plugin --profile web add dsh-auth-gateway   # npm 0.3.0
dsh plugin --profile web add github:xbzbing/dsh-auth-gateway#v0.3.0

v0.2.0

Choose a tag to compare

@xbzbing xbzbing released this 17 Aug 08:21
fc2a466

里程碑发布:项目更名为 dsh-auth-gateway,并落地认证流程升级、安全评审修复与两处重构。

包含 @adra2n 更新的 OTP 功能。

改名(全量)

  • 包 / 插件注册名 / bundle id / cordis.patch.ymldsh-auth-gateway
  • bin 命令:dsh-auth-gateway-reset / dsh-auth-gateway-uninstall
  • GitHub 仓库同步改名:xbzbing/dsh-auth-gateway(旧 URL 自动重定向)

认证流程(替代旧 setup 页面,/login/setup 已彻底移除)

  • 首次部署自动生成初始密码(控制台打印、一次性)→ 强制引导设置个人密码 → 重新登录
  • 未完成引导的会话:页面 302 /onboarding、API 401 onboarding-required、WebSocket 拒绝

安全修复(评审六项 Required 全部落实)

  • WebSocket 升级补上 onboarding 门禁(原可绕过读取事件流)
  • 丢失认证器可用备份代码登录(登录页切换按钮 + /login/auth 服务端支持;单次使用、共享限流与锁定)
  • otpVerifyPage${digits} 字面量插值修复;客户端禁用 OTP 位数动态化
  • 失败计数 / OTP 窗口 Map 过期清理(#pruneRateState
  • otp.json 损坏 fail-loud(不再静默降级 2FA)
  • /login/change 错误旧密码计入共享锁定

重构

  • lib/gateway-otp.js:OTP 路由 handler 自 lib/gateway.js 拆分(1124 → 828 行)
  • lib/page-shell.js:login / onboarding / otp 三页面的 CSS、HTML 骨架、脚本头去重(渲染结构逐字节等价)

文档与测试

  • README 默认中文 + README.en.md 英文版;SECURITY / DEPLOYMENT / TESTING / DEVELOPMENT 重写;docs/PROPOSAL.md 移除;截图 6 张重新生成
  • 测试 93/93(新增 onboarding 门禁、备份码登录、fail-loud、Map 清理、改密锁定回归)
  • 实机验证:verify.sh 17/17、e2e 14/14、备份码登录链路(登录 200 → 重放 401)

dsh-password-gate 0.1.0

Choose a tag to compare

@xbzbing xbzbing released this 14 Aug 20:18

dsh-password-gate 0.1.0(安全修复版)

DeepSeek Harness Web 提供密码登录门禁的 Cordis 插件(host-only,零构建、零运行时依赖)。

本版为安全审查修复后的重新发布(原 0.1.0 已撤回)。

功能

  • 真实请求拦截:网关独占对外端口,每个 HTTP 请求与 WebSocket 升级先过认证检查——未认证 /api/* 返回 401、页面类路径 302 到登录页、WS 握手拒绝;内部 webserver 由 bundle patch 钉在回环端口,网关是唯一入口
  • 密码流程:首次打开设置密码 → 登录 → 修改密码(/login,已登录时直接显示改密表单)→ 登出
  • 密码策略:至少 8 位 +(大小写混合 或 特殊字符),服务端强制 + 前端即时反馈,全部可配置
  • 多层防爆破:per-IP 失败锁定(5 次/5 分钟)+ 全局速率限制(60 次/分钟,防多 IP 轮换);scrypt 在 libuv 线程池异步执行,登录洪峰不阻塞事件循环、不影响已登录用户
  • 爆破提醒:锁触发/限流耗尽时 ctx.logger.warn 告警 + ctx.emit('dsh-password-gate/brute-force', payload) 事件(JSON 安全负载,每锁定/窗口一次),符合 dsh 插件规范
  • 会话:scrypt 哈希存储、内存 256-bit token(30 天)、HttpOnly + SameSite=Strict cookie、改密吊销全部会话
  • 安全适配crypto.randomUUID polyfill(明文 LAN 访问兼容)、转发时 Host/Origin 改写为回环 + 请求目标规范化(绝对形式 URI → origin-form)
  • 运维dsh plugin --profile web add 一步安装(自带 dsh.bundle patch)、dsh-password-gate-uninstall / -reset 命令

安装

dsh plugin --profile web add dsh-password-gate   # 或 file: 本地路径
dsh web                                          # 打开 http://<host>:3080

验证

  • 48 个单元/契约测试(node:test),含安全契约回归:DNS-rebinding/跨站请求无会话 cookie 到不了上游、伪造 cookie 拒绝、绝对 URI 规范化、异步 scrypt、限流与锁定事件
  • 实机端到端 E2E(Playwright)
  • 详见 README 与 docs/PROPOSAL.md

已知限制(MVP)

本机用户可直连内部端口(本机可信模型);明文 HTTP(LAN 部署建议可信网络或前置 TLS);无分布式/换 IP 绕过全局限速的防护;内存会话重启即下线。