An OpsAPI deployment has two very different audiences. Customers use the apps: they need those on the public internet, and OpsAPI signs them in. Staff run the platform through admin dashboards, and those dashboards are where a stolen password does the most damage. The pattern we recommend is simple to state: public apps stay public, and every admin surface is reachable only through a VPN or a zero-trust network access (ZTNA) broker, with OpsAPI’s own sign-in, emailed codes and roles still enforced inside.

Which surfaces count as admin

SurfaceWhy it mattersBehind the broker?
OpsAPI admin dashboardUsers, roles, workspaces, settingsYes
Edge proxy adminCan reroute any hostnameYes
Secrets vault UIEvery credential the platform usesYes
Grafana and PrometheusTraffic, user activity, sometimes personal dataYes
Kubernetes APIEverythingYes, plus short-lived credentials
Customer apps and the sign-in pageMust work from anywhereNo: public, behind the edge

Two doors

Public apps for customers and brokered access for staff to admin dashboardsCUSTOMER DOOR (PUBLIC)Customerany deviceEdge + public appshello-java, hello-phpOpsAPI sign-inpassword + code, or GoogleSTAFF DOOR (BROKERED)Staff devicemanaged, postureVPN / ZTNA brokerper-app policyAdmin dashboardsthen OpsAPI sign-in + MFA + roleAnyone elseno DNS answer, or refused at the edge
Customers and staff never share a path. An admin hostname either has no public DNS record or is refused at the edge for anyone not coming through the broker.

The same OpsAPI sign-in sits behind both doors. That’s deliberate: the broker proves the device and the network path, OpsAPI proves the person and their role. Neither replaces the other.

App segments, not a flat network

A classic full-tunnel VPN puts a laptop on the network, and then everything reachable from that network is reachable from the laptop. ZTNA products publish one application at a time to named groups instead. Examples of the approach include Zscaler Private Access (app segments and access policies), Cisco Secure Client with Duo device checks, Cloudflare Access, or a self-hosted WireGuard VPN with tight per-peer rules. We describe the pattern, not a product; check each vendor’s current documentation for its terms.

A connector inside the cluster dials out to the broker, so no inbound port is openedStaff devicebroker clienttunnelBroker (cloud)identity + devicechecks, app policyYOUR KUBERNETES CLUSTERConnectoroutbound onlydials outOpsAPI adminGrafanaVault UIClusterIP services, no public Ingress
The connector runs inside the cluster and opens the connection outwards, so the admin services keep ClusterIP addresses and no Ingress, and there's no inbound port to scan.
  • No public Ingress for admin apps. They stay ClusterIP services; the connector reaches them from inside.
  • Outbound only. The connector dials the broker; firewalls need no new inbound rule.
  • Per-app policy. “SRE on-call may reach Grafana and the Kubernetes API; support may reach the OpsAPI admin.” Nobody gets the whole network.
  • Device posture. Brokers can require a managed, patched, encrypted device before the tunnel opens.

Five layers in front of an admin dashboard

Five layers of control in front of an admin dashboardDevice + networkIs this a managed device on our private path?Access policyIs this person in a group allowed to reach this app?Application sign-inWho exactly is this, and did they pass MFA?AuthorisationWhat may they do in this workspace?RevocationCan we remove them in minutes?
Each layer answers a different question. Losing one doesn't open the dashboard.
LayerQuestionAnswered by
Device + networkManaged device on our private path?Broker client and device checks, or a VPN key per person
Access policyIn a group allowed to reach this app?Broker app segments mapped to workforce directory groups
Application sign-inWho is this, did they pass MFA?OpsAPI sign-in; platform admins always get an emailed code
AuthorisationWhat may they do here?OpsAPI workspace roles (module.action permissions)
RevocationCan we remove them fast?Disable in the broker and deactivate the OpsAPI user

Workforce identity and customer identity are different

The broker normally trusts the company’s workforce directory: the people employed to run the platform. OpsAPI holds the people who use the apps, plus the staff accounts inside each workspace. Keep the two separate in your head and in your tooling. We don’t wire OpsAPI up as the identity source for a ZTNA product, and OpsAPI isn’t a SAML or OpenID Connect provider, so most brokers couldn’t use it directly anyway.

Logging that names a person

Behind a single VPN exit address, the edge log shows the same IP for every member of staff. Per-person audit comes from two places that do know who someone is: the broker’s access log (who reached which app, from which device) and OpsAPI’s auth_events and activity tables (who signed in, what they changed). Ship both to the same place and keep the clocks in sync.

Offboarding is two actions

  1. Remove the person from the broker (or delete their VPN peer). Admin dashboards become unreachable.
  2. Deactivate their OpsAPI account. Their tokens stop working at the next check and they can’t sign in to any app.

Do both, and test it: a leaver’s browser should get no admin page at all, and their OpsAPI login should fail.

The public demo is the exception

dashboard.demo.opsapi.org is on the public internet on purpose, so anyone can look around. It still needs a sign-in, and the published demo account is read-only in its own showcase workspace of fictional users: every change is refused, and the account is reset every 30 minutes. Real people who sign in to the demo apps live in a different workspace the demo account can’t see. Don’t copy this setup to production.

Rollout checklist

  1. List every admin surface (the table above is a start) and remove public DNS records or edge rules for each.
  2. Publish each one through the broker as its own app, with a group-based policy.
  3. Keep OpsAPI MFA on for every workspace that has staff accounts.
  4. From an unmanaged device off the broker, confirm every admin hostname fails before it reaches a login page.
  5. Run an offboarding drill with a test account: broker removal plus OpsAPI deactivation, then check both paths fail.