dsh-web-login:为 DeepSeek Harness Web GUI 加一层独立密码门禁

前言

自托管 DeepSeek Harness 后,Web 界面往往直接暴露在局域网或公网上。Harness 自身有认证与 API 路径,但根路径 / 与前端入口在未额外加固时,仍可能被扫描器或误访问者先一步打开。反向代理、防火墙可以挡一部分流量,却未必覆盖「首次访问就要设密、失败要限流、操作要留痕」这类运维习惯。

下面介绍社区插件 dsh-web-login(维护者 liyang52520),在 admin-security 分类下,为 Harness Web GUI 提供独立于 Harness 内置流程的密码门:未通过验证的请求不会进入 Harness,也不会拿到 launch token;Harness 原有认证与 /api/* 不受影响。

这是什么

dsh-web-login 是一个零依赖的 Cordis 插件,接管 / 与 /index.html。通过验证后才会把请求转发给 Harness;凭证使用 scrypt 加盐哈希存储,会话 Cookie 经 HMAC-SHA256 签名并绑定主机。

插件当前版本为 1.4.0(见仓库 package.json),许可证 MIT,要求 Node >= 20。

核心功能

资料中明确列出的能力如下。

首次运行设置 — 首次访问时在页面上设置密码,须与 dsh 启动时打印的一次性 setup token 一并校验,避免公网扫描器抢先占坑。

会话 — 勾选「记住我」时默认 30 天,否则 12 小时;二者可在配置中修改。

暴力破解防护 — 同一真实客户端 IP 连续失败 5 次(默认)后锁定 300 秒(默认);IP 来源由 clientIpHeader 等配置决定。

审计日志 — 记录登录、改密、锁定、登出等事件,不记录密码明文。

管理界面 — 登录后在 Harness Settings → 登录门禁(Login Gate)中改密、重置密码、本机登出;界面随 Harness 主题变化。

与 Harness 的边界 — 插件不改动 Harness 对 /api/* 的处理;本地 Agent 若需绕过门禁,须显式配置 trustDirectLoopback 或通过 /__login 携带 Cookie,详见下文。

安装与启用

安装依赖 pnpm;dsh 未内置 pnpm,缺失时会报错 pnpm was not found 且 profile 不变。可先全局安装 pnpm,再用官方命令把插件加入 web profile:

npm i -g pnpm
dsh plugin --profile web add git+https://github.com/liyang52520/dsh-web-login.git

包声明了 dsh.bundle,dsh 会自动注册到 dsh.profile.bundles,一般无需手改配置文件。修改后需重启 dsh 加载插件;systemd 部署示例:

systemctl restart dsh

维护命令:

dsh plugin --profile web update dsh-web-login    # 升级
dsh plugin --profile web remove dsh-web-login    # 卸载

DSH_HOME 须与正在运行的实例一致(默认 ~/.dsh)。路径不一致时命令仍可能成功,但装到了别的 profile,对当前进程无效。

典型用法

首次设置密码

dsh 启动日志中会打印一次性 token,例如:

dsh web-login: setup-token: 7rJfiimRBtBZbZZqbEY3_O6VBO3Te-bA

在 systemd 下可用 journalctl -u dsh 查看;前台运行看终端;容器内看 docker logs。浏览器打开站点,输入 token 并设置密码即可完成首次配置。

在设置里管理门禁

登录 Harness 后进入 Settings → 登录门禁:

操作 效果
修改密码 校验当前密码后设置新密码;轮换签名密钥,其他设备会话失效
重置密码 删除已存密码,所有设备需重新走首次设置
登出 仅清除本设备会话

默认允许经密码验证的远程浏览器修改设置(unlockRemoteSettings: true);若仅允许本机 loopback 改设置,需了解 README 中「Settings are read-only」一节。

可选配置

在 profile 的 cordis.patch.yml 中按插件 id 写入 config(整段 config 会被替换,未列出的键保持默认):

- id: web-login
  config:
    title: My Harness
    rememberDays: 7

常用键(完整表见 GitHub README):

键 默认值 说明
enabled true 为 false 时不接管任何路由
title "DeepSeek Harness" 页面标题与登录页标题
passwordMinLength 8 密码最小长度
rememberDays 30 「记住我」会话天数
sessionHours 12 未勾选「记住我」时会话小时数
maxFailures 5 触发锁定的连续失败次数
lockoutSeconds 300 锁定时长(秒)
clientIpHeader "x-real-ip" 取真实客户端 IP 的 Header
trustDirectLoopback false 是否将无代理头的本机 loopback 请求视为已验证

本地 Agent 若需无 Cookie 直接访问文档,可在了解 SSH 隧道与同机任意用户等风险后开启:

- id: web-login
  config:
    trustDirectLoopback: true

更稳妥的做法是保持该选项关闭,向 /__login POST 密码并复用 dsh_gate Cookie。

登录后仍 403

多为 Harness 的 Host/Origin 校验与当前访问主机名不一致。插件首次遇到时会在日志中提示:为 dsh 声明 --trusted-host,并在反向代理后透传真实 Host 与 Origin(nginx 示例见 README Troubleshooting)。

适用场景与注意

适合谁 — 自托管 Harness、希望 Web 入口多一层密码门、需要失败锁定与审计、又希望管理入口集成在 Harness 设置里的部署者。

运行与信任 — 插件随当前 dsh 进程加载,权限与 dsh 相同。安装前应在 GitHub 阅读源码与 MIT 许可证,自行判断是否用于生产。

生态说明 — DeepSeek Harness 采用「一切皆插件」思路;SkillHub 插件目录 为社区站点,与 DeepSeek / 幻方无官方从属关系。手动安装勿同时混用 dsh plugin add 的 bundle 与 cordis.patch.yml 里重复的 web-login insert,否则配置树无法加载。

链接

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

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

Xiaoye