UniFi
ProNetwork gear
Already-deployed Ubiquiti gear becomes a first-class SOC sensor.
UniFi homepage ↗Ubiquiti's commercial network platform — UDM, UDM-Pro, Dream Machine, USG, UniFi Switches. CyberCLI pulls firewall events + admin audit + client activity from the controller API, and lights up Protect (camera) events as Pro tier matures.
Production-shippable. Integration test coverage + battle-tested in design-partner installs.
What it watches
- Firewall + IPS/IDS events from the UDM/USG
- Admin audit — controller logins, config + firmware changes
- Client connect/disconnect + roaming activity
- Rogue-AP + DHCP-anomaly detections
- Port-forward + WAN-rule changes
MITRE ATT&CK coverage
Tactics this connector gives CyberCLI visibility into.
Every alert this connector surfaces
15 event types
Every matrix-covered event_type on the passthrough lane — pinned by the engine's coverage matrix.
The right column shows the operator-friendly phrase the dashboard renders. High-severity
AI-lane signals are summarized in What it watches above (Warden + Herald
handle those); the rest take the substrate's passthrough lane (no AI tokens burned).
| event_type | dashboard renders |
|---|---|
| wifi.connected | WiFi association on unifi |
| wifi.disconnected | WiFi disconnect on unifi |
| wifi.roamed | WiFi roam on unifi |
| association | WiFi client activity on unifi |
| dhcp | DHCP lease activity on unifi |
| firewall.blocked | Firewall blocked traffic on unifi |
| firewall | Firewall activity on unifi |
| dpi | Traffic inspection match on unifi |
| device.added | Device joined network on unifi |
| device.removed | Device left network on unifi |
| admin.login | Admin sign-in on unifi |
| admin | Controller settings changed on unifi |
| cef | Controller event on unifi |
| other | Unclassified network event on unifi |
| ids.detected | Security rule match on unifi |
What it helps you catch
What you'd see in CyberCLI
illustrativeCatches an unexpected admin login to your controller — often the first sign someone's in the network management plane.
Routed to Warden (triage) → Knight (detection) → Paladin (containment)
⛓ every step hash-chained · replayable
What CyberCLI reads from UniFi
audit our mathUniFi events arrive from the controller's Events API + DPI engine. The 20 fields we read carry the full network picture: who the client is (MAC + vendor), where they're going (destination IP, port, app, DPI signature), what the controller flagged (threat category, action taken), and what already happened (block, allow, alert). Enough context to verify a threat and authorize a UniFi-side response without leaving the dashboard.
Event categories we parse
- Api dpi alert api_dpi_alert.json
Deep packet inspection hit — known-bad TLDs, threat-intel feeds, suspicious payloads. Carries threat_category, signature, srcip/dstip + client identity.
- Api firewall block api_firewall_block.json
Controller-rule firewall denies (WAN-side and LAN-side). Includes the rule that fired, srcip/dstip, dport, and protocol.
Sample event · Api dpi alert ↓
{
"event_id": "evt_2026051213_002",
"site_id": "site_main",
"timestamp": "2026-05-12T13:01:00.000Z",
"type": "dpi_threat",
"severity": "high",
"client_mac": "aa:bb:cc:dd:ee:ff",
"src_ip": "192.168.1.42",
"dst_ip": "198.51.100.99",
"dst_port": 443,
"ap_mac": "00:11:22:33:44:55",
"hostname": "usg-edge",
"rule_id": "ips_signature_42",
"message": "DPI signature match: known C2 destination"
} Full field index · 34 fields ↓
.action.cef_device_product.cef_device_vendor.cef_device_version.cef_event_name.cef_severity.cef_signature_id.cef_version.client_hostname.client_ip.client_mac.cybercli_low_signal.cybercli_parse_status.cybercli_wire_format.dpi_category.dpi_signature.dst_ip.dst_port.event_id.event_timestamp.fw_descr.network_name.proto.rule_id.rule_level.src_ip.src_port.src_user.ssid.unifi_category.unifi_class.unifi_host.unifi_site.vlan MITRE techniques typically mapped
Trust Ladder ceiling · L0 → L4
- ·L0–L2: digest, notify, summarize the DPI/firewall event
- ·L3 (Knight verification): enrich with reputation lookups, query the controller for client history
- ·L4 (Paladin containment, Pro+): UniFi-side client block via unifi.block_client + deauth via unifi.deauth_station
- ·L5+: VLAN reassignment, controller-policy changes, multi-site coordinated blocks
Full ladder semantics · /trust →
Field count + sample event auto-derived from src/cybercli/connectors/unifi/vector.vrl at build time. Numbers update the moment the engine's parser changes — no drift.
Close more of the kill chain
UniFi covers 3 of 14 ATT&CK tactics. Pair it with these to widen coverage:
How to connect
- 1 In your UniFi controller, create a read-only API user / API key.
- 2 Run `cybercli onboard unifi` with the controller URL + key (vault-stored).
- 3 CyberCLI polls the controller API for events.
- 4 Confirm in the dashboard's Connectors panel. (UniFi Protect camera events arrive as the Pro tier matures.)
Already deployed Ubiquiti gear? Generate an API key in your UniFi controller → `cybercli onboard unifi`
Real Onboarding Manual
v1.0 — 2026-06-18Within 60 seconds of clicking Send Test Event in the SIEM Server panel, you see a CEF-tagged ndjson line under /var/opt/cybercli/syslog/events/unifi-<ip>/ with unifi_class set to wifi.connected / firewall.blocked / admin.login (matching the test category) and your UNIFI* extension fields parsed into structured columns. Once real network activity flows, you'll see CEF events arrive within the cadence your categories are configured for — quiet at peacetime, busy when something happens.
Pre-flight
- 1Confirm UniFi OS 5.0+ / Network 9.3+
The SIEM Server forwarder shipped in UniFi Network 9.3.43 and stays the canonical syslog surface through 10.x. On older firmwares the menu structure below doesn't exist and the legacy Remote Logging panel must be used instead.
- 2The CyberCLI host's IP is reachable from your UDM-Pro on UDP 514
UniFi managed devices forward via UDP syslog (not HTTPS, despite the SIEM Server label). The UDM-Pro must be able to send to your CyberCLI host's IP on UDP 514. Inter-VLAN routing has to allow it.
ping -c 2 <cybercli-host-ip> # from the UDM-Pro's terminal if SSH is on, or from any device on the management VLAN
- 3Vector substrate is up on the CyberCLI host
If `cybercli setup install-syslog` hasn't been run, port 514 isn't bound and every packet the UDM-Pro sends bounces with ICMP port-unreachable. The UDM-Pro silently retries forever without surfacing the failure in its UI.
sudo ss -lnup | grep :514
Configure
- 1Onboard the connector in CyberCLI first — multi-IP form for UDM-Pro 9.x+On your CyberCLI host
UDM-Pro 9.x/10.x routes its syslog from whichever interface reaches the collector — usually the LAN-side IP, NOT the management IP you configured in the controller UI. The single-IP guard form silently aborts the right events. Pass BOTH IPs separated by a comma: the management IP (so when you look at the connector record, it tells you which appliance) and the egress IP (so the VRL guard actually accepts the wire).
- command
-
cybercli setup add-syslog-source --connector unifi --source-ip 10.10.0.1,10.100.0.1 - first IP (canonical)
-
<UDM-Pro management IP, e.g. 10.10.0.1>Becomes the slug + identity for forensic queries. - second IP (egress)
-
<UDM-Pro LAN-side IP on the VLAN that reaches CyberCLI, e.g. 10.100.0.1>Find with `ip route get <cybercli-host-ip>` from the UDM-Pro.
Why thisWithout the second IP the substrate is functionally invisible — packets arrive, Vector's syslog source parses them, and the VRL `if src_ip != management_ip { abort }` drops every single one. Zero error surface, zero events. This is the single most-common silent failure on UDM-Pro deployments.
- 2Open the SIEM Server panelUniFi Network → Settings → Control Plane → Integrations → System Logging / SIEM
This is the surface that ships syslog in current firmware. In the right-side drawer you'll see three radio options: Internally Stored, SIEM Server, and (older builds) Off. Pick SIEM Server. Despite the name, the wire format is plain RFC5424 syslog carrying CEF — there is no HTTPS handshake, no Splunk HEC, no API key. Any syslog UDP receiver that understands CEF works.
ImportantDO NOT use 'Internally Stored'. That mode keeps logs on the controller only and never emits them to your CyberCLI host. The radio matters more than the Server Address field — a perfectly-typed IP under Internally Stored sends zero packets.
- 3Set the destination + portSame panel · Server Address + Port
Set the address and port. The UI doesn't reach back to verify; whatever you type is what the UDM-Pro will try.
- Server Address
-
<CyberCLI host IP>Use the IP your UDM-Pro can actually reach — see preflight check 2. Hostnames work if your management VLAN has DNS for them, but raw IP is safer. - Port
-
514UDP. Vector also listens on TCP 6514 for encrypted forwarding but SIEM Server in current firmware emits plaintext UDP. - Include Raw Logs
-
on (recommended)Without this the CEF payload is structured-only and you lose the original message text — Warden's context window benefits from both.
- 4Pick categories — at minimum Critical + Triggers + Admin ActivitySame panel · Categories chip selector
UniFi splits emitted events into 14 categories. The defaults are conservative; Critical, Triggers, and Admin Activity are the three you cannot operate without regardless of tier. Client Devices is noisy but valuable when paired with anomaly detection — leave it on for Pro and above.
- Critical
-
on (mandatory)System-impacting events. Promoted automatically to high signal by the VRL pack. - Triggers
-
on (mandatory)Rule-fired events including firewall blocks + IDS detections. Promoted automatically. - Admin Activity
-
on (mandatory)Controller logins + config changes. First sign someone's in your management plane. - Device + Client + Updates
-
on (recommended)Noisier but feeds Warden the context it needs to correlate.
- 5Save + apply — and click Send Test EventSame panel · top-right Apply button + Send Test Event link
The save action commits the config to the controller. The Send Test Event button below the Port field emits a synthetic CEF packet with category=Critical immediately — this is the canonical instant-verify. If you see a packet land on the CyberCLI side within seconds, the wire path is good. If you don't, either the destination IP / port is wrong, the UDM-Pro send-socket is in the 9.x/10.x stuck-after-config-apply state (reboot the controller), or your inter-VLAN firewall is dropping UDP 514.
Verify
- 1
Confirm packets actually arrive on the wire (definitive test)
sudo tcpdump -nni any 'dst host <cybercli-host-ip> and udp dst port 514' -c 5
You should seeIP 10.100.0.1.46312 > 10.100.0.206.514: ... length 396
If this failsIf 0 packets in 30 seconds AFTER clicking Send Test Event: the UDM-Pro is not emitting. Reboot the UDM-Pro (the SIEM Server send-socket is documented to stay closed until controller restart in some 9.x/10.x builds) and retest. If still nothing: check inter-VLAN routing + that no upstream firewall rule is blocking UDP 514 between your management and CyberCLI VLANs.
- 2
Confirm Vector parsed packets into events ndjson
sudo zcat /var/opt/cybercli/syslog/events/unifi-<management-ip>/$(date +%Y-%m-%d).ndjson.gz | tail -1 | python3 -m json.tool
You should see"cybercli_connector": "unifi", "cybercli_wire_format": "unifi_cef", "unifi_class": "wifi.connected"
If this failsIf packets are arriving (tcpdump above shows them) but the events file is empty: the VRL guard is aborting them because the source_ip in the packet doesn't match either IP you passed to --source-ip. Verify with `sudo tcpdump -nni any 'dst host <cybercli-host-ip> and udp dst port 514' -X` and look at the source IP — re-run `cybercli setup add-syslog-source --force` with that IP added to the comma-separated list.
- 3
Confirm the dashboard shows real events flowing
open http://<cybercli-host-ip>:8090/connectors/unifi # or your reverse-proxy URL
You should seeLast event: <timestamp within 1 minute> · Events today: <non-zero>
If this failsSubstrate green (events file growing) but dashboard says zero: the syslog-ingest service may not be running. `sudo systemctl status cybercli-syslog-ingest` should show active (running) with recent log lines processing events.
Pitfalls (what bit us so it doesn't bite you)
▸ SIEM Server is NOT HTTPS or a vendor-specific API
The label suggests Splunk HEC or Microsoft Sentinel ingest — both of which use HTTPS POST to a vendor-specific endpoint. UniFi's implementation is plain UDP syslog with a CEF body. Any syslog receiver that understands CEF (Vector, rsyslog, syslog-ng, Logstash) accepts it directly.
Don't stand up an HTTPS shim or an HEC-compatible endpoint. Point SIEM Server at the same UDP 514 your other syslog sources use. Vector's syslog source handles the framing; CyberCLI's VRL pack handles the CEF body.
▸ Source IP is the UDM-Pro's egress interface, NOT the management IP
UDM-Pro routes outbound traffic via whichever interface has a route to the destination. If your CyberCLI host is on a different VLAN than your management VLAN, the source IP on syslog packets will be the UDM-Pro's interface on the destination's VLAN — not the IP you typed into the controller UI. The VRL source_ip guard checks the actual packet source, not the controller's identity.
Pass both IPs to --source-ip as a comma-separated list. To find the egress IP, from the UDM-Pro run `ip route get <cybercli-host-ip>` — the `src` field in the output is what the guard needs to accept.
▸ Send Test Event is the canonical instant-verify; trust it
Real UDM-Pro syslog cadence is event-driven — if nothing's happening on the network you can wait minutes without seeing a packet. Send Test Event emits synthetically tagged Critical category, so if the wire path is good you see it land within 2-3 seconds. If you don't, the wire path is broken — not 'maybe it's just quiet'.
Use Send Test Event as a binary signal. Packet arrives within 5s → wire path is good, you can wait for real events. Packet doesn't arrive in 30s → wire path is broken, fix that before touching anything else.
▸ Known UniFi 9.x/10.x bug: SIEM Server stays closed after config apply
Multiple Ubiquiti community threads and the Huntress integration docs document a recurring bug where the SIEM Server forwarder applies its config but never opens the sending socket until the controller restarts. The UI shows the config as active; the socket isn't.
If Send Test Event produces 0 packets but the controller UI insists the config is applied and active, reboot the UDM-Pro. (Settings → System → Restart.) This is the #1 reported workaround across UDM-SE / UDM-Pro / Dream Machine discussions for 2025-2026 firmware.
▸ Critical / Triggers categories drive Warden — leave them on
The CyberCLI VRL pack promotes events tagged with category=Critical, Triggers, or Alarm to high signal automatically, regardless of the specific event_name. Operators who turn these off to reduce noise are turning off the events that matter most.
Keep Critical + Triggers + Admin Activity on at minimum. If the volume is overwhelming, throttle at the Warden level (per-role context window + rate limits in /ai-agents settings) rather than at the source.
▸ Classic 'Remote Syslog' panel no longer exists in 9.x+ — don't go looking
Operators familiar with UDM-Pro 7.x/8.x reach for Settings → System → Application Configuration → Remote Logging. That panel was retired into the SIEM Server surface in 9.3 and earlier docs still pointing operators there create confusion.
Settings → Control Plane → Integrations → System Logging / SIEM is the current path. The CyberSecure → Traffic Logging panel forwards the same data for the CyberSecure-flagged events; you can configure both to send to the same destination if you want max coverage.
▸ Multi-word UNIFI* extension values truncate at the space
UniFi's CEF extensions use space as the field delimiter but don't quote values that contain spaces — so `UNIFIcategory=Client Devices` parses as category=Client and a stray Devices token. The category-based routing still matches the first word, so routing isn't broken — but the value visible in the dashboard is truncated.
Known limitation in the CyberCLI v1 VRL pack — the first word is captured and used for routing. Full multi-word values land in `.message` raw. A future VRL upgrade may add a quoted-string-aware parser; tracked as a v1.x polish item.
▸ Netconsole is kernel-only and event-rare — don't rely on it for testing
The same panel includes a Netconsole row that emits kernel logs over UDP 514 separately from the SIEM Server flow. Netconsole only emits when the UDM-Pro's kernel logs something — extremely rare on a healthy gateway — so an operator watching tcpdump for Netconsole packets can wait days.
Leave Netconsole on (it's useful when kernel panics happen) but use SIEM Server + Send Test Event for the actual functional check. Netconsole isn't a heartbeat.
Troubleshoot
▸ Symptom: Send Test Event produces 0 packets in tcpdump
Cause: Either the destination IP is unreachable from the UDM-Pro, an upstream firewall is blocking UDP 514, or the UDM-Pro's send-socket is in the stuck-after-apply state (known 9.x/10.x bug).
Fix: 1) Verify reachability: from the UDM-Pro (or any device on the management VLAN) `ping <cybercli-host-ip>` must succeed. 2) Check inter-VLAN firewall rules for UDP 514 allow. 3) Reboot the UDM-Pro (Settings → System → Restart) to clear the stuck-socket state and re-test.
▸ Symptom: tcpdump shows packets but events ndjson is empty
Cause: Vector is parsing the syslog envelope but the VRL guard is aborting events because the source_ip in the packet doesn't match any IP you passed to --source-ip.
Fix: Run tcpdump with `-X` to see the actual source IP of arriving packets. Re-run `cybercli setup add-syslog-source --connector unifi --source-ip <list>,<that_ip> --force` with the discovered IP added to the comma-separated list. Vector hot-reloads.
▸ Symptom: events ndjson growing but dashboard says 0 events
Cause: The cybercli-syslog-ingest service (the consumer that pulls from Vector's unix socket and runs the SOC pipeline) isn't running or is failing.
Fix: `sudo systemctl status cybercli-syslog-ingest` to check state. If inactive: `sudo systemctl restart cybercli-syslog-ingest`. If active but the dashboard shows 0: `sudo journalctl -u cybercli-syslog-ingest -n 50` and look for schema rejection / digest stage failures.
▸ Symptom: Events arrive tagged unifi_class=other or cef_malformed
Cause: Either the UDM-Pro is sending a non-CEF format (older firmware, or operator selected `Internally Stored` and re-enabled `Off` then `SIEM Server` in a state that emits legacy syslog), or the CEF body is malformed.
Fix: Inspect a raw message with `sudo zcat /var/opt/cybercli/syslog/events/unifi-<ip>/$(date +%Y-%m-%d).ndjson.gz | tail -1`. If `appname != 'CEF'` and the message doesn't start with `0|Ubiquiti|`, the UDM-Pro is shipping legacy format — confirm SIEM Server is selected (not Internally Stored or Off) and Apply again.
FAQ
▸ Do I need a UniFi Cloud Site Manager API key for syslog?
▸ What about UniFi Protect cameras?
▸ Encrypted syslog (TLS) support?
▸ I have multiple UDM-Pro sites — do I configure each one separately?
Local-to-hybrid. CyberCLI reads your self-hosted UniFi controller over the LAN; if you use UniFi's cloud, only the events you authorize are pulled.