dsh-fleet-audit:DSH 多 agent 机器上的凭据卫生审计插件

前言

跑 DSH 的机器上通常不止一个 agent 在工作,凭据也不止存在一处:~/.gitconfig 里的 url.*.insteadOf、~/.netrc、~/.npmrc、各项目 .git/config、随手写的 .env,都可能带着 token。git 把 https://oauth2:<token>@host 嵌进 remote 后,任何一次 git remote -v 都可能把密钥写进日志、对话记录或 CI 输出。逐个手工检查费时,而且容易漏。

下面介绍的 dsh-fleet-audit 就是一把只读的体检刀:扫描本机凭据文件的权限位和 git remote 里内嵌的凭据,把结果脱敏输出。它不修文件、不发网络请求,只报告。

这是什么

dsh-fleet-audit 是 DSH 的社区插件,定位是 agent 舰队(fleet)的机器卫生审计,检查三件事:凭据文件权限、git remote 内嵌凭据、provider token 前缀字面量。按 README 的说法,它是只读、零依赖、确定性的:同一份输入每次产出的结果一致。

仓库为 YaoleWu/dsh-fleet-audit,分类属于 admin-security。需要说明一点:README 正文里的安装命令与许可证署名写的是 LeslieWylie,与仓库所在属主不一致,安装前建议自己点开 GitHub 核对一遍。README 也写明这是独立社区插件,与 DeepSeek 官方及其 DSH 仓库没有隶属关系。

安装与启用

README 给出的本地验证方式是先加本地路径:

dsh plugin --profile web add /path/to/dsh-fleet-audit

发布后的安装形式按 README 写法为:

dsh plugin --profile web add dsh-fleet-audit

或走 GitHub:

dsh plugin --profile web add github:LeslieWylie/dsh-fleet-audit

注意最后一条里的属主名来自 README 原文,与仓库 URL 的属主不一致,执行前请自行确认指向正确的仓库。

装完重启 dsh web,然后直接对它说「审计一下本机凭据卫生 / run fleet_audit」即可。

核心功能

1、凭据文件权限。列出常见凭据文件,包括 ~/.gitconfig、~/.netrc、~/.npmrc、~/.env、~/.ssh/,把期望权限收紧到 600 / 700;凡是组或其他用户还能读的,一律标记为 tooOpen。

2、git remote 内嵌凭据。扫描 ~/.gitconfig 以及指定目录下的 .git/config,识别 https://user:pass@host、https://oauth2:TOKEN@host、token 型用户名这几种形态。输出的 URL 中凭据部分一律替换成 ***,README 称这是逐字节保证不泄露原文,测试里同时断言输出 JSON 不含原始密钥。

3、provider token 前缀字面量。识别 github、github-fine-grained、gitlab、gitlab-ci、slack、aws、openai、jwt 这几类常见前缀,只报告「类型 × 出现次数」,不输出具体值。这项可以通过参数关掉。

工具参数

工具参数就是上面三件事的开关和边界:

参数 类型 说明
roots string[] 递归扫描 .git/config 的目录(可选;默认只查 ~/.gitconfig)
files string[] 额外要查权限的凭据文件绝对路径
scanSecrets boolean 是否扫描 token 前缀字面量(默认 true)
maxGitConfigs number git config 扫描上限(默认 200,上限 2000)
maxDepth number 目录递归深度(默认 5,上限 20)

只关心某个项目的 remote 时,把项目目录放进 roots 就行;清单之外的凭据文件用 files 显式指定。

输出示例

输出是单个 JSON,summary 给总数,checks 分三组。下面取 README 的示例(已脱敏):

{
  "ok": true,
  "summary": { "files": 5, "tooOpen": 1, "gitLeaks": 2, "secretFiles": 1, "issues": 4, "scannedGitConfigs": 12 },
  "checks": {
    "credentialFiles": [
      { "path": "/Users/alice/.gitconfig", "exists": true, "mode": "644", "tooOpen": true }
    ],
    "gitRemoteLeaks": [
      { "file": "/Users/alice/code/proj/.git/config", "host": "gitlab.example.com", "maskedUrl": "https://***:***@gitlab.example.com/group/proj.git" }
    ],
    "secrets": [
      { "file": "/Users/alice/.gitconfig", "providers": [ { "provider": "github", "count": 1 } ] }
    ]
  },
  "note": "Read-only audit; secret-like values are masked in the output. Fix permissions with chmod 600 and rotate any exposed credentials."
}

note 字段直接写着修复方向:权限用 chmod 600,泄漏的凭据要轮换。插件本身不会替你做这两件事。

安全边界与已知局限

安全边界写得很明确:只读,不写文件、不启进程、不访问网络、不保存状态;git config 数量与递归深度都有上限,扫描规模是可控的。

局限也要一并知道:

1、只扫文本类配置文件,加密存储、系统钥匙串和二进制文件不在范围内。
2、token 前缀识别是启发式规则,可能漏报非常规前缀,也可能误报,需要人工复核。
3、默认凭据清单是固定的,别的路径要靠 roots / files 显式指定。
4、发现泄漏后要自己执行 chmod 600 并轮换密钥。

适用场景与注意事项

适合在跑多个 agent 的开发机、CI runner、共享工作机上做定期体检,尤其是多人共用机器、又不能用受管凭据方案的情况。它是一次快照,不替代凭据管理工具,也不能保证你的 agent 配置里没有其他形式的密钥落地。

有一点需要提醒:插件以当前 dsh 进程的权限运行,能读到什么就取决于这个进程能读到什么。安装前请打开源码看一眼扫描范围与输出逻辑,确认许可证可接受(README 标注为 MIT)。

回滚方式同样是插件命令,插件只读且无状态,卸载不影响用户数据:

dsh plugin --profile <p> remove dsh-fleet-audit
# 或从 dsh.profile.bundles 删除该行

小结

dsh-fleet-audit 的价值在于把「凭据散落在哪、谁能读、有没有带密钥」这三类问题收敛成一次只读、脱敏的扫描,接入成本低,退出也没有残留。要自己试,先看源码再装。

目录页:https://www.skillhub.cn/plugins/YaoleWu/dsh-fleet-audit
GitHub:https://github.com/YaoleWu/dsh-fleet-audit

羽毛球分组比赛记分
小程序二维码

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

小夜