前言¶
在 DeepSeek Harness(DSH)的安全生態中,權限控制、自動審批和語義分類通常分散在不同的插件中(如 dsh-permission-rules、dsh-auto-mode 等)。這種拆分導致跨插件版本耦合,且審計鏈路不統一。
dsh-perm-gate 是一個將“門禁 + 審批 + 分類器”合併爲單一包的插件。它通過統一的審計軌跡和確定性的決策優先級,解決了上述問題。
是什麼¶
這是一個爲 DeepSeek Harness 設計的、獨立的、確定性優先且“失敗即關閉”的權限門禁。
插件由 drscrewdriver 維護。它通過固定的優先級鏈決定每一個工具調用,確保高危操作無法被繞過。
核心功能¶
- 命令白名單 / 黑名單:基於
argv分解進行匹配,支持遞歸解析sh -c/bash -c、檢測管道、重定向目標以及遞歸/強制刪除指令。 - 拒絕優先:一旦匹配拒絕規則,其優先級高於任何允許規則。
- 會話授權:提供精確的
(工具, 規範指紋)授權,支持TTL和maxUses。不同的目標無法複用授權。子代理可以繼承授權,但無法自行簽發。 - 純函數規則引擎:支持 glob/regex 編譯,帶有 ReDoS 邊界,規則格式錯誤時 loud fail,並利用源碼哈希進行編譯緩存。
- 審計:每個決策都記錄爲
{ignorable:true}事件及其callId,模型可見的原因與記錄結果一致。 - 自動審查 tier:包含
permissive和permissive-full兩種模式。這是一種獨立的審批模式(介於只讀和完全訪問之間),前端僅顯示一個開關,後端策略可組合配置。permissive-full變體會移除內置的文件沙箱。 - 沙箱升級自動回答:當沙箱升級請求從 shell 內部發出時,插件會自動回答,此時門禁插件本身不會看到該調用,但會記錄關聯的
callId。 - 分級風險
llmAssist:使用兼容 OpenAI 格式的 LLM 對ask進行評級。高危類別(刪除、憑證、遠程、系統、批量)始終詢問,中性類別進入裁決學習。 - 裁決學習:經過人工批准並實際執行的中性風險操作,在達到閾值後,完全相同的操作(指紋匹配)將被自動允許。
- 決策事件流:每個決策追加到 JSONL 流中,瀏覽器端以通知條形式展示,並在對話視圖的“審批記錄”標籤頁中按時間倒序顯示。
決策流程¶
插件按優先級順序對工具調用進行裁決:
| 階段 | 決策 | 說明 |
|---|---|---|
| P0 | deny |
確定性硬拒絕:憑證材料、受保護路徑變更、危險 Shell |
| P1 | allow |
精確的、有界的 會話授權 |
| P2 | deny/allow/ask |
靜態規則鏈:先黑名單,再白名單,最後詢問 |
| P3 | allow/deny/ask |
可選的 LLM 語義分類器(默認關閉) |
| P4 | ask |
官方審批接口 |
關鍵點:嚴格“失敗即關閉”。P0 的決策不會被任何後續步驟(授權、規則、分類器或人工)覆蓋。
安裝與啓用¶
首先確保你的環境中已安裝 DeepSeek Harness。
dsh plugin --profile web add dsh-perm-gate
安裝完成後,在 cordis.yml 中添加插件配置:
- id: dsh-perm-gate
name: dsh-perm-gate
config:
rulesFile: ./permissions.yaml # 可選,默認爲 $DSH_HOME/perm-gate/rules.yml
dshHome: $DSH_HOME # 受保護目標檢查的根目錄
defaultAction: ask # allow | ask | deny
gatePresets: [permissive, permissive-full] # 啓用自動審查的層級
sessionSweep: true # 每小時清理歸檔/失效會話的授權數據
典型用法¶
插件內置了一個預設的拒絕關鍵詞黑名單(繼承自 dsh-approval-gate),包含 rm -rf、push --force、drop table、mkfs、git reset --hard、docker system prune 等。
這些關鍵詞會不區分大小寫地匹配調用文本,且在白名單、授權和 LLM 判定之前生效。你可以直接在設置卡片中編輯此列表,預設條目會被標記,點擊“恢復預設”即可一鍵還原。
兼容性與注意¶
- DSH 版本兼容性:支持 DSH 1.x(遺留分支)、2.x(主分支)和 5.x(0.2.0 線)。
- 語言包限制:v2.0.0 版本包含 ja/ko 字典,但官方 DSH 的
LocaleRuntime僅暴露zh/en(LOCALE_IDS = ["zh", "en"])。在官方 DSH 上直接選擇 ja/ko 會報錯locale "<id>" is not registered。如需使用日語或韓語,需要 fork DSH 更新locale-settings.ts和client/index.ts中的LOCALES標籤,然後重新構建。 - 沙箱升級:沙箱升級自動回答在 shell 內部運行,門禁插件本身無法直接感知該操作,但會記錄
callId以供追溯。 - 文件沙箱移除:
permissive-full變體會移除內置的文件沙箱,這允許git clone、Cygwin 或 ConPTY 等需要命名管道的操作通過。
結尾¶
dsh-perm-gate 提供了一套統一的權限門禁機制,從硬性拒絕到語義分析,再到學習型自動批准,覆蓋了從安全到效率的完整需求。它不依賴複雜的跨插件版本管理,適合需要細粒度控制和可追溯審計的開發場景。