Releases: xbzbing/dsh-auth-gateway
Releases · xbzbing/dsh-auth-gateway
Release list
v0.4.1
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.key;dsh-auth-gateway-reset提示丢失认证器时otp.json与otp-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.1v0.4.0
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.0v0.3.1
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.1v0.3.0
0.3.0 里程碑:设置面板重样式(dsh 设计令牌)+ 全链路中英双语,并修复 0.2.0 遗留的 settings key bug。
新功能
- 设置面板重样式:按 dsh 设计令牌体系(
--dsw-alias-*)重写——卡片式布局、状态徽标、五类按钮、令牌输入框、dsh 风格对话框;明暗主题自动跟随 dsh; - 设置面板中英切换:按 dsh 官方 i18n 模式(
ctx.locale.register+tseat),随 dsh 界面语言实时切换(设置 → 语言); - 网关页面双语:登录 / 引导(onboarding)/ OTP 页面按语言偏好渲染——
$DSH_HOME/settings.yaml的locale.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.0v0.2.0
里程碑发布:项目更名为 dsh-auth-gateway,并落地认证流程升级、安全评审修复与两处重构。
包含 @adra2n 更新的 OTP 功能。
改名(全量)
- 包 / 插件注册名 / bundle id /
cordis.patch.yml→dsh-auth-gateway - bin 命令:
dsh-auth-gateway-reset/dsh-auth-gateway-uninstall - GitHub 仓库同步改名:
xbzbing/dsh-auth-gateway(旧 URL 自动重定向)
认证流程(替代旧 setup 页面,/login/setup 已彻底移除)
- 首次部署自动生成初始密码(控制台打印、一次性)→ 强制引导设置个人密码 → 重新登录
- 未完成引导的会话:页面 302
/onboarding、API 401onboarding-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
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.randomUUIDpolyfill(明文 LAN 访问兼容)、转发时 Host/Origin 改写为回环 + 请求目标规范化(绝对形式 URI → origin-form) - 运维:
dsh plugin --profile web add一步安装(自带dsh.bundlepatch)、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 绕过全局限速的防护;内存会话重启即下线。