问题
自托管 n8n 的用户面临两个配置层面的安全痛点:
- 环境变量访问是全有或全无:要么用 N8N_BLOCK_ENV_ACCESS_IN_NODE 完全禁用 $env,要么放开后"每个 expression 都能看到全部 process env vars,包括 N8N_ENCRYPTION_KEY(可解密所有已存凭据)、数据库密码等敏感信息"(原帖引述)。想给工作流传一个 API token 都做不到。
- 私有实例被迫公开 webhook:防火墙后的 n8n 因为 MS Teams Trigger 需要公网 URL,只能把 N8N_WEBHOOK_URL 指向自建反向代理,结果"其他 webhook 节点也被一起暴露在公网"。
这些用户的安全意识较强(最小权限、实例不暴露公网),但官方配置粒度跟不上,只能靠硬编码 secret 或手工搭代理打补丁。
目标用户
自托管(self-hosted)n8n 的中小团队和独立开发者,尤其是把实例放在防火墙后、有合规或安全意识的技术负责人。社区三条功能请求均为真实用户提交,说明这是一个小而真实的长尾群体,但互动量低(单帖最多 3 条评论),规模有限。
解决方案
- 最小权限环境变量白名单:支持 N8N_ENV_ACCESS_ALLOWLIST(逗号分隔),仅向 expressions/Code 节点的 $env 暴露命名变量,兼容现有 N8N_BLOCK_ENV_ACCESS_IN_NODE 行为
- 按节点的公开 webhook 地址:允许单个 webhook/trigger 节点覆盖 N8N_WEBHOOK_URL,或配置可选的 N8N_PUBLIC_WEBHOOK_URL,私有实例只暴露必要入口
- 一键安全部署包:以 Docker 镜像 / Helm chart 形式发布预加固的 n8n,开箱即用
- 升级迁移脚本:帮助现有自托管实例平滑切换到加固版,不破坏已有工作流
AI 在此机会中不是核心:这是基础设施配置与安全工程问题,价值来自补丁与打包,而非模型能力。
为什么是现在
信号显示功能缺口正处在被解决的前夜:社区贡献者已写出向后兼容、带单元测试的 allowlist 补丁并提交 PR(n8n-io/n8n#39831),说明方案技术上已验证可行、尚未正式发布——现在做打包产品有短暂窗口,但窗口随时可能因上游合并而关闭。
MVP 范围
第一版做什么:
- 基于官方 n8n 加上 allowlist 补丁构建的 Docker 镜像 / Helm chart
- 内置 N8N_ENV_ACCESS_ALLOWLIST 配置(逗号分隔变量名,仅向 $env 暴露指定变量)
- 自带轻量反向代理与按节点可选的公开 webhook 地址(N8N_PUBLIC_WEBHOOK_URL),让私有实例只暴露 Teams 等必要入口
- 提供升级迁移脚本,保持与上游版本的兼容性
第一版不做什么:
- 不做云端托管版
- 不修改 n8n 的 UI / 编辑器
- 不做凭据管理、审计日志等更宽泛的安全平台功能
风险
- 上游合并风险(最大):n8n 已有开放的 PR(n8n-io/n8n#39831)实现 allowlist,官方随时可能合并,fork 产品瞬间失去存在理由
- 付费意愿缺失:三条信号均显示 willingness_to_pay 为 none,用户默认这是开源项目的免费功能
- 维护负担:长期跟随上游 fork 合并、处理冲突,小团队持续成本高
- 需求规模有限:三条请求互动量很低(最多 3 条评论),痛点真实但可能只覆盖一小撮安全敏感的自托管用户
- 信号偏弱:均为功能请求而非付费痛点的直接表达,机会成立的证据不充分
已有产品
| 产品 | 定位 | 价格 |
|---|---|---|
| n8n | 上游开源项目本身,功能请求和补丁都直接指向它,最可能在上游解决这些问题。 | — |
信号证据
这张卡片依据的原始讨论。摘录保持原文,点“原文”查看上下文。
n8n 社区 · 功能请求9月29日功能请求▲ 0
“It adds an optional N8N_ENV_ACCESS_ALLOWLIST (comma-separated) that exposes only the named variables to $env in expressions/Code nodes - the least-privilege alternative to the all-or-nothing N8N_BLOCK_ENV_ACCESS_IN_NODE.”
n8n 用户希望对 $env 环境变量访问进行细粒度的允许列表控制,而不是全有或全无的阻断。原文
n8n 社区 · 功能请求9月28日功能请求▲ 03 条评论
“Right now the only choices are “no $env access” or “full $env access - including N8N_ENCRYPTION_KEY (which decrypts every stored credential), DB passwords, etc.””
Self-hosted n8n 用户需要将单个 secret 传递给 workflow expressions/Code nodes,但 env access 目前是非黑即白的——要么完全阻止 $env,要么向每个 expression 暴露所有的 process env vars,包括像 N8N_ENCRYPTION_KEY 和 DB passwords 这样敏感的 secrets。原文
n8n 社区 · 功能请求9月22日功能请求▲ 00 条评论
“Our instance of n8n is kept private and not exposed to the internet. The MS Teams Trigger node requires a public url so we created a very small reverse proxy, just for MS Teams Change Notification payloads and exposed that.”
Microsoft Teams Trigger 无法覆盖默认的 N8N_WEBHOOK_URL,导致私有 n8n 实例必须将全局 webhook URL 设为反向代理,使其他 webhook 节点也被公开暴露。原文