22-ai-00/dsh-enhanced--plugins-credentials-keychain2

@dsh-enhanced/credentials-keychain

An audited OS-keychain credential-handle service for trusted DeepSeek Harness plugins.

包名
@dsh-enhanced/credentials-keychain
版本
0.1.28
许可证
MIT
最近更新
2026年9月12日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:22-ai-00/dsh-enhanced#bb3fb924f1bdb946901614b8b848ac3a1d60c642&path:plugins/credentials-keychain

@dsh-enhanced/credentials-keychain

给可信 DSH 插件使用的凭据 handle 服务。配置只保存 locator 与 allowlist,值留在 macOS Keychain、Linux Secret Service、无桌面 Linux 的 owner-protected 文件、当前 Windows 用户的 DPAPI 加密文件或一个明确命名的进程环境变量中;每次使用都经过 assistant-policy、有界 lease 和不含 secret 的 SQLite 审计账本。

它不是密码管理器 UI,也不向 Agent 注册任何 tool。

安装

先安装 @dsh-enhanced/assistant-policy,再安装:

dsh plugin --profile web add @dsh-enhanced/credentials-keychain
dsh --profile web --dump-config

默认 handles: [],不会读取任何凭据。示例:

handles:
  - id: lark-app-secret
    provider: macos-keychain
    service: dsh/lark
    account: personal
    consumers: [dsh-enhanced-lark-channel]
    purposes: [connect]
    maxLeaseMs: 86400000

相应 policy rule 必须显式允许:

- id: lark-credential
  effect: allow
  subject: { kind: background, id: dsh-enhanced-lark-channel }
  actions: [credential.use]
  resource: { kind: credential, id: lark-app-secret }
  context: { initiators: [background] }

本地运维撤销还需单独允许 external/local:credential.revoke

Provider

macOS Keychain

插件只执行固定命令:

/usr/bin/security find-generic-password -w -s  -a 

先由用户在系统外部写入 Keychain;本插件 v0.1 不创建、修改或删除条目。

Linux Secret Service

插件只执行:

/usr/bin/secret-tool lookup service  account 

子进程只收到固定 PATH,以及宿主已有的 DBUS_SESSION_BUS_ADDRESS / XDG_RUNTIME_DIR。不继承 HOME、token、代理或完整环境。

无桌面 Linux protected file

纯 SSH、Ubuntu Server 和没有 Secret Service session 的 Linux 可以使用:

- id: lark-app-secret
  provider: linux-protected-file
  path: /home/me/.dsh/credentials-keychain/lark-web-primary-0123456789abcdef0123456789abcdef.secret
  consumers: [dsh-enhanced-lark-channel]
  purposes: [connect]
  maxLeaseMs: 86400000

这个 provider 不启动子进程,也不读取 locator 以外的文件。每次读取都要求:

  • locator 是规范化的绝对路径;直接父目录由当前 UID 持有且权限恰为 0700
  • 文件由当前 UID 持有、权限恰为 0600、是 regular file 且只有一个硬链接;
  • 最终文件和直接父目录都不是符号链接,文件以 O_NOFOLLOW 打开,并且只读取配置的 maxSecretBytes 上限。

不满足任一条件都会 fail closed,错误不包含路径或文件内容。dsh-lark-setup 只通过进程内有界 buffer 写入原子的随机版本 0600 文件,验证候选值后才把 locator 提交到 profile;secret 不进入 YAML、命令行参数、环境变量或日志。

这是“仅当前 OS 用户可读”的兼容后端,不是静态加密:secret 在该 0600 文件中仍是明文,同一 UID 下的其他进程、root、主机备份和离线磁盘读取者可能获得它。需要抵御这些威胁时,应使用 Secret Service、外部 secret manager、全盘加密或独立服务账户。凭据文件不得放在同步目录、共享卷或权限/所有权语义不可靠的文件系统中。

Environment

- id: lark-app-secret
  provider: environment
  environmentName: LARK_APP_SECRET
  consumers: [dsh-enhanced-lark-channel]
  purposes: [connect]
  maxLeaseMs: 86400000

只读取这一项;其他环境值不会复制给 consumer。该 provider 适合由 launchd/systemd/container secret injection 管理的部署,安全性取决于进程启动环境。

Windows DPAPI(best-effort)

- id: lark-app-secret
  provider: windows-dpapi
  path: 'C:\Users\me\.dsh\credentials-keychain\lark-web-primary.clixml'
  consumers: [dsh-enhanced-lark-channel]
  purposes: [connect]
  maxLeaseMs: 86400000

插件只执行固定的 Windows PowerShell Import-Clixml 解密命令,文件路径作为单独 argv 传入,PowerShell 脚本内容和可执行文件不能由配置覆盖。文件由 dsh-lark-setup 使用当前用户 DPAPI 创建,只能由同一 Windows 用户在同一登录上下文解密。Windows 路径已实现但不作跨 Windows/PowerShell/npm 组合的兼容承诺。

Lease 语义

  • consumer id 从调用方 Cordis fiber 的插件 name 推导,不能由 request 字符串指定。
  • handle 同时校验 consumer、purpose、TTL 上限和 assistant-policy;任一未知值默认拒绝。
  • withSecret(caller, request, callback) 只在 callback 期间传值,并提供 AbortSignal。完成、provider 失败、TTL、运维撤销和服务卸载都会写入 lease/audit ledger。
  • provider 返回后、调用 callback 前会同步复核服务状态、AbortSignal 和账本中的 lease 版本/状态/时限;读取期间发生的撤销、过期或卸载不会交付值。callback 已开始后仍依赖 AbortSignal 的合作式中断,不能收回已经交付给 consumer 的值。
  • idempotency key 只执行一次;已完成/失败/过期请求不会再次调用 callback。
  • 运维撤销只中断精确 lease,不自动删除 OS 凭据。
  • JavaScript string 无法可靠清零;consumer 必须不缓存、不记录、不返回 secret,并在 AbortSignal 后立即释放持有 secret 的 SDK/连接。

权限与数据

  • **文件系统:**创建配置指定的绝对 SQLite 文件;父目录 0700、文件 0600、WAL/FULL、forward-only migration。linux-protected-file 还会读取配置的绝对 locator,并执行上文的 owner/mode/type/link 检查。账本只存 handle id、consumer、purpose、状态和时间,不存 locator 或值。
  • **子进程:**仅 OS provider 的固定可执行文件与固定 argv 结构(macOS security、Linux secret-tool、Windows PowerShell DPAPI);shell: false,5 秒默认超时,stdout/stderr 总量有界,错误文本不回传。
  • **环境:**environment provider 读取单个 allowlisted 名称;Linux provider 只转交 D-Bus/XDG session 定位。
  • **网络:**无。
  • **浏览器:**无。
  • **凭据:**值只进入可信 consumer callback。healthlistHandleslistLeases、异常与 policy audit 均不含值。
  • **安装脚本:**无。

Cordis fiber identity 与 callback 是同进程合作式边界,不能阻止恶意插件通过 Node API 自行读环境、文件或其他进程。强隔离需要独立进程/容器和宿主 capability sandbox;本包不作虚假承诺。

兼容性

  • @deepseek-ai/cordis ^4.0.1
  • @dsh-enhanced/assistant-policy >=0.1.0 =24.0.0(使用 node:sqlite

参见仓库的兼容性基线