
Dashboard di sicurezza runtime per singolo host basata su eBPF — Go agent + SvelteKit. Albero dei processi in tempo reale, mappa di rete e avvisi basati su regole per host Linux standard.
La visibilità a livello di kernel di Falco, con la UI live che gli strumenti nativi del kernel non includono.
Avvio rapido · Specifica · Viste · Roadmap
Kestrel traccia gli eventi del kernel (esecuzione di processi, accesso ai file, connessioni di rete) con un agente eBPF e li trasmette a un'app web SvelteKit che visualizza un feed di attività in tempo reale, l'albero dei processi, la panoramica dell'host e un motore di alert basato su regole. Vedi SPEC.md per il documento completo di prodotto/architettura e AGENTS.md per la guida operativa.
L'ecosistema eBPF è modellato su backend/CLI/operator Kubernetes. Falco — lo standard diplomato CNCF — è notoriamente privo di una UI propria. Il divario tra «il kernel emette dati ricchi» e «un essere umano può effettivamente leggerli» è il punto dolce full-stack in cui vive questo progetto. Deliberatamente single-host (non Kubernetes) e solo osservazione (nessuna enforcement) nella v1.
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
Il vincolo di distribuzione chiave: l'agente necessita di un kernel reale, quindi non può girare su Cloudflare Workers (isolati V8, nessun kernel). La v1 colloca agente + app + Postgres sullo stesso host. Vedi SPEC.md §2.
Fase 3 — in corso. I must-have della Fase 2 (feed live, albero dei processi, panoramica host) sono completi e verificati live nella VM: l'agente eBPF (execve + exit, cilium/ebpf) traccia un kernel reale e trasmette gli eventi all'app, popolando l'albero con uno snapshot /proc all'avvio. Fase 3 finora: l'agente ha acquisito le sonde di apertura file (openat) e di connessione in uscita (security_socket_connect) (verificate in compilazione; load test in sospeso nella VM), e la mappa di rete (8.3) è stata costruita — un grafo a forze processi↔destinazioni. Prossimo passo: il monitor dei file sensibili (8.4) e il motore di regole + alert (8.5). Il lavoro sulle sonde resta nella VM di sviluppo, mai sull'host.
La profondità su poche viste batte un'ampiezza superficiale: sei viste precise, costruite in ordine di priorità (prima i must-have).
execve → ring buffer → cilium/ebpf → /api/ingest (nella VM)exit + snapshot /proc · albero dei processi · panoramica hostnixosTest · CI GitHub Actionscd app
pnpm install
pnpm dev # http://localhost:5173
L'app gira sull'host; l'agente gira nella VM di sviluppo e le invia gli eventi. Per vedere un feed popolato senza l'agente, attiva il generatore sintetico: KESTREL_SYNTHETIC=1 pnpm dev.
pnpm check # svelte-check (types)
pnpm test # vitest — schema + ingest unit tests
pnpm build # production build (adapter-node)
Il database di sviluppo/test è PGlite (Postgres compilato in WASM): nessuna build nativa, nessun server separato, stesso dialetto SQL del Postgres di produzione. Persiste in app/kestrel-pgdata/ (gitignored); i test usano un DB in-memory effimero.
# 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"}]'
Tre livelli, abbinati al punto in cui vive ogni classe di bug (dettagli completi in SPEC.md §6–§7):
fast-check guida il contratto eventi Zod con eventi avversari/malformati e verifica gli invarianti del motore di regole: nessun falso match, verdetti deterministici, input malformati respinti al confine.Oggi: unit test Vitest (schema, ingest, panoramica, albero dei processi, grafo di rete) + il parser procscan dell'agente e gli helper decode degli eventi. Esegui pnpm test in /app, go test ./... in /agent.
SPEC.md §8.11).SPEC.md §8.10).cilium/ebpf vs libbpfgo — Go puro, CGO_ENABLED=0, workflow bpf2go.SPEC.md §10).SPEC.md §6).| Percorso | Cosa |
|---|
/app | App SvelteKit — schema eventi, ingest, hub SSE, viste della dashboard. Implementata e avviabile. |
/agent | Agente userspace Go + sonde eBPF in C (execve/exit/openat/connect) + snapshot /proc. Implementato; gira solo nella VM. |
/infra | VM di sviluppo Nix (implementata) + nixosTest, provisioning Terraform/libvirt (Fase 4). |
SPEC.md | Specifica autorevole di prodotto e architettura. |
| Vista | La domanda a cui risponde | Stato |
|---|
| Feed attività live (8.1) | Cosa sta succedendo in questo momento? | ✅ costruita |
| Albero dei processi (8.2) | Cosa ha generato cosa? | ✅ costruita |
| Panoramica host (8.6) | Stato in una schermata? | ✅ costruita |
| Mappa di rete (8.3) | Con chi sta parlando questo host? | ✅ costruita |
| Monitor file sensibili (8.4) | Qualcosa ha toccato i file importanti? | ◻️ pianificata |
| Alert e regole (8.5) | Avvisami quando qualcosa sembra sospetto. | ◻️ pianificata |