前言¶
DSH 採用“一切皆插件”的架構。本地開發或部署時,若直接暴露 dsh-web 端口,訪問者無需認證即可操作。dsh-login 是一個純主機側 Cordis 插件,通過攔截請求和校驗會話,爲 dsh-web 提供全量請求門禁。
插件簡介¶
- 名稱: dsh-login
- 所有者: ravenli059
- 類別: admin-security
- 許可證: MIT
dsh-login 爲 dsh-web 加一道登錄門:打開端口時先輸入用戶名和密碼。賬號信息不落明文:密碼用 scrypt(隨機鹽)哈希,整個憑據文件再用 AES-256-GCM 加密後寫入本地配置文件($DSH_HOME/dsh-login.json,默認 ~/.dsh/dsh-login.json)。
核心功能¶
- 全量請求門禁
包住 webserver 的register/registerUpgrade/registerFallback:SPA 回退、/api傳輸、WebSocket/SSE 升級全部先過會話校驗。 - 會話管理
內存會話 +HttpOnly; SameSite=StrictCookie(默認 24h,可配置)。 - 加密存儲
憑據文件 AES-256-GCM 加密;密鑰來自環境變量DSH_LOGIN_SECRET(64 hex 或口令)→ 密鑰文件$DSH_HOME/dsh-login.key(自動生成)。 - 口令安全
scrypt(N=2^14, r=8, p=1)隨機鹽哈希;用戶名不存在時燒一次假哈希防枚舉。 - 爆破防護
每用戶名+IP 滑動窗口限速(默認 5 次/30s → 429)+ 失敗延時。 - 多用戶與 CLI
支持任意多賬號,登錄按用戶名獨立校驗。自帶獨立 CLI (dsh-login),支持status,set-user,list-users等命令。
安裝與啓用¶
在本地 web profile 下執行以下命令:
# 1) 把本插件加入 web profile
dsh plugin --profile web add link:D:\code\dsh\dsh-login-plugin
# 2) 重啓 dsh web
# 下次打開 http://127.0.0.1:3080 會先看到登錄頁;首次訪問創建管理員賬號。
插件通過 dsh.bundle.patch 掛載,依賴列表只有 cordis / dsh-host-webserver / schemastery 三個 peer。
配置¶
在 profile 的用戶層給插件行加配置(dsh plugin --profile web add 後會自動把 dsh-login 行插入組合;改配置就編輯 ~/.dsh/profiles/web/cordis.patch.yml 的 - insert: 裏那行 dsh-login):
- id: dsh-login
config:
sessionTtlHours: 12 # 會話有效期(小時),默認 24
bootstrap: denied # 禁止網頁自助建號,只用 CLI 管賬號
maxAttempts: 10 # 爆破限速:10 次/30s
主要配置項包括 enabled、storeFile、keyFile、sessionTtlHours、cookieName、bootstrap、maxAttempts 等。主密鑰優先級:環境變量 DSH_LOGIN_SECRET → 密鑰文件 → 明文模式(警告)。
典型用法¶
登錄後可訪問 /accounts 進行賬號管理(網頁端增刪改改名改密)。CLI 提供更多管理能力:
# 查看狀態
dsh-login status
# 創建或重置用戶
dsh-login set-user --user admin
# 列出所有用戶
dsh-login list-users
運行中改賬號會被 mtime 輪詢熱加載。
部署與安全注意¶
- 純主機側插件:不修改任何 dsh 源碼。
- 網絡綁定:默認只綁 127.0.0.1。
- 局域網/公網部署:需自行架設 nginx 服務,把服務映射到局域網內使用;建議加 TLS 反向代理並設置強口令。
- 密鑰安全:
DSH_LOGIN_SECRET環境變量用於主密鑰派生,建議配置。
目錄與鏈接¶
- 目錄頁: https://www.skillhub.cn/plugins/ravenli059/dsh-login
- GitHub 倉庫: https://github.com/ravenli059/dsh-login