CyberCLI
← All connectors

UniFi

Pro

Network 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.

CyberCLI pack v1.0.0 stable
updated 2026-06-06

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.

TA0001 · Initial Access TA0008 · Lateral Movement TA0011 · Command & Control
See the full coverage matrix →

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

Catches an unexpected admin login to your controller — often the first sign someone's in the network management plane.
Flags a new port-forward quietly exposing an internal service to the internet.
Surfaces a rogue device and the rule change that let it talk out.

What you'd see in CyberCLI

illustrative
CYCON 3 high UniFi

Catches 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 math
Fields normalized
34
parsed from the source event
Event categories
2
with on-disk fixtures
Trust Ladder
L0 → L4
AI authorization range

UniFi 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

AI can authorize
  • ·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
Requires human approval
  • ·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. 1 In your UniFi controller, create a read-only API user / API key.
  2. 2 Run `cybercli onboard unifi` with the controller URL + key (vault-stored).
  3. 3 CyberCLI polls the controller API for events.
  4. 4 Confirm in the dashboard's Connectors panel. (UniFi Protect camera events arrive as the Pro tier matures.)
Install / activate
Already deployed Ubiquiti gear? Generate an API key in your UniFi controller → `cybercli onboard unifi`

Real Onboarding Manual

v1.0 — 2026-06-18
Tested with
UniFi OS 5.1.19UniFi Network 10.4.57UDM-Pro hardware
What good looks like

Within 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

  1. 1
    Confirm 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.

  2. 2
    The 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
  3. 3
    Vector 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

  1. 1
    Onboard 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 this

    Without 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.

  2. 2
    Open the SIEM Server panel
    UniFi 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.

    Important

    DO 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.

  3. 3
    Set the destination + port
    Same 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
    514
    UDP. 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.
  4. 4
    Pick categories — at minimum Critical + Triggers + Admin Activity
    Same 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.
  5. 5
    Save + apply — and click Send Test Event
    Same 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. 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 see
    IP 10.100.0.1.46312 > 10.100.0.206.514: ... length 396
    If this fails

    If 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. 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 fails

    If 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. 3

    Confirm the dashboard shows real events flowing

    open http://<cybercli-host-ip>:8090/connectors/unifi   # or your reverse-proxy URL
    You should see
    Last event: <timestamp within 1 minute>   ·   Events today: <non-zero>
    If this fails

    Substrate 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
Why it happens

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.

How to fix it

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
Why it happens

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.

How to fix it

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
Why it happens

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'.

How to fix it

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
Why it happens

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.

How to fix it

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
Why it happens

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.

How to fix it

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
Why it happens

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.

How to fix it

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
Why it happens

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.

How to fix it

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
Why it happens

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.

How to fix it

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?
No. The CyberCLI cloud-API connector is separate — it pulls device inventory and admin audit events from api.ui.com (Cloud Site Manager). Syslog/SIEM Server is its own thing and works without any API key.
What about UniFi Protect cameras?
Protect events flow through the same SIEM Server surface in current firmware. If you've selected the Protect-relevant categories (Motion, Doorbell, Detection) they ride the same UDP 514 channel as Network events.
Encrypted syslog (TLS) support?
Vector listens on TCP 6514 with TLS support, but current UniFi firmware emits plaintext UDP 514 only. If/when Ubiquiti adds an Encrypted option in the SIEM Server panel, the CyberCLI substrate already accepts it — no engine change required.
I have multiple UDM-Pro sites — do I configure each one separately?
Yes. Each site forwards independently to your CyberCLI host. Run `cybercli setup add-syslog-source --connector unifi --source-ip <site-1-ips>` once per site (with that site's UDM-Pro IPs). Each site lands in its own events directory keyed by the primary IP, so you can correlate or filter per-site.
Guild roles it feeds
  • Warden (triage)
  • Knight (detection)
  • Paladin (containment)
The Guild →
Sovereignty

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.

Go deeper