前言¶
在 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 发生过替换」。
注意:
- 插件运行在 DSH 进程内,权限与 DSH 相同;安装前请审阅源码与 MIT 许可证。
- 脱敏是降低误发风险,不能替代密钥轮换、最小权限和人工审查;
block/toolGuard等策略需按环境自行配置。 - 排除某个 provider 时使用
excludeProviders;特定 host 不改写时使用excludeHosts。 - 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