
Panel de seguridad en tiempo de ejecución para un solo host basado en eBPF — agente Go + SvelteKit. Árbol de procesos en vivo, mapa de red y alertas basadas en reglas para hosts Linux estándar.
La visibilidad a nivel de kernel de Falco, con la interfaz en vivo que las herramientas nativas del kernel no incluyen.
Kestrel rastrea eventos del kernel (ejecución de procesos, acceso a archivos, conexiones de red)
con un agente eBPF y los transmite a una aplicación web SvelteKit que renderiza
un feed de actividad en vivo, un árbol de procesos, una vista general del host y un motor
de alertas basado en reglas. Consulta SPEC.md para el documento completo de producto/arquitectura
y AGENTS.md para la guía operativa.
El ecosistema eBPF está orientado a backend/CLI/operadores de Kubernetes. Falco — el estándar graduado de la CNCF — es famoso por no incluir ninguna interfaz propia. La brecha entre «el kernel emite datos ricos» y «un humano realmente puede leerlos» es el punto dulce full-stack en el que vive este proyecto. Deliberadamente de un solo host (no Kubernetes) y solo observación (sin aplicación de políticas) en 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
La restricción clave de despliegue: el agente necesita un kernel real, por lo que
no puede ejecutarse en Cloudflare Workers (aislamientos V8, sin kernel). v1 coloca
el agente + la app + Postgres en un mismo host. Consulta SPEC.md §2.
| Ruta | Qué |
|---|---|
/app | App SvelteKit — esquema de eventos, ingest, hub SSE, vistas del panel. Construida y ejecutable. |
/agent | Agente de espacio de usuario en Go + sondas eBPF en C (execve/exit/openat/connect) + instantánea de /proc. Construido; se ejecuta solo en la VM. |
/infra | VM de desarrollo Nix (construida) + nixosTest, aprovisionamiento con Terraform/libvirt (Fase 4). |
SPEC.md | Especificación autoritativa de producto y arquitectura. |
Fase 3 — en curso. Los imprescindibles de la Fase 2 (feed en vivo, árbol de procesos, vista
general del host) están completos y verificados en vivo en la VM: el agente eBPF (execve +
exit, cilium/ebpf) rastrea un kernel real y transmite eventos a la app, sembrando
el árbol con una instantánea de /proc al arrancar. Hasta ahora en la Fase 3: el agente incorporó
sondas de apertura de archivos (openat) y de conexiones salientes (security_socket_connect)
(verificado en compilación; prueba de carga pendiente en la VM), y el mapa de red
(8.3) está construido — un grafo dirigido D3 de procesos↔destinos. Lo siguiente:
el monitor de archivos sensibles (8.4) y el motor de reglas + alertas (8.5). El trabajo de sondas
se queda en la VM de desarrollo, nunca en el host.
La profundidad en pocas vistas vence a la amplitud hecha superficialmente: seis vistas nítidas, construidas en orden de prioridad (primero lo imprescindible).
| Vista | La pregunta que responde | Estado |
|---|---|---|
| Feed de actividad en vivo (8.1) | ¿Qué está pasando ahora mismo? | ✅ construido |
| Árbol de procesos (8.2) | ¿Qué generó qué? | ✅ construido |
| Vista general del host (8.6) | ¿Estado en una sola pantalla? | ✅ construido |
| Mapa de red (8.3) | ¿Con qué está hablando este host? | ✅ construido |
| Monitor de archivos sensibles (8.4) | ¿Algo tocó los archivos que importan? | ◻️ planificado |
| Alertas y reglas (8.5) | Avísame cuando algo parezca sospechoso. | ◻️ planificado |
execve → ring buffer → cilium/ebpf → /api/ingest (en la VM)exit + instantánea de /proc · árbol de procesos · vista general del hostnixosTest · CI de GitHub Actionscd app
pnpm install
pnpm dev # http://localhost:5173
La app se ejecuta en el host; el agente se ejecuta en la VM de desarrollo y le envía eventos. Para ver un feed poblado sin el agente, activa el generador sintético: KESTREL_SYNTHETIC=1 pnpm dev.
pnpm check # svelte-check (types)
pnpm test # vitest — schema + ingest unit tests
pnpm build # production build (adapter-node)
La base de datos de desarrollo/pruebas es PGlite (Postgres compilado a WASM): sin compilación nativa, sin servidor separado, el mismo dialecto SQL que el Postgres de producción. Persiste en app/kestrel-pgdata/ (ignorado por git); las pruebas usan una DB efímera en memoria.
# 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"}]'
Tres niveles, alineados con dónde vive cada clase de bug (detalle completo en
SPEC.md §6–§7):