
eBPF 기반 단일 호스트 런타임 보안 대시보드 — Go 에이전트 + SvelteKit. 일반 Linux 호스트를 위한 실시간 프로세스 트리, 네트워크 맵 및 규칙 기반 알림.
Kestrel은 eBPF 에이전트로 커널 이벤트(프로세스 실행, 파일 접근, 네트워크 연결)를 추적하고, 이를 실시간 활동 피드, 프로세스 트리, 호스트 개요, 규칙 기반 알림 엔진을 렌더링하는 SvelteKit 웹 앱으로 스트리밍합니다. 전체 제품/아키텍처 문서는 SPEC.md, 운영 가이드는 AGENTS.md를 참조하세요.
eBPF 생태계는 백엔드/CLI/Kubernetes 오퍼레이터 중심입니다. CNCF 졸업 표준인 Falco는 유명하게도 자체 UI가 없습니다. "커널이 풍부한 데이터를 내보낸다"와 "사람이 실제로 읽을 수 있다" 사이의 간극이 바로 이 프로젝트가 자리 잡은 풀스택 최적 지점입니다. v1은 의도적으로 단일 호스트(Kubernetes 아님)이며 관찰 전용(집행 없음)입니다.
flowchart TB
subgraph host["Linux host · VM in dev, VPS in prod · kernel ≥ 5.8"]
direction TB
probes["eBPF probes (C)<br/>execve · openat · connect"]
agent["Go agent — cilium/ebpf<br/>decode · enrich · batch"]
ingest["/api/ingest<br/>Zod-validated at the boundary"]
rules["rule engine"]
hub["live hub"]
db[("Postgres<br/>events · rules · alerts")]
dash["SvelteKit dashboard<br/>live feed · tree · overview"]
probes -- "ring buffer" --> agent
agent -- "HTTP POST · JSON (Zod contract)" --> ingest
ingest --> db
ingest --> rules
ingest --> hub
hub -- "SSE" --> dash
end핵심 배포 제약: 에이전트는 실제 커널이 필요하므로 Cloudflare Workers(V8 격리 환경, 커널 없음)에서는 실행할 수 없습니다. v1은 에이전트 + 앱 + Postgres를 단일 호스트에 함께 배치합니다. SPEC.md §2를 참조하세요.
Phase 3 — 진행 중. Phase 2 필수 기능(실시간 피드, 프로세스 트리, 호스트 개요)은 완료되었고 VM에서 라이브로 검증되었습니다: eBPF 에이전트(execve + exit, cilium/ebpf)가 실제 커널을 추적하여 이벤트를 앱으로 스트리밍하고, 시작 시 /proc 스냅샷으로 트리를 초기화합니다. 지금까지의 Phase 3: 에이전트에 파일 열기(openat) 및 외부 연결(security_socket_connect) 프로브가 추가되었고(컴파일 검증 완료, VM에서 부하 테스트 대기 중), **네트워크 맵(8.3)**이 구축되었습니다 — D3 포스 기반 프로세스↔대상 그래프입니다. 다음 단계: 민감 파일 모니터(8.4)와 규칙 엔진 + 알림(8.5)입니다. 프로브 작업은 항상 개발 VM에서만 수행되며 호스트에서는 절대 수행되지 않습니다.
적은 수의 뷰에 깊이를 주는 것이 얕게 폭을 넓히는 것보다 낫습니다 — 여섯 개의 깔끔한 뷰를 우선순위 순서대로(필수 기능 우선) 구축했습니다.
execve 프로브 → 링 버퍼 → cilium/ebpf → /api/ingest (VM 내)exit 프로브 + /proc 스냅샷 · 프로세스 트리 · 호스트 개요nixosTest 커널 통합 테스트 · GitHub Actions CIcd app
pnpm install
pnpm dev # http://localhost:5173
앱은 호스트에서 실행되고, 에이전트는 개발 VM에서 실행되어 이벤트를 앱으로 전송합니다. 에이전트 없이 데이터가 채워진 피드를 보려면 합성 생성기를 사용하세요: KESTREL_SYNTHETIC=1 pnpm dev.
pnpm check # svelte-check (types)
pnpm test # vitest — schema + ingest unit tests
pnpm build # production build (adapter-node)
개발/테스트 데이터베이스는 PGlite(WASM으로 컴파일된 Postgres)입니다: 네이티브 빌드가 필요 없고, 별도 서버가 필요 없으며, 프로덕션 Postgres와 동일한 SQL 방언을 사용합니다. 데이터는 app/kestrel-pgdata/에 저장되며(gitignore 대상), 테스트는 임시 인메모리 DB를 사용합니다.
# stream events (leave running in one terminal)
curl -N http://localhost:5173/api/stream
# post an event (in another) — appears live in the stream and the browser
curl -X POST http://localhost:5173/api/ingest -H 'content-type: application/json' \
-d '[{"host":"demo","type":"exec","pid":42,"comm":"bash","cmdline":"bash -i"}]'
각 버그 유형이 존재하는 위치에 맞춰 구성된 세 가지 계층이 있습니다(자세한 내용은 SPEC.md §6–§7 참조):
fast-check가 적대적/비정상 이벤트로 Zod 이벤트 계약을 시험하고 규칙 엔진 불변식을 검증합니다: 오탐 없음, 결정적 판정, 비정상 입력은 경계에서 거부됩니다.현재: Vitest 유닛 테스트(스키마, 수집, 개요, 프로세스 트리, 네트워크 그래프) + 에이전트의 procscan 파서와 이벤트 decode 헬퍼. /app에서 pnpm test, /agent에서 go test ./...를 실행하세요.
SPEC.md §8.11).SPEC.md §8.10).cilium/ebpf vs libbpfgo — 순수 Go, CGO_ENABLED=0, bpf2go 워크플로우.SPEC.md §10).SPEC.md §6).| 경로 | 설명 |
|---|
/app | SvelteKit 앱 — 이벤트 스키마, 수집, SSE 허브, 대시보드 뷰. 빌드 완료 및 실행 가능. |
/agent | Go 사용자 공간 에이전트 + eBPF C 프로브(execve/exit/openat/connect) + /proc 스냅샷. 빌드 완료, VM에서만 실행. |
/infra | Nix 개발 VM(빌드 완료) + nixosTest, Terraform/libvirt 프로비저닝(Phase 4). |
SPEC.md | 권위 있는 제품 및 아키텍처 스펙. |
| 뷰 | 답하는 질문 | 상태 |
|---|
| 실시간 활동 피드 (8.1) | 지금 무슨 일이 일어나고 있나? | ✅ 구축 완료 |
| 프로세스 트리 (8.2) | 무엇이 무엇을 생성했나? | ✅ 구축 완료 |
| 호스트 개요 (8.6) | 한 화면으로 상태 확인? | ✅ 구축 완료 |
| 네트워크 맵 (8.3) | 이 호스트는 무엇과 통신하고 있나? | ✅ 구축 완료 |
| 민감 파일 모니터 (8.4) | 중요한 파일에 접근한 것이 있었나? | ◻️ 계획됨 |
| 알림 및 규칙 (8.5) | 무언가 수상해 보이면 알려줘. | ◻️ 계획됨 |