前言¶
在 DeepSeek Harness(DSH)里跑智能体时,每一轮对话的 transcript 会落盘,并随请求发给模型提供方。工具照常执行:env、误执行的 cat .env、git remote -v 里带 token 的 URL、堆栈里的连接串,都会原样写进这份副本。命令本身往往不能拦,但持久化与外传的那份文本可以处理。下面介绍社区插件 dsh-redact(维护者 drm-nz,分类 admin-security):在工具结果送往模型和会话日志之前,对文本做原地改写,工具进程仍保留完整输出。
这是什么¶
dsh-redact 是 DSH 插件,一句话定位:在工具输出到达模型或 session log 之前,脱敏其中的 secret。设计原则是 redact the transcript, never the process——不阻断命令、不改写命令、不降低权限,只改 destined for 模型与已保存会话的那一段文字。
数据流可以概括为:
tool executes ──► result content ──► tools/post-execute hook ──► model + session log
full access (this plugin) [REDACTED:NAME]
插件零运行时依赖,MIT 许可,当前 package 版本为 0.1.0。社区目录页:https://www.skillhub.cn/plugins/drm-nz/dsh-redact ;源码与说明:https://github.com/drm-nz/dsh-redact 。目录站点为社区生态索引,与 DeepSeek / 幻方无官方从属关系。
核心功能:四层脱敏¶
四层彼此独立,可在配置里开关。
| 层级 | 默认 | 作用 |
|---|---|---|
exact |
开 | 敏感环境变量取值(如 DATABASE_URL、MYSQL_PWD、代理 URL 等)以及你在 secrets 里配置的明文 |
patterns |
开 | 已知凭据格式(见下表)、PEM 私钥、JWT、Bearer …、URL userinfo 密码等 |
context |
开 | 无固定前缀、但文档约定名称旁的凭据(如 AWS secret/session token) |
keywords |
关 | password=、token=、api_key= 等锚定取值;误报更高,需主动开启 |
patterns 层识别的部分格式(前缀与体长由规则表生成,避免 matcher 漂移):
| 格式 | 前缀 | 体长 |
|---|---|---|
aws-access-key |
AKIA / ASIA |
16 |
github-token |
gh[pousr]_ |
36 |
github-pat |
github_pat_ + 22 + _ |
59 |
gitlab-pat |
glpat- |
20 |
openai-key |
sk- |
48 |
openai-project-key |
sk-proj- |
≥ 40 |
anthropic-key |
sk-ant- |
≥ 20 |
google-api-key |
AIza |
35 |
stripe-secret |
sk_live_ / rk_live_ |
24 |
| 以及 npm、DigitalOcean、Shopify、Mailgun、Slack、Sendgrid、Twilio 等 | (见 README 表) |
匹配故意不要求尾部词界:凭据与相邻文字粘在一起时,仍会去掉凭据段;过短的形似串会保留。无规则的形状不在 patterns 范围内,由 exact 层用环境变量与 secrets 补网。
路径型变量(PWD、OLDPWD、KUBECONFIG)默认不脱敏,除非变量名本身强烈表示凭据(如 MYSQL_PWD)。
安装与启用¶
需要先安装带插件管理器的 DeepSeek Harness。Host 插件在启动时加载,安装后需重启应用。
从 GitHub 安装(README 推荐方式):
dsh plugin --profile desktop add github:drm-nz/dsh-redact
插件管理器校验仓库、安装并加入 profile 的 bundle 列表。安装完成后在 Settings → Plugins 中可见,默认启用。
卸载:
dsh plugin --profile desktop remove dsh-redact
本地 checkout 可通过 profile 的 package.json 使用 link: 依赖并执行 pnpm install,细节见仓库 README;一般用户用上述 dsh plugin 命令即可。
注意:插件以当前 DSH 进程权限运行;安装前应自行查看源码与 LICENSE,确认符合你的安全策略。
配置¶
在 profile 的 cordis.patch.yml 里按 id 覆盖 bundle 配置行,用 override,不要重复 insert 同一 id。
- id: dsh-redact
config:
enabled: true
tiers:
exact: true
patterns: true
context: true
keywords: false
minLength: 8
allowNames: ["SSH_AUTH_SOCK"]
secrets: []
# debugFile: /tmp/dsh-redact.log # optional: one line per hook call
| 字段 | 默认 | 含义 |
|---|---|---|
enabled |
true |
总开关;false 时结果原样返回 |
tiers.* |
见上 | 各层开关 |
minLength |
8 |
短于此长度的值不当作 secret,减少误伤普通词 |
allowNames |
["SSH_AUTH_SOCK"] |
即使取值像 secret 也跳过的变量名 |
secrets |
[] |
额外要脱敏的字面量(环境里拿不到的) |
exact 层在插件加载时从当时环境快照;之后 export 的变量需重启才会进入快照。环境与 secrets 重复的值只脱敏一次,标签用环境变量名;匹配按最长优先。
典型用法:验证是否生效¶
README 给出三档验证,由易到难。
1. 启动自检(自动)
每次启动会对合成凭据跑 matcher,并向 ~/.dsh/health.log 追加一行,含 ok 表示规则仍有效。例如:
2026-11-01T02:00:42Z dsh-redact ok rules=37 probe=patterns redacted=yes
查看:
tail -n 2 ~/.dsh/health.log
grep -v ' ok ' ~/.dsh/health.log # 仅看异常
2. Hook 探测(一次工具调用)
启动自检不证明 tools/post-execute 已挂载。让智能体执行:
printf 'hook probe: ghp_%s\n' "$(printf 'a%.0s' {1..36})"
正常应看到:
hook probe: [REDACTED:github-token]
若仍是明文,检查插件是否启用并重启(host 插件仅在启动加载)。
3. 会话日志
界面上已脱敏的内容,在磁盘 persisted session 里也必须是脱敏后的;这是插件存在的主要目标副本。
探测串不是真实凭据,仅为 github-token 形状以便 patterns 层匹配。
适用场景与边界¶
适合:需要在本地保留或分享 transcript、又不想把工具输出里的凭据一并暴露的 DSH 桌面/智能体开发场景;与 admin-security 类诉求一致,作为 transcript 侧的一道网。
务必知晓的限制(README 原文要点):
- 脱敏不等于撤销:secret 若已进入某次模型请求,插件无法撤回。
- 仅覆盖工具输出:模型生成文本、prompt、shell history、应用自有日志不在 hook 内。
- 不能识别无规则的 secret:Base64 包裹、拆分、重编码等可能漏网;coverage 是网,不是保证。
- 无网络、不改进程:只读写字段文本;可选写
debugFile诊断行。
结尾¶
dsh-redact 在 DSH「一切皆插件」生态里,专门处理 transcript 与 session log 上的凭据泄露面,而不动工具执行本身。若你在 Harness 里频繁跑 shell、读配置、连远程,值得在 profile 里装上并用 hook 探测确认一遍。
- 社区目录:https://www.skillhub.cn/plugins/drm-nz/dsh-redact
- GitHub:https://github.com/drm-nz/dsh-redact