Date: 2026-05-30
Accepted
Islandr's threat model centers on one fact: the hub VM is internet-exposed. It listens on a public UDP port for WireGuard and serves the admin UI over HTTPS. Any externally-reachable host with credentials to attack must be assumed compromisable.
The technically tempting next step is "let Islandr also configure the UniFi Cloud Gateway sites": admin defines ACLs in Islandr, Islandr pushes the corresponding firewall rules onto each site's UCG via its API. End-to-end enforcement, one source of truth, very clean.
The trust-direction problem: to push rules to UCG, the hub VM needs UCG credentials and an outbound connection — or worse, an inbound one — into the trusted internal network. A compromise of the hub VM then directly compromises the internal LAN's firewall.
Three classes of attacker we care about:
A3 is the one this ADR is about. We accept that A3 means Islandr's own ACLs and audit log are no longer trustworthy on the hub. We do not accept that A3 should hand the attacker the keys to reconfigure the internal firewall.
Islandr enforces ACLs only on the hub VM, via nftables (ADR-0003). The hub VM holds no UCG credentials and makes no API calls into the trusted network.
Concretely:
AllowedIPs, routes, and any UCG-side ACLs are configured on the UCG itself, manually or via UCG-native tooling. Islandr never touches them.For v2, ACL push into UCG happens via a pull-mode agent running inside the trusted network:
sequenceDiagram
participant Hub as Hub VM (Islandr)
participant Agent as Internal Agent (trusted LAN)
participant UCG
Note over Hub,Agent: trust direction: trusted pulls from untrusted
Agent->>Hub: HTTPS GET /api/v1/acls?since=...
Hub-->>Agent: { acl revision, target rules }
Agent->>UCG: local API call (LAN only)
UCG-->>Agent: applied
Note over Hub: hub never initiates inward connections
The agent polls Islandr for ACL changes and applies them to UCG using a credential that lives only inside the trusted network. The hub VM never sees that credential and never initiates the connection. Compromising the hub gives an attacker the ability to publish malicious ACL change instructions, but the agent's policy decides whether to apply them — and the operator owns that policy.
Baseline: hub-only enforcement; pull-mode agent in v2 (the decision).
| Criterion (weight) | Hub-only + pull agent (baseline) | Push to UCG from hub | Hub-only forever (no UCG ever) | Bidirectional sync |
|---|---|---|---|---|
| Blast radius if hub compromised (5) | 0 | -1 | +1 | -1 |
| End-to-end ACL enforcement (4) | 0 | +1 | -1 | +1 |
| Operational complexity (3) | 0 | +1 | +1 | -1 |
| Time-to-v1 (3) | 0 | -1 | +1 | -1 |
| Audit-log integrity under hub compromise (3) | 0 | -1 | 0 | -1 |
| Multi-vendor extensibility (Mikrotik, OPNsense, …) (2) | 0 | -1 | 0 | 0 |
| Weighted total | 0 | −4 | +2 | −9 |
Notes:
The +2 for "Hub-only forever" is real — we just choose to accept slightly worse short-term completeness in exchange for a path to v2 that doesn't require a second ADR superseding this one.
Positive
Risks created
Accepted trade-offs