ACE Journal

Zero-Trust Network Access with SPIFFE and SPIRE

Abstract

SPIFFE (Secure Production Identity Framework for Everyone) and its reference implementation SPIRE address the identity layer that traditional VPN-based zero-trust architectures leave underspecified. Rather than asserting that a workload is trusted because it reached the network from a known IP range, SPIFFE assigns each workload a cryptographically verifiable identity called a SPIFFE Verifiable Identity Document (SVID), typically an X.509 certificate whose Subject Alternative Name encodes a URI of the form spiffe://<trust-domain>/<path>. SPIRE (the SPIFFE Runtime Environment) handles the issuance, rotation, and distribution of these identities automatically, integrating with platform attestation mechanisms to verify workload claims before issuing credentials - no secrets baked into container images, no shared API keys.

Attestation and the Node/Workload Agent Model

SPIRE’s architecture separates concerns between the SPIRE Server (which holds the signing key and policy) and SPIRE Agents running on each node. When a new workload starts, it contacts the local agent over a Unix domain socket. The agent performs workload attestation - on Kubernetes, it reads the pod’s service account token and cross-checks it with the Kubernetes API; on bare metal, it can use TPM-based node attestation. Only after attestation succeeds does the agent issue an SVID to the workload. The agent also handles rotation transparently, pushing new certificates before the current one expires, so workloads never need to implement their own certificate lifecycle logic. This rotation cadence - typically every hour in production, configurable down to minutes for high-security environments - limits the blast radius of a compromised credential to a narrow window.

mTLS and Authorization Policy

An SVID by itself is an identity credential, not an authorization decision. The access control layer is typically built on top using mTLS: both client and server present their SVIDs during the TLS handshake, and each side verifies that the other’s SPIFFE URI matches an expected pattern. Service meshes including Istio and Linkerd can consume SVIDs from SPIRE via the SPIFFE Workload API, replacing their built-in certificate authorities with SPIRE and gaining a unified identity plane across Kubernetes and non-Kubernetes workloads. For teams not running a service mesh, libraries like go-spiffe and java-spiffe provide workload API clients that fetch and rotate SVIDs, feeding them into standard TLS configurations. Authorization rules - “payment-service may call order-service, not inventory-service” - live in the mesh’s AuthorizationPolicy or in a dedicated policy engine like OPA, evaluated against the SPIFFE URI from the presented certificate.

Federation Across Trust Domains

SPIFFE’s trust domain model becomes particularly useful when an organization needs to authorize workloads across different clusters, clouds, or organizational boundaries without centralizing identity issuance. SPIRE supports federation: two SPIRE deployments exchange trust bundle endpoints over HTTPS, allowing each to verify SVIDs issued by the other without merging their certificate authorities. A workload in trust-domain A can present its SVID to a service in trust-domain B, and the B-side agent verifies the certificate against the federated bundle. This is the mechanism enabling controlled cross-account service calls in multi-cloud deployments without static credentials or VPN tunnels, and it is more operationally tractable than the certificate-pinning approaches it replaces.