dsh-web-auth: DSH Web 的密码门与反代认证

前言

DSH(DeepSeek Harness)采用插件化架构,其 Web GUI 提供了强大的可视化管理能力。但在将 DSH Web 暴露在局域网或公网时,直接暴露端口意味着绕过了 SSH 层的访问控制,使得具备 Bash 执行能力的 Agent 直接暴露在风险之下。缺乏内置的 HTTP 认证机制,使得 Web UI 在反代场景下处于“裸奔”状态。

下面介绍 dsh-web-auth,一个为 DSH Web 增加密码访问认证与反代友好配置的插件。它通过登录页和 HttpOnly 签名 Cookie 实现了全站访问控制,并处理了 WebSocket 升级与反向代理环境下的 Cookie 安全问题。

插件介绍

  • 名称: fonlan/dsh-web-auth
  • 定位: DSH Web 插件,提供密码门认证(登录页 + HttpOnly 签名 Cookie),用于在反向代理后暴露 DSH Web。
  • 维护者: fonlan
  • 类别: admin-security
  • 许可证: MIT

核心功能

该插件通过服务端拦截与客户端 Cookie 签发,实现了以下能力:

  1. 登录页与 Cookie 管理:提供登录页,使用 HMAC-SHA256 对 Cookie 签名,7 天滑动续期。浏览器自动携带 Cookie,覆盖 HTTP、WebSocket、SSE 及静态资源。
  2. 首次引导与改密:未配置密码时显示设置表单。支持 GUI 改密,改密会轮换签名密钥并强制全员下线。
  3. 防爆破:基于 IP 的限速机制,连续失败触发指数退避,15 分钟内累计限制。
  4. 反代友好:Cookie 自动标记 Secure(跟随 x-forwarded-proto),限速信任反向代理的 X-Forwarded-For。
  5. 监听地址切换:支持在设置卡片中一键切换监听地址(127.0.0.1 <-> 0.0.0.0),热生效,无需重启进程。
  6. 远程设置解锁(可选):通过配置开启后,允许已登录用户在反代域名下访问设置面(模型页、插件配置等),默认关闭。
  7. 启动令牌收口:插件接管 DSH 的启动令牌逻辑,无需用户手工访问 ?token= 链接,登录后自动续期 DSH 会话。
  8. 密码存储:使用 scrypt 加盐哈希存储,文件权限 0600,不落明文。

安装与启用

安装插件需要 DSH 版本 0.1.5 起。

1、通过命令行安装:

dsh plugin --profile web add @fonlan/dsh-web-auth

2、重启 DSH Web 进程使插件生效。

3、首次设置密码:重启后访问 dsh web,系统会自动重定向到登录页。如果未设置过密码,页面将显示“设置访问密码”表单。输入 ≥8 位的新密码并确认即可完成初始化。

典型用法

修改密码

登录后进入 设置 → 插件 → 插件配置 → 访问认证 卡片,点击改密。需输入旧密码,新密码设置成功后,旧会话立即失效。

切换监听地址

在“访问认证”卡片底部,可以切换监听地址。
* 127.0.0.1:仅本机可访问。
* 0.0.0.0:监听所有网卡,局域网可访问。
切换操作会通过 HMR 热重载 WebServer,WebSocket 会短暂断开后自动重连。

启用远程设置解锁

默认情况下,通过反代域名访问时,设置页面会报错(因为 dsh 客户端判定域名非回环地址)。如需启用,需在 profile 的 cordis.patch.yml 中添加配置:

- id: web-auth
  config:
    unlockRemoteSettings: true

行为细节

插件对各类请求的处理逻辑如下:

场景 行为
未登录访问页面 302 重定向到 /login?next=原路径
未登录访问 API 401 JSON 响应
DSH 启动令牌交换 仅插件服务端 mint 重入,或持有插件会话的请求放行,并将响应中的 dsh-auth Set-Cookie 转发给浏览器
浏览器直接打开旧令牌 URL 302 到 /login,并丢弃 token 参数(旧令牌重启后即失效)
反代域名下已登录访问 请求被改写为回环来源,插件围栏不再拦截
反代域名下设置页 默认报错(settings are unavailable);开启 unlockRemoteSettings 后可用
跨站请求 403 拒绝
未登录 WebSocket 升级 401 拒绝握手
会话过期 跳回登录页;若剩余时间 < 24h,自动刷新续期
修改密码 轮换密钥,全员下线
切换监听地址 写入 settings,触发 HMR 重绑 webserver

安全模型与风险

使用该插件时,需特别注意以下安全点:

  1. 认证是访问控制,不是安全边界:DSH Agent 拥有 Bash 执行能力,即使有密码保护,也不要将其视为不可攻破的堡垒。
  2. 首密窗口期:未设置密码时,任何人都能访问登录页并抢注密码。建议在安装后第一时间设置密码,或通过 SSH 端口转发完成首密设置后再开放网络。
  3. 会话无状态:服务端无法单独吊销会话,密码泄露需修改密码以轮换签名密钥。
  4. 存储位置:密码哈希与密钥存放在 $DSH_HOME/web-auth/,权限 0600。
  5. 限速限制:限速为进程内存级,多实例部署时各自独立。

开发

插件的源码与构建逻辑如下:

pnpm install
npm run build      # host: tsc;client: esbuild
npm run typecheck
npm run test       # 单元 + 集成测试

总结

dsh-web-auth 通过轻量级的插件方式,为 DSH Web 提供了必要的认证与反代支持。它解决了“Web 界面如何安全暴露”的问题,同时也通过严格的会话管理、防爆破机制和透明的令牌收口,降低了直接暴露 Web UI 的风险。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜