DeepSeek Harness (DSH) 的内置浏览器信任边界 (trustedHosts) 是为了防御 DNS 重绑定,而非身份认证。只要 Host 头通过验证,任何人都可以使用 Web UI。如果你将 Harness 暴露在非回环地址(如公网 IP、局域网),访问者无需任何凭证即可使用界面。dsh-rgate 插件为自托管部署添加了缺失的身份认证层。
插件定位¶
这是一个远程访问登录门禁,提供全页密码墙、API 限制和会话 Cookie。它由 raomaiping-hash 维护,解决的是 Web UI 缺乏认证机制的问题,使得 IP 扫描器在遇到公开地址时只能看到登录页面,而无法直接访问 Harness 的接口。
核心功能¶
-
全页密码墙
通过注入门禁脚本到index.html,非回环访问者(如127.0.0.1、localhost、::1除外)会被重定向到/rgate-login登录页。 -
完整的 API 限制
所有/apiRPC 请求在未认证时返回401。插件注册了自身的/api/remote-auth.*端点,不再代理或遮蔽 Harness 原生的 API 路由。 -
会话管理
使用rgate_sessionCookie,设置HttpOnly和SameSite=Strict,有效期 7 天。会话存储在内存中,登出和修改密码会清除所有会话。 -
无 ?token= URL
插件生成 HMAC 签名的rgate_authCookie,补全了 Harness 原生dsh-client-connection对 Cookie 的验证,使得访问者无需在 URL 中携带?token=参数。 -
登录限流
每个客户端限制 5 次失败尝试,随后触发指数退避(最慢 16 分钟),并使用Cf-Connecting-Ip(配合 Cloudflare Tunnel)作为客户端标识,防止单一攻击者锁定所有用户。 -
审计日志
登录成功/失败、锁定、密码变更操作会记录到 Harness 的日志(journald)中,且不记录密码明文。 -
密码存储
密码使用 scrypt 算法(N=16384, r=8, p=1)加盐存储在~/.dsh/remote-auth.json(权限 0600)中。 -
远程访问设置
在 DSH 的设置平面中提供远程访问状态、登录/登出和修改密码的入口。 -
来源验证
登录和登出接口会检查 HTTP 来源,拒绝跨站表单提交。
安装与启用¶
从 GitHub 安装该插件(无构建步骤):
dsh plugin --profile web add github:raomaiping-hash/dsh-rgate
安装完成后,重启 web profile。插件激活时会输出 [rgate] 门禁已启用 …,并在首次启动时在 ~/.dsh/remote-auth.json 中生成一个随机密码。
典型用法¶
- 查看激活日志
通过以下命令确认插件已生效:
journalctl -u deepseek-harness | grep rgate
-
恢复忘记的密码
如果忘记了密码,直接删除~/.dsh/remote-auth.json文件并重启 Harness 服务。服务日志中会打印新的随机密码。 -
更改密码
使用已认证的会话发送 POST 请求到/api/remote-auth.password。 -
查看门禁状态
通过/api/remote-auth.status检查当前配置、认证状态及是否为回环访问。
适用场景与注意¶
适用场景:适合单密码、个人或小型团队的自托管部署。
注意:
* 威胁模型:该插件假设 Harness 进程和主机文件系统是可信的。如果攻击者能读取 remote-auth.json 或进程内存,他们已经获得了主机权限。它不替代操作系统的网络安全卫生、HTTPS 终止或上游访问控制。
* WebSocket 未受保护:/api/events.mux 和 /api/events.host WebSocket 升级不受门禁限制。已通过认证的客户端仍可建立连接。
* 内存会话:会话存储在内存中,重启 Harness 会强制所有用户登出。
* 静态资源公开:未认证访客仍可访问静态资源(JS/CSS),但所有数据交互仍需通过 API 门禁。
总结¶
dsh-rgate 为 DeepSeek Harness 的 Web UI 提供了基础的认证层,通过密码墙和 Cookie 会话管理,有效防止了针对 Web 界面的直接扫描和未授权访问。结合其审计日志和限流机制,能够提升自托管部署的安全性。