
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はWebhookをLayneに送信します。サーバーは直ちにスキャンジョブをキューに追加し、GitHubに200 OKを返します。ワーカーがジョブを取得し、イベントをトリガーしたコミットを正確にクローンし、変更されたファイルを設定された各スキャナー(Semgrep、Trufflehog、Claude、Spectre、Dep Doctor)に渡し、それらの検出結果を収集して、Check Runのインラインアノテーションとして結果を投稿します。
PRで変更されたファイルのみが各スキャナーに渡されます。触れていないファイルの検出結果が報告されることはありません。
Layneには5つの組み込みスキャナーが付属しています。config/layne.jsonでリポジトリごとに各スキャナーを有効化、無効化、設定できます。
| スキャナー | 検出内容 | 備考 |
|---|---|---|
| Semgrep | SAST - バグ、脆弱性、安全でないパターン | デフォルトでsemgrep scan --config autoを実行します。extraArgsで完全に設定可能 |
| Trufflehog | シークレット、APIキー、認証情報 | trufflehog filesystemを実行します。ノイズを減らすには--only-verifiedを使用 |
| Claude | 悪意のある意図、バックドア、難読化されたペイロード、サプライチェーン攻撃 | デフォルトでは無効。リポジトリごとにオプトイン。ANTHROPIC_API_KEYが必要 |
| Spectre | 境界付きの型付きPR差分からの悪意のある意図 | デフォルトでは無効。小さい場合は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.