vault-manager:在弹窗中录入密钥,不让凭据进入 Agent 上下文

前言

DeepSeek Harness(DSH)里的智能体要调用 Git、HTTP API 时,常需要把 token 或 API key 写进工具参数或命令行。这些内容会进入会话日志和模型上下文,事后也难以从记录里彻底抹掉。社区插件 vault-manager(npm 包名 @dreagonmon/vault-manager)把整套凭据生命周期挡在对话之外:秘密只在用户弹窗里输入,主密码不经工具参数传递,执行命令前用占位符展示待审命令,输出中对已用秘密做脱敏。

这是什么

vault-manager 由维护者 Dreagonmon 发布,在 DSH 插件目录中归类为 admin-security。它在本地用单个主密码保护加密文件,向 shell 命令注入已保存的凭据,同时约定:智能体只能看到条目名称、备注、时间戳、退出码以及脱敏后的输出,看不到秘密明文和主密码,也无法从工具返回判断主密码是否改成功。

插件以 bundle 形式提供 Host 侧逻辑与 Web 弹窗(shell.overlay),无第三方运行时依赖。

核心能力

工具一览

工具 是否弹窗 作用
vault_save 是 保存或覆盖一条凭据;用户输入主密码(首次即设置)与秘密值
vault_list 否 列出名称、备注与时间戳,不返回秘密值
vault_use 是 运行含 {{条目名}} 占位符的 shell 命令;弹窗展示完整命令供确认,批准后解密、替换、执行,返回退出码与脱敏输出
vault_delete 否 删除指定条目
vault_change_password 是 修改主密码并整体重加密;工具始终返回中性文案,不向智能体泄露是否成功

安全与存储要点

  • 主密码经 scrypt(N=16384, r=8, p=1)拉伸为 256 位密钥;各秘密值单独 AES-256-GCM 加密。
  • 默认 vault 文件路径为 ~/.dsh/vault.json(亦可用 $DSH_HOME/vault.json),写入权限 0600,原子替换。
  • 弹窗通过 Harness Web 源上的本地 /vault-api 与 Host 通信;带外来 Origin 的请求会被拒绝。
  • 解密后的值仅在单次工具调用期间驻留进程内存;默认每次 save/use/改密都会再次询问主密码。

README 也列出了已知限制:替换后的命令会短暂出现在本机进程命令行(多用户主机上 ps 可见);脱敏只覆盖输出中与秘密完全一致的子串;无浏览器连接或弹窗超时则调用失败且不执行、不保存。

安装与启用

官方说明中有三种常见方式:

  1. 从 npm 注册表安装:通过插件管理器的 install_bundle,包名为 @dreagonmon/vault-manager。
  2. 本地检出时:向 install_bundle 传入包目录路径。
  3. 在能解析该包的 profile 中加入 patch 行。

package.json 要求 Node >= 22.12.0、dsh >= 0.2.0,许可证为 MIT,当前发布版本 1.0.0。

在 profile 中插入插件并可选配置的示例:

- insert:
    - id: vault-manager
      name: '@dreagonmon/vault-manager'
      config:
        redactOutput: true

可选 config 字段(均来自 README):

字段 默认值 含义
path ~/.dsh/vault.json vault 文件位置
redactOutput true 命令输出中的秘密替换为 ***
commandTimeoutMs 120000 命令最长执行时间
promptTimeoutMs 1800000 弹窗无响应超时(30 分钟)

典型用法

下面步骤复现 README 中的流程:先存 GitHub PAT,再在 git push URL 中用占位符引用。

agent: vault_save { name: "github-token", note: "PAT for HTTPS git operations" }
user:  [popup] master password + secret value

agent: vault_use {
  command: "git push https://{{github-token}}@github.com/me/repo.git main",
  entries: ["github-token"]
}
user:  [popup] reviews the command, types the master password
agent: { exitCode: 0, stdout: "...", stderr: "..." }   # secrets redacted

使用 vault_use 时,entries 声明本次会解密哪些条目;命令字符串里用 {{条目名}} 与 vault 中的名称对应。用户在弹窗里看到的是占位符形式的命令,批准并输入主密码后才真正执行。

适用场景与注意

适合:需要在 DSH 会话里让智能体「发起」带凭据的操作,但又不希望 token 进入模型上下文或落进可检索日志的开发者;例如 HTTPS Git 推送、调用需 API key 的 curl 等。

使用前请自行核对:插件以当前 DSH Host 进程的用户权限运行,vault 文件与执行的 shell 命令都受该权限约束。安装前建议阅读 GitHub 仓库 源码与 MIT 许可证;目录页见 SkillHub 插件页。DSH 社区插件目录为独立站点,与 DeepSeek / 幻方无官方从属关系。

静态加密不能替代主机层面的访问控制:能读取 Host 进程内存或在 vault 文件可读时拿磁盘副本的攻击者,仍在信任边界讨论范围内。

结尾

vault-manager 把「录入—审批—执行—回传」拆成弹窗与占位符两道门,把智能体可见面压到元数据与脱敏输出。若你的工作流里频繁出现「Agent 需要秘密但你不愿秘密进上下文」,可按上文安装 bundle,从 vault_save 与 vault_use 试起。

  • 目录页:https://www.skillhub.cn/plugins/Dreagonmon/vault-manager
  • 源码与文档:https://github.com/Dreagonmon/vault-manager
羽毛球分组比赛记分
小程序二维码

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

小夜