zephaniahwang94-cmyk/dsh-auth-gate ↗★ 0
dsh-auth-gate
Authentication and security hardening plugin for DeepSeek Harness
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:zephaniahwang94-cmyk/dsh-auth-gate说明文档
阅读完整 README ↗Configuration
Bearer Token mode
For scripts and non-browser clients. HTTP and WebSocket requests must include Authorization: Bearer , and the token must be at least 32 bytes. Browser WebSocket APIs cannot set this header, so use session or both for the Web UI.
Option A: Environment variable
$env:DSH_AUTH_TOKEN = [Convert]::ToHexString(
[Security.Cryptography.RandomNumberGenerator]::GetBytes(32)
).ToLowerInvariant()
dsh web
Option B: Config (not recommended because config diagnostics may expose it)
config:
mode: bearer
# Deliberately empty: generate a private token; never copy a documented value.
token: ''
Usage:
# 公网 URL 使用 HTTPS 时必须设置:
$env:DSH_AUTH_SECURE_COOKIE = 'true'
.\install.ps1 -Protection Full
.\install.ps1 -Protection NetworkAuth
.\install.ps1 -Protection ApprovalLimit
如果 dsh 不在 PATH,脚本会自动使用同级的 deepseek-harness 源码仓库;位于其他目录时传入 -HarnessPath C:\path\to\deepseek-harness。
默认是 Full。添加 -Start 可立即启动;否则脚本会输出准确的启动命令,例如:
dsh --profile web --patch C:\path\to\dsh-auth-gate\presets\full.yml
| 预设 | HTTP + WebSocket 认证 | 审批限流 | 重要后果 |
|---|---|---|---|
Full | 是 | 是 | 推荐 |
NetworkAuth | 是 | 否 | 审批提示不受本插件限流 |
ApprovalLimit | 否 | 是 | 网络控制面仍无认证 |
HTTP 和 WebSocket 认证不可拆分,避免 UI 已认证但 RPC upgrade 裸露。旧版顶层配置继续兼容;没有 protections 时等同完整防护。
初始密码与协作者
终端用户
在启动 Harness 的同一个进程环境中设置凭据,不要把真实密码写进 YAML 或命令行参数。
cd C:\path\to\deepseek-harness
$env:DSH_AUTH_USERNAME = 'admin'
$env:DSH_AUTH_PASSWORD = Read-Host '请输入私有密码(至少12个字符)'
$env:DSH_AUTH_SECURE_COOKIE = 'false' # 仅本机 HTTP;HTTPS 必须为 true
pnpm dsh web
环境变量修改不会影响已经运行的进程;修改密码后必须重启 Harness。每次启动都会生成新的 session 签名密钥,因此重启也会让全部浏览器会话退出。
只使用 WebUI 的 Windows 用户
首次密码不能安全地在受保护的 WebUI 内创建,因为页面开放前认证就必须存在。打开 开始菜单 → 编辑账户的环境变量,新增 DSH_AUTH_USERNAME、DSH_AUTH_PASSWORD 和 DSH_AUTH_SECURE_COOKIE,然后彻底退出并重新打开 Harness WebUI 启动器。Windows 会保存用户环境变量,同一操作系统用户运行的其他进程可能读取它们,因此只适用于可信的本机账户。
协作者账户
1.1 版本目前只支持一个共享登录身份,不能创建第二个独立命名的协作者账户,也不能把操作归因到不同人员。共享主密码虽然可以访问,但不属于独立账户,不建议用于互不信任的团队。
临时可信协作者可使用以下流程:轮换共享密码并重启 Harness,通过安全渠道发送密码;协作结束后再次轮换并重启。长期协作者应使用独立 Harness 实例/操作系统身份,或在前方部署支持每人独立身份的认证反向代理。即使认证通过,用户仍共享 Agent、session、workspace 权限和审计身份,不具备 per-user 隔离。
配置
Bearer Token 模式
用于脚本及非浏览器客户端。HTTP 和 WebSocket 请求都必须带 Authorization: Bearer ,token 至少 32 字节。浏览器 WebSocket API 无法设置该请求头,因此 Web UI 请使用 session 或 both。
方式一:环境变量
$env:DSH_AUTH_TOKEN = [Convert]::ToHexString(
[Security.Cryptography.RandomNumberGenerator]::GetBytes(32)
).ToLowerInvariant()
dsh web
方式二:配置文件
config:
mode: bearer
# 故意留空:请生成私有随机 token,不要复制文档中的固定值。
token: ''
验证:
### 只使用 WebUI 的 Windows 用户
首次密码不能安全地在受保护的 WebUI 内创建,因为页面开放前认证就必须存在。打开 **开始菜单 → 编辑账户的环境变量**,新增 `DSH_AUTH_USERNAME`、`DSH_AUTH_PASSWORD` 和 `DSH_AUTH_SECURE_COOKIE`,然后彻底退出并重新打开 Harness WebUI 启动器。Windows 会保存用户环境变量,同一操作系统用户运行的其他进程可能读取它们,因此只适用于可信的本机账户。
## 配置
### Bearer Token 模式
用于脚本及非浏览器客户端。HTTP 和 WebSocket 请求都必须带 `Authorization: Bearer `,token 至少 32 字节。浏览器 WebSocket API 无法设置该请求头,因此 Web UI 请使用 `session` 或 `both`。
**方式一:环境变量**
```powershell
$env:DSH_AUTH_TOKEN = [Convert]::ToHexString(
[Security.Cryptography.RandomNumberGenerator]::GetBytes(32)
).ToLowerInvariant()
dsh web
方式二:配置文件
config:
mode: bearer
# 故意留空:请生成私有随机 token,不要复制文档中的固定值。
token: ''
验证:
## 配置参考
| 字段 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `mode` | `'bearer' \| 'session' \| 'both'` | `'bearer'` | 认证模式 |
| `protections.networkAuth` | `boolean` | `true` | 启用不可拆分的 HTTP + WebSocket 认证 |
| `protections.approvalRateLimit` | `boolean` | `true` | 启用审批 waterfall 限流 |
| `auth` | `object` | — | 下列认证字段也可统一写在此对象中 |
| `token` | `string` | 环境变量 `DSH_AUTH_TOKEN` | Bearer token |
| `sessionSecret` | 不支持 | 每次启动随机生成 | 拒绝持久密钥,避免已注销 Cookie 在重启后复活 |
| `sessionTtl` | `number` | `3600` | Session 有效期(秒) |
| `loginPath` | `string` | `'/auth/login'` | 登录页路径 |
| `username` | `string` | — | 登录用户名 |
| `password` | `string` | — | 登录密码 |
| `secureCookie` | `boolean` | `false` | 为 Cookie 添加 `Secure`;HTTPS 必须启用 |
| `approvalRateLimit.maxPerMinute` | `number` | `3` | 每分钟最大升级请求数 |
| `approvalRateLimit.maxPerSession` | `number` | `10` | 每 session 最大升级请求数 |
Bearer token 必须至少 32 字节。登录尝试按来源地址限制为每分钟 5 次。每次启动都会生成新 session secret 并使旧浏览器会话失效;由于注销状态只在进程内保存,持久密钥会被拒绝。