Redsf/n8n-workflow-linter

GitHub: Redsf/n8n-workflow-linter

一款针对 n8n workflow JSON 导出文件的零依赖静态分析工具,在 CI 中拦截泄露的凭据、硬编码机密和可靠性问题。

Stars: 0 | Forks: 0

# n8n-workflow-linter [![ci](https://static.pigsec.cn/wp-content/uploads/repos/cas/99/993938d8ce5e902ccfb9d6747725c320d855dea3235ed9a304cedf0d94c9321f.svg)](https://github.com/Redsf/n8n-workflow-linter/actions/workflows/ci.yml) [![python](https://img.shields.io/badge/python-3.9%2B-blue)](https://www.python.org/) [![license](https://img.shields.io/badge/license-MIT-green)](LICENSE) 针对 [n8n](https://n8n.io) workflow 导出文件的静态分析工具。可在 CI 中捕获泄露的凭据、硬编码的机密信息、缺失的错误处理以及其他问题——在有缺陷或存在泄露风险的 workflow 合并到 `main` 分支之前进行拦截。 将 n8n workflow 作为 JSON 进行版本控制现在已很普遍。但对它们进行 Lint 检查却并非如此。 workflow 的 JSON 导出文件会轻易携带有效的 API key、来自您私有实例的 credential ID、作为测试数据的真实客户记录,或者是没有重试机制的 HTTP 调用——并且在它进入代码库或在凌晨 2 点运行失败之前,没有任何机制会提醒您。这就是缺失的那道检查关卡。 ``` $ n8n-lint workflows/ workflows/cold_email.json :12 error openAiApi credential uses a real instance ID (8gccIj…aoEr); replace with REPLACE_WITH_CREDENTIAL_ID (Personalize Email) :40 warning HTTP Request has retryOnFail disabled — a transient error will fail the run (Send) warning workflow ships pinned data for: Get Leads — remove it before publishing; it commonly contains real records Checked 1 workflow file(s): 1 error(s), 2 warning(s), 0 info. ``` **零运行时依赖。** 整个 linter 完全基于 Python 标准库运行,因此它可以在任何仅有 `python` 环境的 CI 作业中运行,无需其他依赖。 ## 安装 ``` pip install n8n-workflow-linter ``` 或者无需安装直接运行最新版本: ``` pipx run n8n-workflow-linter workflows/ ``` ## 快速开始 ``` # Lint 一个目录(递归进入子文件夹) n8n-lint workflows/ # Lint 单个文件 n8n-lint workflows/cold_email.json # 遇到 warnings 也会失败,而不仅仅是 errors n8n-lint workflows/ --strict # 查看所有 rule n8n-lint --list-rules ``` ## 规则说明 | 规则 | 默认级别 | 捕获内容 | |---|---|---| | `real-credential-id` | **error** | 凭据引用了来自真实 n8n 实例的 ID,而不是占位符。这会泄露私有实例所使用的 credential,并导致其他任何人无法导入——credential ID 无法在不同账户间转移。 | | `hardcoded-secret` | **error** | 文件中任意位置嵌入了有效的 API key、token 或私钥(OpenAI、Anthropic、AWS、Google、Slack、Stripe、Twilio、GitHub、JWTs、PEM 数据块)。已记录的占位符将被忽略。 | | `hardcoded-resource-id` | warning | 节点中硬编码了 Google Drive/Sheets 的文件 ID 或 Gmail 的标签 ID。这会泄露真实部署中所使用的资源,并破坏可复用性。 | | `no-error-trigger` | warning | 没有激活的 **Error Trigger** 节点——workflow 运行失败时将无法通知任何人。 | | `missing-retry` | warning | 向外部服务发起的 **HTTP Request** 关闭了 `retryOnFail`——瞬时的网络错误会导致整个运行过程失败。 | | `orphan-node` | warning | 画布上存在未连接到任何部分的节点。这些节点永远不会运行,通常意味着连线被误删了。 | | `pinned-data` | warning | 导出文件中遗留了 pinned 的测试数据。这会使文件变得臃肿,且经常包含真实的客户记录。 | | `unauthenticated-webhook` | warning | 没有身份验证的 **Webhook** 触发器——任何拥有此 URL 的人都可以触发它。 | | `disabled-node` | info | 画布上遗留的已禁用节点。| 每一个默认值都是根据真实的 workflow 进行校准的,以将误报率保持在接近零的水平。`real-credential-id` 和 `hardcoded-secret` 被设为 error 是因为它们应当阻止合并;除非您选择启用 `--strict`,否则其余规则仅作为建议。 ## 在 CI 中使用 ### GitHub Actions ``` name: lint-workflows on: [push, pull_request] jobs: n8n-lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: Redsf/n8n-workflow-linter@v1 with: path: workflows/ strict: "false" # set "true" to fail on warnings ``` 检查结果会以内联注释的形式显示在 pull request 上——该 action 会发出 GitHub workflow 命令,因此每个结果都会精确定位到其对应的文件和行号。 ### pre-commit ``` # .pre-commit-config.yaml repos: - repo: https://github.com/Redsf/n8n-workflow-linter rev: v0.1.0 hooks: - id: n8n-lint args: ["--strict"] ``` ### 其他任何 CI 这是一个带有明确退出码的常规 CLI 工具: ``` pip install n8n-workflow-linter n8n-lint workflows/ --strict ``` ## 配置 在您的代码库根目录下放置一个 `.n8nlintrc.json` 文件,以更改严重级别或关闭规则。每个规则都可以设置为 `error`、`warning`、`info` 或 `off`: ``` { "rules": { "disabled-node": "off", "hardcoded-resource-id": "error", "missing-retry": "warning" } } ``` 使用 `--config path/to/config.json` 指向不同的配置文件,或者从命令行临时禁用规则: ``` n8n-lint workflows/ --disable missing-retry --disable disabled-node ``` ## 输出格式 | `--format` | 用途 | |---|---| | `text` (默认) | 面向人类阅读。输出到终端时带有颜色;使用 `--no-color` 可禁用。 | | `github` | 用于 GitHub Actions。发出 `::error`/`::warning` workflow 命令,用于在 PR 上生成内联注释。 | | `json` | 用于脚本和仪表盘。稳定的 schema:`{summary, findings[]}`。 | ## 退出码 | 代码 | 含义 | |---|---| | `0` | 没有阻塞性的检查结果。(存在 warning,但未开启 `--strict`。) | | `1` | 至少有一个 error——或在 `--strict` 模式下出现任何 warning。 | | `2` | 使用错误:配置错误、未知规则或未找到 workflow 文件。 | ## 特意不处理的内容 ## 添加规则 规则非常小巧且独立。请在 [`src/n8n_linter/rules/`](src/n8n_linter/rules/) 中实现一个 `Rule` 子类,将实例添加到 [`rules/__init__.py`](src/n8n_linter/rules/__init__.py) 的 `ALL_RULES` 中,并在 [`tests/fixtures/`](tests/fixtures/) 下添加一对通过/未通过的测试夹具(fixture)。引擎、配置系统和 `--list-rules` 都会从注册表中读取信息,因此无需更改其他任何内容。详情请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。 ## License MIT — 详见 [LICENSE](LICENSE)。
标签:Blue Team, DevSecOps, Linux安全, n8n, Python, 上游代理, 云安全监控, 前端框架, 开源框架, 持续集成, 无后门, 逆向工具, 静态分析