dsh-plugin-auth-guard:为 DeepSeek Harness 加一层零信任认证与访问控制

前言

DeepSeek Harness(DSH)是一个面向本地桌面工作流的 AI coding agent runtime,默认围绕 127.0.0.1 设计。一旦想把它开放给局域网里的手机、平板,或者部署到云服务器上,会接连碰到几个障碍:

1、非 localhost 来源调用特权接口(如 settings.describellm.providers)会被 403 Forbidden 拦下,远程切换模型做不了;
2、移动端浏览器在纯 HTTP 环境下没有 Secure Context,crypto.randomUUID 未定义,RPC 全部失败;
3、对局域网或公网开放端口后没有认证机制,同一网络里的任何人都能创建会话、通过 agent 执行命令。

dsh-plugin-auth-guard 针对的就是这组问题:绑定并暴露网络、注入移动端 polyfill、在 TCP 层建一道默认拒绝的认证网关。下面介绍它的功能、安装和配置。

这是什么

dsh-plugin-auth-guard 是 DeepSeek Harness(DSH)的认证与访问控制插件,作者 lijx122,MIT 许可,要求 Node.js >= 20。一句话定位:企业级零信任认证、局域网/公网访问控制与安全网关插件。

DSH 的理念是一切皆插件,这个插件同样以 bundle 形式接入:在 TCP 服务器层拦截 HTTP request 与 WebSocket upgrade 事件,构建默认拒绝(Default-Deny)零信任网关——不进白名单的请求,一律先过认证。

核心功能

网络暴露与特权 RPC 代理

1、将 DSH Web GUI 绑定到 0.0.0.0:3080,并动态枚举所有活跃的局域网 IPv4 接口;
2、为已认证客户端安全代理特权 RPC(settings.describellm.providerscredentials.*),消除 403 Forbidden;
3、通过 tapIndex 动态向 <head> 注入移动端 crypto.randomUUID polyfill,保证纯 HTTP 下移动端正常工作。

默认拒绝网关

  • 在 TCP 服务器层拦截 HTTP request 与 WebSocket upgrade 事件;
  • 未认证访问核心 RPC(/api/*)、插件管理(/api2/*)、侧边栏路由(/sidebar/*)一律以 HTTP 401 阻断,或直接销毁 WebSocket。

凭据与令牌生命周期

  • 密码以 32 字节加盐 Scrypt 哈希存储,敏感配置字段以 .role('secret') 声明,防止明文外泄;
  • 使用 crypto.timingSafeEqual 做常量时间校验,防时序侧信道攻击;
  • HMAC-SHA256 令牌内嵌当前密码指纹,修改密码后毫秒级全局吊销所有令牌;
  • 修改密码或登出时自动终止所有活跃的远程终端/事件 WebSocket。

防伪造与限流

  • 校验 req.socket.remoteAddress,防止 Host: 127.0.0.1 伪造与代理回环反转;
  • IP 滑动窗口限流:连续失败 5 次封禁 15 分钟(HTTP 429),并带自动垃圾回收;
  • 全局突发限流:所有 IP 合计登录频率限制为 40 req/min;
  • 请求体超过 64KB 立即中断,防止流式 OOM 拒绝服务;
  • 基于严格主机名匹配的 CSRF 与跨站 WebSocket 劫持(CSWSH)防护。

界面与多标签同步

  • 遵循 DSH 设计系统(--dsw-* CSS tokens、fish logo);
  • 锁屏挂载于 document.bodyz-index: 2147483647),加背景模糊防点击穿透;
  • 基于 BroadcastChannel 实现多标签页状态即时同步。

安装与启用

官方提供三种方式。

方式一,DSH CLI(README 推荐):

dsh plugin --profile web add github:lijx122/dsh-plugin-auth-guard

方式二,DSH Web Marketplace:在 DSH Web GUI 依次进入 Settings → Plugins → Marketplace,搜索 auth-guard,点击 Install。

方式三,本地链接(开发者模式):

1、把仓库克隆到 ~/.dsh/plugins/dsh-plugin-auth-guard
2、在 ~/.dsh/profiles/web/package.jsondependencies 中添加:

{
  "dependencies": {
    "dsh-plugin-auth-guard": "link:../../plugins/dsh-plugin-auth-guard"
  }
}

3、把 dsh-plugin-auth-guard 追加到 dsh.profile.bundles,然后重启 DSH。

配置入口

安装后进入 Settings → Security & Access(安全与访问),主要配置有四项:

  • Require password for LAN/Remote access:非 localhost 来源访问时要求密码,默认启用;
  • Enforce authentication globally:对 127.0.0.1 也强制认证,可选开启;
  • Administrator Credentials:设置或修改管理员用户名与密码,密码不少于 6 个字符;
  • Active LAN IP Directory:实时列出所有监听中的 LAN 地址,支持一键复制。

默认策略是只对非 localhost 来源强制密码认证;如果本机也要走认证,需要额外开启全局认证选项。

反向代理部署

README 里有一节「5 Essential Reverse Proxy Settings」,针对 Nginx / Caddy / Cloudflare 部署共给出 5 项设置。其中第 1 项是调大 Nginx 的 client_max_body_size:Nginx 默认 1MB,会以 413 拒绝图片和文件上传。其余设置项请直接查看仓库 README 的对应章节。

适用场景与注意事项

适合谁:

  • 需要在手机/平板上通过局域网访问 DSH Web GUI 的开发者;
  • 把 DSH 部署在云服务器、需要公网访问的场景;
  • 局域网环境不完全可信、希望对未认证请求默认拒绝的团队。

注意事项:

1、插件默认只拦非 localhost 来源,127.0.0.1 需要手动开启全局认证;
2、密码最少 6 个字符;修改密码后所有已发令牌立即失效,活跃的远程终端连接也会被终止;
3、插件以当前 dsh 进程的权限运行,安装前建议先检查源码与许可证(本项目为 MIT);
4、运行环境要求 Node.js >= 20。

结尾

回顾一下:把 DSH 开放到局域网或公网,需要解决认证、防伪造、限流和移动端兼容这几件事,dsh-plugin-auth-guard 把它们打包成了一个可直接安装的 bundle,并在 TCP 层以默认拒绝的方式兜底。

  • 仓库地址:https://github.com/lijx122/dsh-plugin-auth-guard
  • 社区目录页:https://www.skillhub.cn/plugins/lijx122/dsh-plugin-auth-guard (目录为独立社区站点,与 DeepSeek / 幻方无官方从属关系)
羽毛球分组比赛记分
小程序二维码

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

小夜