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,否則配置樹無法加載。

鏈接

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

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

小夜