dsh-remote:为 DeepSeek Harness 补上远程访问认证层

前言

DeepSeek Harness(DSH)的 dsh web 默认面向本机浏览器:工作区选择会弹出宿主机原生目录框,若干特权 API(host.pickDirectorysettings.*credentials.* 等)被官方硬编码限制在 loopback,文档里也写明「直到真正的认证层出现」。若要把 DSH 经 nginx、SSH 隧道、Tailscale 或 Frp 暴露到局域网或外网,远程用户既看不到原生选择框,也无法在未认证情况下安全使用这些接口。

@xgone/dsh-remote(GitHub:xgone/dsh-remote)正是针对这一缺口:在 dsh web 前增加账号密码登录、MFA(TOTP)门禁、签名会话 Cookie 与角色权限,并把目录选择改为浏览器内对话框。认证通过后自动放行 DSH 原本仅限本机的特权路径,全程不在宿主机弹出原生窗口。

这是什么

@xgone/dsh-remote 由维护者 xgone 发布,分类为 admin-security,MIT 许可证。npm 当前版本为 0.2.8。GitHub 仓库约 42 stars、2 forks。

一句话定位:让 DeepSeek Harness 可以被安全地远程访问——外网或局域网浏览器登录后即可使用完整 Web 功能,包括工作区选择与账号管理。

核心功能

远程访问与 DSH 特权放行

经反向代理或隧道暴露后,外部浏览器登录即可使用全部功能。插件作为认证层,认证通过后自动放行 DSH /api 中原本钉死在 loopback 的特权方法。

WebSocket 事件流(events.mux / events.host)在会话有效时正常建立。

浏览器内目录选择

DSH 默认目录选择器在 loopback 部署下会调用宿主机 OS 选择框,远程用户无法操作。本插件用 browse 后端替换:选择或新建工作区变为浏览器内双栏目录视图,带面包屑与新建文件夹,不弹宿主窗口。

账号密码与登录门禁

未登录访问任意路径均返回自包含登录页;/api 与 WebSocket 全部要求有效会话 Cookie。

会话采用 HMAC-SHA256 签名的 HttpOnly Cookie,可配置过期时间、Secure、SameSite;签名密钥随机生成并持久化,重启后会话仍有效。

密码以 scrypt 哈希存储(N=16384,r=8,p=1),配合常量时间比较,不落盘明文。登录失败按「IP + 用户名」限速,默认 15 分钟窗口内 5 次。

首次无账号时,登录页提供「创建首个管理员」,仅本机 loopback 可提交,防止远程抢先注册。根账号不可删除、不可改角色,只能重置密码。默认 adminOnly 模式禁止新建账号、强制 admin 角色;关闭后可启用 admin / user / guest 三层方法级权限。

MFA 两步验证(TOTP)

兼容 Google Authenticator、1Password、Authy 等标准认证器(RFC 6238,6 位 / 30 秒)。开启时展示二维码(SVG)、手动密钥、otpauth 链接与 10 个一次性备用码(备用码仅存 SHA-256 哈希)。登录页显示动态码剩余秒数倒计时,输入满 6 位自动验证;备用码含字母时需手动确认。管理员可用自己的密码为任意账号禁用 MFA。

设置页与体验细节

设置 → 登录与账号:MFA 自服务、账号列表、重置密码、退出登录。会话过期时 SPA 内出现全屏重登浮层。

界面通过 DSH 官方设计令牌(--dsw-alias-*)取色,自动跟随浅色 / 深色 / 跟随系统。登录页、MFA 引导、重登浮层、设置页均提供中英双语,跟随 DSH 应用语言设置;远程浏览器下插件还接管语言偏好的读写通道,经标准 settings.describe / settings.mutate RPC 与 settings.yaml 同步。

较新版本还修复了远程场景下插件配置页空白、欢迎弹窗反复出现、模型页「settings are unavailable」等问题(README 中分别标注 v0.1.5+、v0.1.6+、v0.2.6+)。

安装与启用

前置条件

  1. 已安装 DeepSeek Harness,可运行 dsh web(默认端口 3080);
  2. 已初始化 web profile(首次运行 dsh web 会自动初始化);
  3. 系统 PATH 中有 pnpmdsh plugin 管理 profile 插件时需要)。

安装插件

NPM 安装(推荐):

dsh plugin --profile web add @xgone/dsh-remote

固定版本示例:

dsh plugin --profile web add @xgone/dsh-remote@0.1.0

也可从 Git 或本地目录安装:

dsh plugin --profile web add git@github.com:xgone/dsh-remote.git
dsh plugin --profile web add ~/path/to/dsh-remote

dsh plugin 会在 ~/.dsh/profiles/web/ 下用 pnpm 安装包,并自动把 @xgone/dsh-remote 追加到 profile 的 dsh.profile.bundles,无需手动改 bundles 列表。

确认安装并重启

python3 -c "import json; print(json.load(open('$HOME/.dsh/profiles/web/package.json'))['dsh']['profile']['bundles'])"

期望输出类似:['@deepseek-ai/dsh-base', '@deepseek-ai/dsh-web-app', '@xgone/dsh-remote']

Web 表面禁用 HMR,必须重启 dsh web 才生效:

dsh web

首次创建管理员

重启后浏览器打开 http://127.0.0.1:3080

  1. 未登录会看到登录页;
  2. 无账号时进入引导模式,标题为「创建首个管理员账号」;
  3. 输入用户名与至少 6 位密码,点击创建——仅限本机 loopback 提交;
  4. 创建成功即登录并签发会话 Cookie。

验证:

curl http://127.0.0.1:3080/auth/me

应返回含 authEnabledauthenticated 等字段的 JSON。

无浏览器服务器(headless)

无法在本机浏览器完成引导时,可在 ~/.dsh/profiles/web/cordis.patch.yml 中预置首个管理员(账号库为空时生效,幂等):

- id: remote
  config:
    enabled: true
    bootstrap:
      username: admin
      password: '换成一个强密码'

首次登录后建议从配置中移除 bootstrap 节;反向代理部署通常还需 trustProxy: true(默认已开启)。

卸载

dsh plugin --profile web remove @xgone/dsh-remote

重启 dsh web 后门禁消失。$DSH_HOME/auth/store.json 会保留,需彻底清除可手动删除。

典型用法

绑定 MFA

登录后进入设置 → 登录与账号 → 双重验证 (MFA) → 启用双重验证:

  1. 扫码或手动输入密钥,保存 10 个一次性备用码;
  2. 在认证器中输入当前 6 位动态码,自动验证并启用;
  3. 之后每次登录需密码 + 动态码(或备用码)。

也可在登录页密码验证通过后,按引导就地绑定 MFA。

远程暴露

dsh web 经 nginx、SSH 隧道(ssh -L)、Tailscale 或 Frp 暴露后,远程浏览器访问同一入口 URL,先过登录门禁,再正常使用工作区选择与 API。HTTPS 部署时建议在 cordis.patch.ymlsession.secure 设为 true

主要配置项

编辑 ~/.dsh/profiles/web/cordis.patch.ymlremote 行的 config

- id: remote
  config:
    enabled: true
    session:
      cookieName: dsh_session
      ttlSeconds: 604800
      secure: false
      sameSite: lax
    enforceRoles: true
    adminOnly: true
    trustProxy: true
    mfa:
      enabled: true
      issuer: DeepSeek Harness
      window: 1
      backupCodes: 10
    rateLimit:
      maxAttempts: 5
      windowMs: 900000

紧急旁路:设 enabled: false 重启,或删除 $DSH_HOME/auth/store.json 重新引导。忘记 MFA 时由管理员在设置页为该账号禁用 MFA(需管理员密码)。

适用场景与注意

适合需要把 DSH Web 安全暴露到非本机浏览器的开发者:远程办公、内网穿透、无图形界面服务器上的 headless 部署等。

插件以当前 dsh 进程权限运行,安装前应阅读 GitHub 源码 与 MIT 许可证,确认符合你的安全策略。创建首个管理员仅限 loopback,是为防止公网抢先注册;公网暴露前务必完成账号创建并建议启用 MFA。

DSH 生态理念是「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。@xgone/dsh-remote 是社区维护的 admin-security 类插件,不是 DSH 内置组件。

链接

  • 目录页:https://www.skillhub.cn/plugins/xgone/dsh-remote
  • GitHub:https://github.com/xgone/dsh-remote
  • npm:https://www.npmjs.com/package/@xgone/dsh-remote
羽毛球分组比赛记分
小程序二维码

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

小夜