How Umbra works
Umbra is the sensor; DefOpSec is the command center. Together they capture what an attacker does after compromising a honeypot, and give you a replayable record.
The model
A honeypot is a machine you intend to let attackers compromise. The Umbra agent runs inside that host and records activity at the kernel/OS level, then ships normalized events to the DefOpSec command center. Because the honeypot is meant to be rooted, it runs as an isolated VM — a hardware-virtualization boundary — so a guest-kernel exploit stays in the guest and you can roll back from a snapshot.
Umbra agent captures activity in-host.
Batched, gzipped NDJSON over HTTPS, authenticated by a per-sensor key.
Normalizes, correlates into sessions, stores per tenant.
Dashboard, live feed, session replay, world map.
Data flow
The agent emits a single event schema regardless of platform. Events batch and upload
asynchronously; if the collector is unreachable they spool to disk and drain on recovery,
so nothing is lost across a collector restart or a network blip. The sensor's long-lived upload
key lives only in /etc/umbra/sensor.key on the honeypot and is never passed on a
command line.
What gets captured (per OS)
Linux
eBPF CO-RE (kernel 5.8+ with BTF).
- Process exec with full argv (tracepoint)
- Outbound TCP connect — remote IP/port + pid (kprobe)
- DNS queries (libc
getaddrinfouprobe) - Typed commands via a bash
readlineuprobe — catches builtins and failed commands - Session + login-uid correlation
macOS
Apple Endpoint Security (built-in eslogger, no entitlement needed).
- Process exec + file create/unlink/rename
- SSH login with attacker source IP + user
- TCP connect + DNS via libpcap
Windows
ETW (Windows 10/11 & Server 2016+).
- Process creation (Kernel-Process)
- DNS client queries
- Outbound connects (Kernel-Network)
- Typed PowerShell (ScriptBlock logging)
Enrolling a honeypot
In Sensors → Add sensor you get a one-time enrollment code and a copy-paste line. Run it as root on the honeypot:
curl -fsSL https://<command-center>/install.sh | sudo sh -s -- UMBRA-xxxxxxxx
The installer checks preflight requirements, downloads the matching prebuilt agent and verifies its checksum, asks a short questionnaire (operator, location/region, honeypot kind, what's exposed), redeems the code for the sensor key, and installs a service. The code is single-use and short-lived; the key is generated server-side and returned only to the honeypot — never shown in the browser. The location/region you provide is what places your honeypot on the world map (country-level only).
Sessions & replay
Every exec, connect, DNS lookup and command carries a session id and login-uid, so Umbra ties all of an intrusion's activity to one login and separates it from background daemon noise. The Sessions view lists correlated intrusions (system-only noise hidden by default); opening one gives a chronological, keystroke-level replay timeline.
Isolation & privacy
DefOpSec is multi-tenant: each account sees only its own honeypots and data, enforced on every query by an account id derived from your session — never from anything the browser sends. The public world map shows only country-level aggregate counts and OS mix; it never exposes IPs, sensor names, or which tenant owns a honeypot. Captured attacker strings are always rendered as text, never as HTML, so a hostile payload can't execute in your browser.