前言¶
在 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 提供了一套统一的权限门禁机制,从硬性拒绝到语义分析,再到学习型自动批准,覆盖了从安全到效率的完整需求。它不依赖复杂的跨插件版本管理,适合需要细粒度控制和可追溯审计的开发场景。