
저장소에서 보안 문제를 찾는 데 도움을 주는 doggo입니다.
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에 웹훅을 보냅니다. 서버는 즉시 스캔 작업을 큐에 넣고 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 분석, 그렇지 않으면 헝크 청크 단위 분석, Anthropic, OpenAI, Google, Mistral, Bedrock 지원 |
| Dep Doctor | CVE, 방치 및 사용 중단된 의존성 | 기본적으로 비활성화되며, 리포지토리별로 옵트인하고 PATH에 osv-scanner 필요 |
자체 스캐너를 추가할 수도 있습니다. Layne 확장을 참조하세요.
모든 것이 적절히 구성되면 Layne은 풀 리퀘스트에 실행을 추가하고 구성된 스캔 도구를 실행합니다. 스캔이 실패하면 다음과 같이 표시됩니다.

Layne의 발견 사항은 보안 문제가 발견된 정확한 줄을 나타내는 인라인 어노테이션으로 PR에 작성됩니다.

검사 자체를 클릭하여 Layne의 발견 사항과 그 요약을 볼 수도 있습니다.

그리고 Layne이 웹훅을 통해 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.