Skip to content
Mulga mulga

External Connection Inventory

Operator inventory of inbound listeners and outbound connections on Spinifex nodes

securitycompliancecmmcnetworkconnectionsboundary

Overview

Audience: Operators deploying Spinifex into environments subject to CMMC Level 1, or any site that requires a documented inventory of system connections.

Scope: Network connections originated by or terminated at the Spinifex nodes — the Linux hosts running spinifex-daemon, spinifex-awsgw, spinifex-nats, spinifex-predastore, spinifex-viperblock, spinifex-vpcd, spinifex-ui, and the OVN control plane. Guest VM traffic is the workload owner's responsibility and out of scope.

Boundary definition. For the purposes of this document:

  • External means outside the Spinifex cluster's trusted network perimeter — the public internet, the operator's corporate network, tenant users of the AWS API, and guest VMs.
  • Internal means between Spinifex nodes inside the cluster subnet(s) defined in spinifex.toml.

AC.L1-3.1.20 applies specifically to external connections. Internal cluster connections are documented here as well so operators can build an accurate firewall policy.

CMMC Practices Covered

This guide addresses AC.L1-3.1.20. The related boundary-protection practice SC.L1-3.13.1 is covered by OVN ACL and security-group enforcement in vpcd and is documented separately.

PracticeTitleObjective
AC.L1-3.1.20External Connections[a] Connections to external systems are identified. [b] The use of external systems is identified. [c] Connections to external systems are verified. [d] The use of external systems is verified. [e] Connections to external systems are controlled/limited. [f] The use of external systems is controlled/limited.

Approach

Spinifex has a small, enumerable set of network surfaces:

  1. Inbound listeners — the TCP/UDP ports each node binds. These are the attack surface exposed to whoever can reach the node.
  2. Outbound connections — the destinations the node's services reach out to. Today this is a short list: peer Spinifex nodes, OS image mirrors, and install telemetry.
  3. Cross-node connections — inter-node control- and data-plane traffic inside the cluster subnet.

The inventory in §1§2 satisfies objectives [a]/[b]. The Auth / Verification columns throughout satisfy [c]/[d]. §4 and §5 satisfy [e]/[f]. The default install meets [c]–[f] for every listed connection; the operator's remaining work is to record the inventory in the system security plan, apply host/network firewall rules per §4, and audit §5 on a recurring schedule.

1. Inbound Listeners

"Scope" classifies intended reach:

  • External — reachable by tenant/operator networks. Authenticated and TLS-protected.
  • Cluster — reachable only from peer Spinifex nodes. Operator must restrict via host or network firewall.
  • Localhost — bound to 127.0.0.1; not reachable off-node.
PortServiceProtocolScopePurposeAuth / Verification
9999spinifex-awsgwHTTPSExternalAWS-compatible API (EC2, S3, ELBv2, IAM) — customer endpointAWS SigV4 + TLS (cluster CA)
3000spinifex-uiHTTPSExternalOperator web dashboardSession cookie + TLS
22OpenSSHSSHExternalOperator administrationKey-based auth (operator-managed)
4432Formation serverHTTPSExternal (bootstrap only)Cluster join coordination; active only while a join token is valid. See *Formation port lifecycle* below.Short-lived bearer token + TLS¹
4222spinifex-nats (client)NATS + TLSClusterInternal service bus for EC2/EBS/VPC/S3 handlersToken + mutual TLS (cluster CA)
4248spinifex-nats (cluster)NATS + TLSClusterInter-node NATS federationToken + mutual TLS (cluster CA)
8443spinifex-predastoreHTTPSClusterS3-compatible object storage (AMIs, snapshots, user objects)AWS SigV4 + TLS
6660–6662predastore (Raft)TCPClusterMetadata consensus (3 nodes)Cluster network only
9991–9993predastore (data shards)TCPClusterErasure-coded data shard transportCluster network only
6641OVN Northbound DBOVSDB/TCPClusterLogical network topology consumed by vpcdCluster network only; TLS planned
6642OVN Southbound DBOVSDB/TCPClusterChassis / port / MAC binding stateCluster network only; TLS planned
8222spinifex-nats (monitoring)HTTPLocalhostvarz/subsz metrics consumed by the daemonLoopback only
socket / dynamic TCPnbdkit (Viperblock)NBDHost-local / clusterBlock device transport for guest EBS volumesUnix socket by default; TCP only in remote/DPU mode

¹ Formation port lifecycle. 4432 opens during spx admin init / spx admin join while a bootstrap token is outstanding and closes once the cluster is formed (token TTL default 30 min, --token-ttl). The server presents an ephemeral self-signed cert that pre-dates trust bootstrap, so the joining node dials with InsecureSkipVerify — the only production dial that does. Authenticity rests on the operator supplying the leader address out-of-band plus possession of the bearer token. Document in the security plan so reviewers do not flag 4432 as a persistent open port.

Development-only listeners. When dev_networking=true, QEMU opens arbitrary host TCP ports for SSH port-forwarding into guest VMs. Production installs (the /etc/spinifex layout) do not enable this; it must not appear on compliance nodes.

2. Outbound Connections

Spinifex nodes initiate a small, fixed set of outbound connections.

To external destinations:

DestinationPurposeProtocolVerification
https://cdimage.debian.org/cdimage/cloud/bookworm/latestDebian 12 cloud image downloadHTTPSTLS + checksum verification
https://cloud-images.ubuntu.com/noble/currentUbuntu 24.04 LTS cloud image downloadHTTPSTLS + checksum verification
https://d2yp8ipz5jfqcw.cloudfront.netAlpine image for managed HAProxy load-balancerHTTPSTLS + checksum verification
https://install.mulgadc.com/installOne-shot install telemetry POST on spx admin init / join.HTTPSTLS

To peer nodes (cluster-internal): NATS federation (4248), Predastore S3 (8443), OVN NB/SB (6641/6642) — see §3 for encryption and verification of each. The daemon also probes local Predastore Raft status at <bind IP>:6660/status (TLS, cluster CA) and local NATS monitoring at 127.0.0.1:8222/varz (loopback HTTP).

Update checks and metadata. Spinifex does not check for updates and does not consume a cloud metadata service (169.254.169.254 is served *by* the cluster to guest VMs). Node software updates come from the operator's OS package channel. The install-telemetry endpoint above is the only vendor-operated destination contacted by a node; closed-egress deployments should disable it and record the opt-out in the security plan.

Air-gapped deployments. The three image URLs are the only destinations needed for the standard image catalogue. Mirror them locally and use spx admin images import --file with pre-staged files. Telemetry must also be disabled. See Air-Gapped Install.

3. Cross-Node (Internal) Connections

Control-plane and data-plane traffic between Spinifex nodes, for completeness and firewall planning:

ConnectionPort(s)Encryption / AuthNotes
NATS cluster routes4248Mutual TLS + cluster tokenFull mesh between NATS servers
Predastore S38443TLS + AWS SigV4Cross-node object reads/writes
Predastore Raft6660–6662Cluster network onlyMetadata consensus
Predastore shards9991–9993Cluster network onlyErasure-coded data shards
OVN NB/SB6641 / 6642Cluster network only (TLS planned)Network control plane
OVN tunnels (Geneve)UDP 6081NoneTenant traffic overlay between chassis, inside the cluster subnet

Nodes must sit on a network segment that is not routed to tenant/guest VMs or to the internet. Predastore Raft/shards and OVN DBs are cluster-internal and must not be reachable from anywhere else.

4. Limiting Controls

Default external surface is three listeners — 9999 (AWS API), 3000 (UI), 22 (SSH) — plus 4432 transiently during bootstrap. Every other listener is cluster-only and the operator must enforce this with a host firewall (nftables/iptables/firewalld) or an upstream network ACL. Minimal nftables reference:

# External: from anywhere
tcp dport { 22, 9999, 3000 } accept

# Cluster-only: replace 10.0.1.0/24 with your cluster CIDR
ip saddr 10.0.1.0/24 tcp dport { 4222, 4248, 8443, 6641, 6642, 6660-6662, 9991-9993 } accept
ip saddr 10.0.1.0/24 udp dport 6081 accept

# Default deny
tcp dport 0-65535 drop
udp dport 0-65535 drop

Port 4432 must be closed outside the bootstrap window; spx admin join opens it transiently. Outbound egress can be limited to the image-catalogue hostnames in §2 plus the operator's OS package repositories; on air-gapped nodes, block all outbound HTTPS and use spx admin images import --file.

5. Configuration Surface

Every listener and outbound destination is controlled by one of these files. Changes require a service restart.

FileKeysControls
/etc/spinifex/spinifex.tomlnodes.<node>.{awsgw,nats,predastore,daemon}.host, nodes.<node>.vpcd.ovn_{nb,sb}_addr, nodes.<node>.daemon.dev_networkingPer-service bind addresses/ports; dev-mode QEMU port forwarding.
/etc/spinifex/nats.conflisten, cluster.listen, cluster.routes, http, tls, cluster.authorizationNATS client/cluster/monitoring listeners, peer routes, TLS, cluster token.
/etc/spinifex/predastore.tomlhost, port, [[db]].port, [[nodes]].port, tls.*Predastore S3 listener, Raft ports, shard ports, TLS certs.
OVN packages (ovn-central, ovn-host)ovn-nb-db, ovn-sb-db (via ovs-vsctl set open_vswitch …)OVN DB bind addresses.
Spinifex UI serviceBuilt-in defaults: host = "0.0.0.0", port = 3000. No spinifex.toml block today.UI listener.
spx admin init / spx admin join--port, --token-ttl, --no-telemetry (or SPX_NO_TELEMETRY=1)Formation port, token TTL, telemetry opt-out.
utils/images.go AvailableImagesImage catalogue URLsOutbound HTTPS destinations for image downloads.

6. Operator Checklist

  • Inventory recorded in the system security plan — inbound (§1), outbound (§2), cross-node (§3) — matches what is observed on the node (ss -tlnp, ss -unlp).
  • Host firewall enforces the external/cluster/localhost split in §4: external surface limited to 9999, 3000, 22 (and 4432 only during bootstrap).
  • Cluster subnet is isolated from tenant guest VM networks and from the public internet.
  • Formation port 4432 is closed on nodes not actively running a bootstrap token.
  • Outbound HTTPS restricted to the §2 image-catalogue hosts, or replaced with air-gapped import.
  • Install telemetry (install.mulgadc.com) is either permitted and recorded in the security plan, or disabled via SPX_NO_TELEMETRY=1 / --no-telemetry.
  • OVN NB/SB (6641/6642) exposure limited to the cluster subnet pending the L2 TLS work.
  • SSH (22) configured to operator-managed keys only; password auth disabled in sshd_config.
  • Periodic review (at least annually, and after any topology change) confirms this inventory still matches the deployed configuration.