前言¶
在 DSH 或日常 Web 项目里,密钥和数据库连接串往往写在 .env 里。常见做法是依赖 .gitignore 把环境文件挡在版本库外,再配一份 .env.example 给协作者。一旦忽略规则漏写、文件权限过宽,或把真实密码写进赋值行,git add . 就可能把凭据一并推上去。代码里扫 sk-...、AKIA... 这类字面量,有专门的密钥扫描插件;本插件关注的是环境配置文件本身会不会被提交、权限是否过宽、赋值是不是明文、有没有模板——在动手提交前做一次静态核对。
下面介绍维护者 feely0208 发布的 dsh-env-audit(npm 包名 @deepwhale-cn/dsh-env-audit,分类 admin-security)。它只做离线文件扫描,不下「安全 / 不安全」的结论,只列出可核对的文件、行号与依据。
这是什么¶
一句话:secret-scan 查代码里有没有写死密钥;env-audit 查配置文件有没有把密钥暴露出去(忽略规则、权限、明文、模板、部分硬编码地址)。
是:盯住环境配置文件相关的四类事实——是否可能被 git 纳入、POSIX 权限是否宽于 600、高危键名后是否为明文、是否存在 .env.example / .env.sample;另有一条低优先级提示,检查源码里是否硬编码内网或 .internal 主机名。
不是:密钥扫描器、密钥管理工具、运行时防护;也不判断历史里 .env 是否曾经被提交(不读 git 索引)。
维护者:feely0208。仓库:https://github.com/feely0208/dsh-env-audit。社区目录:https://www.skillhub.cn/plugins/feely0208/dsh-env-audit。许可证 MIT,当前包版本 0.1.0(以 package.json 为准)。运行要求:Node.js >= 18,DSH >=0.1.0-rc.6 <0.3.0。
核心功能:五条规则¶
每条命中会给出文件、行号、证据、可查证的依据(如 OWASP Secrets Management、Twelve-Factor Config、Git gitignore 文档),以及处理建议。
| 规则 ID | 检查内容 | 级别 |
|---|---|---|
ENV-NOT-IGNORED |
.gitignore 或 .git/info/exclude 未忽略 .env,且仓库中存在凭据型环境配置 |
高 |
ENV-PLAINTEXT |
.env 中 PASSWORD=、SECRET=、TOKEN=、API_KEY= 等高危键后为明文而非占位符 |
高 |
ENV-FILE-PERM |
.env 权限宽于 600(同机其他用户可读) |
中 |
ENV-NO-EXAMPLE |
有凭据型环境配置,但找不到 .env.example / .env.sample |
低 |
ENV-HARDCODED-CONFIG |
源码硬编码内网/私有网段或 .internal 主机名 |
低 |
关于「明文」规则的两点设计(README 原文说明):
- 报告里不会输出密钥值;正则只匹配到
KEY=,证据栏形如DB_PASSWORD=,避免工具本身成为泄露源。 - 空值、
${VAR}、<generate-with-openssl-rand>、your_xxx、changeme、test、example等占位写法会跳过。
安装与启用¶
在已安装 DSH 的前提下,按官方 README 安装插件:
dsh plugin --profile web add @deepwhale-cn/dsh-env-audit
安装后可用命令 dsh-env-audit(见 package.json 的 bin 字段)。插件以当前 DSH 进程权限读取项目目录;安装前请自行查看仓库源码与 MIT 许可证,确认符合你的合规要求。
典型用法¶
审计当前工作目录:
dsh-env-audit
指定项目根目录:
dsh-env-audit --root /path/to/project
查看内置演示样本(模拟「未忽略 .env、644 权限、明文密码、无模板」等项目):
dsh-env-audit --demo
列出规则与依据:
dsh-env-audit --list-rules
生成 HTML 报告便于归档:
dsh-env-audit --root . --html env-audit.html
接入 CI:静默 JSON 输出,存在 high 级别命中时退出码为 1:
dsh-env-audit --quiet --json
演示样本下,工具可能在 git add . 之前报告例如:.gitignore 未忽略 .env、多条 .env 明文键(仅显示到等号)、权限 644 超过 600、缺少 .env.example、源码中硬编码内网地址等——具体以 --demo 输出为准。
适用场景与边界¶
适合:本地提交前自检、CI 门禁(配合 --quiet --json)、新人 onboarding 时核对 .env 与模板是否齐全。
边界(README 已写明,处理问题时需知晓):
- 无法得知
.env是否已经进入历史提交;若需自查可用git log --all -- .env。规则ENV-NOT-IGNORED描述的是当前忽略配置与是否存在凭据型配置,不等于「从未提交过」。 - 文件权限规则仅在 POSIX(Linux/macOS)有意义;Windows 上
600比较不可用。 ENV-NOT-IGNORED与ENV-NO-EXAMPLE仅在仓库某处存在形如...PASSWORD=/SECRET=/TOKEN=/API_KEY=/CREDENTIAL=的赋值行时运行;仅NODE_ENV、PORT或全小写键名时可能标为「因不适用未运行」。非.env扩展名的配置文件若出现同形状赋值也会触发 when 条件。- 明文规则只认常见高危键名;自定义键名不报。
config.json、settings.yaml中的明文凭据不在范围内。 - 多包仓库中,任一
.gitignore已忽略.env即视为通过ENV-NOT-IGNORED,可能与「只在子目录忽略」的预期不一致。
与同类能力分工:仓库内密钥字面量扫描可配合 dsh-secret-scan;本插件属深鲸网安守护系列「数据与凭据」方向中的配置审计项。
结尾¶
dsh-env-audit 把 .env 会不会进版本库、权限、明文赋值和示例模板拆成可核对的事实,适合在提交或合并前跑一遍。社区目录:https://www.skillhub.cn/plugins/feely0208/dsh-env-audit;源码与完整说明:https://github.com/feely0208/dsh-env-audit。