Layne 是一个自托管的 GitHub App,用于集中管理我们各仓库的安全扫描。由于我们不使用商业化的 SAST/密钥扫描工具,也无法访问 GitHub Enterprise,因此在多个仓库之间维护不同的 GitHub Actions 工作流文件会变得非常困难——尤其是当这些仓库数量不断增长时。相反,我们只需安装一次 Layne,它便会监听拉取请求事件,在服务端运行我们的安全工具,将结果以原生 GitHub Check Run 注释的形式回传,并通知我们安全团队的安全通知频道。
本工具基于 Reddit 的实现。
┌─────────────────────────────────┐
│ GITHUB PULL REQUEST │◀────────────────────────┐
│ (OPEN, SYNC, REOPEN) │ │
└─────────────────────────────────┘ │
│ Check run │
HTTP Post /webhook │
│ │
┌──────────────────────────────────────────────────────────────────────────────────────────┐
│ EC2 Instance (Docker) │ │ │
│ ┌───────▼────────┐ │ │
│ │ NGINX + TLS │ │ │
│ └───────┬────────┘ │ │
│ │ │ │
│ ┌─────────────────────┘ │ │
│ │ │ │
│┌─────────────┐ │ Schedules job ┌────────────────┐ ┌────────────┐ │ │
││ LAYNE │◀─┘ ─────────────────▶│ REDIS │───▶│ TRUFFLEHOG │──┐ │ │
││ SERVER │ │ (BULLMQ) │ │ └────────────┘ │ │ │
│└─────────────┘ └────────────────┘ │ ┌────────────┐ │ │ │
│ │─▶│ SEMGREP │──┤ │ │
│ │ └────────────┘ │ │ │
│ │ ┌────────────┐ │ ┌──────────┐│
│ ├─▶│ CLAUDE │──┼─▶│ REPORTER ││
│ │ └────────────┘ │ └──────────┘│
│ │ ┌────────────┐ │ │
│ ├─▶│ SPECTRE │──┤ │
│ │ └────────────┘ │ │
│ │ ┌────────────┐ │ │
│ └─▶│ DEP DOCTOR │──┘ │
│ └────────────┘ │
└──────────────────────────────────────────────────────────────────────────────────────────┘
当 PR 被打开或更新时——或者根据你配置的触发条件,在工作流/任务运行之后——GitHub 会向 Layne 发送一个 webhook。服务器会立即将扫描任务加入队列,并向 GitHub 返回 200 OK。工作进程会取出该任务,克隆触发事件的确切提交,将更改的文件交给每个已配置的扫描器(Semgrep、Trufflehog、Claude、Spectre、Dep Doctor),收集它们的发现结果,并将结果作为内联注释发布到 Check Run 上。
只有 PR 中修改过的文件会被传递给每个扫描器。你未触及的文件中的发现结果永远不会被报告。
Layne 内置了五个扫描器。你可以在 config/layne.json 中按仓库启用、禁用或配置每一个。
| 扫描器 | 检测内容 | 备注 |
|---|---|---|
| Semgrep | SAST——缺陷、漏洞、不安全模式 | 默认运行 semgrep scan --config auto;可通过 extraArgs 完全配置 |
| Trufflehog | 密钥、API 密钥和凭据 | 运行 trufflehog filesystem;使用 --only-verified 以减少噪音 |
| Claude | 恶意意图、后门、混淆载荷、供应链攻击 | 默认禁用;按仓库选择启用;需要 ANTHROPIC_API_KEY |
| Spectre | 从有界类型化 PR diff 中检测恶意意图 | 默认禁用;当 PR 较小时进行整体分析,否则按 hunk 分块;支持 Anthropic、OpenAI、Google、Mistral、Bedrock |
| Dep Doctor | CVE、已废弃和已弃用的依赖项 | 默认禁用;按仓库选择启用;需要在 PATH 中有 osv-scanner |
你也可以添加自己的扫描器。参见扩展 Layne。
一切配置妥当后,Layne 会在拉取请求中添加一次运行,并运行已配置的扫描工具。当扫描失败时,效果如下。

Layne 的发现结果会以行内注释的形式写入 PR,标明发现安全问题的确切行。

你也可以通过点击该检查本身来查看 Layne 的发现结果及其摘要。

你还可以配置 Layne 通过 webhook 向 Rocket.Chat 频道发送通知——你也可以配置 Slack,而且如果你使用其他聊天平台,添加新的通知器也很容易。

在本地运行文档站点:
npm run docs:dev
然后打开 http://localhost:3000。
完整文档涵盖部署、配置、扫描器、通知器、PR 评论、发现结果抑制、指标、安全架构等内容。
Layne 采用 Apache License 2.0(Apache-2.0)许可。完整文本参见 LICENSE。
Copyright 2026 Rocket.Chat Technologies Corp.