dsh-privacy-gateway:模型請求出站脫敏、回覆還原

前言

在 DeepSeek Harness(DSH)裏跑 agent 時,對話、工具結果和配置文件常會帶進 API Key、Cookie、數據庫連接串或手機號。這些內容會隨 fetch() 發往各家模型 provider,既不符合最小暴露原則,也難在事後覈對「到底發出了什麼」。在應用層逐段改 prompt 或只在某個 adapter 裏打補丁,往往漏掉其它 provider 或插件自帶的 adapter。

下面介紹社區插件 dsh-privacy-gateway(維護者 xbzbing,分類 admin-security):在宿主進程的 undici 全局 dispatcher 上掛一層脫敏網關,出站把請求體裏的敏感值換成佔位符,入站再把佔位符換回真值。對 agent、adapter、provider 無感,一處攔截覆蓋所有走 fetch() 的 provider。

這是什麼

dsh-privacy-gateway 是已發佈到 npm 的 DSH 插件(MIT,當前 package 版本 0.1.4)。它解決的是「模型 HTTP 往返中的密鑰與個人信息泄露」問題:默認 web profile 下首次安裝即可用,無需爲每個模型單獨寫脫敏邏輯。

  • 目錄頁:https://www.skillhub.cn/plugins/xbzbing/dsh-privacy-gateway
  • 源碼與文檔:https://github.com/xbzbing/dsh-privacy-gateway

社區插件目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係;安裝前請自行查看源碼與許可證。插件以當前 dsh 進程權限運行。

核心功能

攔截方式

出站:掃描模型請求體,按規則識別敏感值並替換爲佔位符(或可選的同形假 key)。同一真值重複出現時使用同一佔位符;已在請求其它位置出現過的值會記爲 known,繼續用同一佔位符,以便 prompt cache 仍按原字節命中。

入站:在模型回覆(含工具調用參數)裏把佔位符還原爲真值。agent 側仍看到真實內容,供應商側請求裏不含明文祕密。

脫敏範圍(摘要)

kind 典型內容 默認開關
API_KEY OpenAI / Anthropic sk-…、GitHub / GitLab 令牌、AWS AKIA…、阿里雲 LTAI… 等常見前綴 secrets
TOKEN JWT secrets
PRIVATE_KEY PEM 私鑰塊 secrets
PASSWORD / SECRET URL 密碼、password / secret / token 字段、中文「密碼爲…」等 secrets
COOKIE Cookie 頭、curl -b、常見會話名等 secrets
EMAIL / PHONE / ID_CARD / BANK_CARD 郵箱、大陸手機號(11 位)、身份證(校驗位)、銀行卡(Luhn) 需打開 personal
TERM 配置項 words 中的自定義詞 有詞即脫敏

說明(均來自 README):個人信息類默認不脫敏,需在配置裏開啓「脫敏個人信息」。短於 8 個字符的祕密、明顯佔位寫法(如 your_api_key、8 連相同字符)不會當作真值脫敏。JSON 裏像密鑰的鍵名在 maskKeys 爲 true 時也會換佔位符,協議字段名(model、role 等)與工具參數名不動。可通過 actions 按 kind 設爲 mask、warn 或 block。

配置與界面

日常項可在插件管理裏該插件的「配置」頁修改,保存後從下一次模型調用生效,一般不用重啓 DSH。完整項也可寫在 profile 的 ~/.dsh/profiles/<profile>/cordis.patch.yml 中 id: dsh-privacy-gateway 下的 config;勿改插件包內自帶的 cordis.patch.yml(升級會被覆蓋)。

常用鍵:enabled(總開關)、secrets、personal、words / allow、shape(同形假 key)、toolGuard(工具參數還原後指向外網 host 時的策略)、excludeProviders、record / keepDays、showPanel(會話頂「隱私保護」標籤)、vendorView(內存保留髮出 body 供對照,不落盤)等。詳情見倉庫 README 配置表。

/privacy 命令

用法 作用
/privacy 或 /privacy status 開關狀態、值表大小、統計與分佈
/privacy off / /privacy on 本次運行內臨時關 / 開脫敏(不改持久配置)
/privacy test <文本> 預覽文本會如何發出,不進值表

命令輸出中不包含任何明文敏感值。

記錄與統計

僅對有脫敏或還原的模型請求記一條;磁盤記錄在 ~/.dsh/profiles/<profile>/plugin-data/dsh-privacy-gateway/masking/YYYY-MM-DD.jsonl,目錄與文件權限分別爲 0700 / 0600。記錄不含原值本身。插件詳情頁有統計卡;開啓 showPanel 後,當前會話數據出現在會話頂部「隱私保護」標籤。

安裝與啓用

在默認 web profile 下安裝。倉庫說明:不要用 dsh plugin add github:… 拉源碼樹,因發佈包不含可直接加載的 lib/(見倉庫 ADR-0006);應使用 npm 或 GitHub Release 附件。

正式版(npm):

dsh plugin --profile web add dsh-privacy-gateway@latest

同一版本也可從 GitHub Release 安裝(示例爲 README 中的 v0.1.0 附件):

dsh plugin --profile web add https://github.com/xbzbing/dsh-privacy-gateway/releases/download/v0.1.0/dsh-privacy-gateway-0.1.0.tgz

預發佈版本號帶 -,通常只發 GitHub Release、不發 npm。首次安裝即裝即用;若更新僅涉及 client,改版本後立即生效;含 host 改動的版本需重啓 dsh。

典型用法

自測脫敏是否生效

README 提供若干假值示例。將下面任一行復制進會話發送後,可在統計或「隱私保護」面板看到對應 kind 的佔位符;記錄、統計、日誌與 vendorView 副本中不應出現完整原值。

sk-proj-Zq7Lr2Vt9mK1Px3aB5cD8eF0gH4jN6wY
ghp_Zq7Lr2Vt9mK1Px3aB5cD8eF0gH4jN6wYQ7RT2W
Cookie: BDUSS=Zq7Lr2Vt9mK1Px3aB5cD8eF0gH4jN6wY
someone@gmail.com
13800138000

郵箱與手機號在未開啓 personal 時不會替換;開啓後再測個人信息類樣例。

預覽單段文本

不污染值表、不寫進會話日誌時,可用:

/privacy test sk-proj-xxxxxxxxxxxxxxxxxxxxxxxx

返回脫敏後的文本及各值的 kind、finder 與長度提示。

按項目加自定義詞

在配置裏向 words 填入項目代號或客戶名,會按 TERM 佔位符替換;allow 列表中的整值(不分大小寫)永不脫敏。

適用場景與注意

適合:需要在 DSH 裏統一覆蓋所有 provider 的出站脫敏;希望回覆與工具鏈仍使用真值,但供應商側請求不含明文密鑰與 Cookie;需要本地記錄與統計以便審計「何時、在何 host、何種 kind 發生過替換」。

注意:

  1. 插件運行在 DSH 進程內,權限與 DSH 相同;安裝前請審閱源碼與 MIT 許可證。
  2. 脫敏是降低誤發風險,不能替代密鑰輪換、最小權限和人工審查;block / toolGuard 等策略需按環境自行配置。
  3. 排除某個 provider 時使用 excludeProviders;特定 host 不改寫時使用 excludeHosts。
  4. Node 引擎要求見 package.json(>=22.19.0),與當前 DSH 環境需匹配。

結尾

dsh-privacy-gateway 把脫敏放在 undici 全局層,一次安裝覆蓋所有走 fetch() 的模型調用,並在回覆側還原,適合作爲 DSH 裏 admin-security 方向的默認隱私網關。進一步瞭解配置與 ADR 設計說明,見 GitHub README;安裝入口也可從社區目錄頁進入:

  • https://www.skillhub.cn/plugins/xbzbing/dsh-privacy-gateway
  • https://github.com/xbzbing/dsh-privacy-gateway
羽毛球分组比赛记分
小程序二维码

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

小夜