dsh-env-audit:在提交前审计 `.env` 配置本身

前言

在 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 原文说明):

  1. 报告里不会输出密钥值;正则只匹配到 KEY=,证据栏形如 DB_PASSWORD=,避免工具本身成为泄露源。
  2. 空值、${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。

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

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

Xiaoye