前言¶
DeepSeek Harness(DSH)是一个面向本地桌面工作流的 AI coding agent runtime,默认围绕 127.0.0.1 设计。一旦想把它开放给局域网里的手机、平板,或者部署到云服务器上,会接连碰到几个障碍:
1、非 localhost 来源调用特权接口(如 settings.describe、llm.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.describe、llm.providers、credentials.*),消除 403 Forbidden;
3、通过 tapIndex 动态向 <head> 注入移动端 crypto.randomUUID polyfill,保证纯 HTTP 下移动端正常工作。
默认拒绝网关¶
- 在 TCP 服务器层拦截 HTTP
request与 WebSocketupgrade事件; - 未认证访问核心 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.body(z-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.json 的 dependencies 中添加:
{
"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 / 幻方无官方从属关系)