前言¶
跑 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