STAGE 3 Enterprise Security Posture

Full Zero Trust

Never trust.
Always verify.
At every hop.

Stages 1 and 2 build a strong outer boundary. Stage 3 eliminates the boundary concept entirely — identity is verified continuously at every service, every request, every second. No implicit trust anywhere.

Builds On Stages 1 + 2
Key Tech SPIFFE / SPIRE
Identity Scope Every workload
Cert Lifecycle Zero-touch
Scroll Down

The Core Principle

No network is safe. No perimeter is enough.

Stages 1 and 2 create a perimeter and add identity to connections. Zero trust goes further — it assumes the perimeter has already been breached, and verifies every single request independently, regardless of where it originated.

Assume Breach

Design as if every network segment is already compromised. No location — internal or external — is implicitly trusted. Verify always.

Continuous Verify

Authentication is not a one-time gate at connection. Every request carries identity, and every service validates it — at every hop, every time.

Least Privilege

Every workload is granted the minimum permissions needed for its function — scoped by identity, time, and context. No standing access.

Workload Identity

Every running process — container, function, pod — has a cryptographic identity automatically issued at startup and rotated continuously.

The question is no longer "is this traffic coming from inside the network?" It is "can this specific workload, right now, prove it is authorised to make this specific request?"

entityOS Security Framework — Stage 3

SPIFFE & SPIRE

The standard and its runtime.

SPIFFE is the open standard for workload identity. SPIRE is its CNCF-graduated reference implementation. Together they automate the full certificate lifecycle for every running workload — no human involvement required.

SPIFFE — The Standard

Secure Production Identity Framework for Everyone

  • Defines the SVID — a short-lived X.509 cert or JWT that names a workload
  • Uses a URI format: spiffe://domain/service/payments
  • Specifies the Workload API — a local socket workloads call to get their cert
  • Vendor-neutral — any SPIFFE-compatible runtime can issue SVIDs
The specification — defines what workload identity looks like
SPIRE — The Runtime

SPIFFE Runtime Environment

  • SPIRE Server — the CA and policy engine, knows which workloads exist
  • SPIRE Agent — runs on every node, attests workloads using kernel-level proof
  • Attestation uses: PID, UID, Kubernetes labels, AWS instance metadata
  • Issues SVIDs automatically — rotated every 1–24 hours, zero-touch
CNCF-graduated — production-ready, widely deployed at scale
HOW IT WORKS 01

Node Attestation

When a container starts, the SPIRE Agent on its node contacts the SPIRE Server. The server attests the node using cloud provider metadata (AWS Instance Identity Document, GCP attestation, etc.).

# SPIRE Server — node attestor config NodeAttestor "aws_iid" { plugin_data { access_key_id = "..." secret_access_key = "..." } } # Proves: this node is a legitimate AWS EC2 instance
HOW IT WORKS 02

Workload Attestation

The SPIRE Agent then attests the workload itself — matching it against registration entries using kernel-level signals: process PID, Kubernetes pod labels, Docker container IDs, or Unix socket UIDs.

# SPIRE — workload registration entry spire-server entry create \ -spiffeID spiffe://entityos.io/payments \ -parentID spiffe://entityos.io/node/prod-1 \ -selector k8s:ns:payments \ -selector k8s:sa:payments-sa \ -ttl 3600
HOW IT WORKS 03

SVID Issued & Rotated

Once attested, the workload receives a SPIFFE Verifiable Identity Document — a short-lived X.509 cert with its SPIFFE ID in the SAN. The agent rotates it automatically before expiry. The workload never manages its own cert.

# Go — fetch SVID via Workload API client, _ := workloadapi.New(ctx, workloadapi.WithAddr("unix:///tmp/spire-agent/public/api.sock")) svid, _ := client.FetchX509SVID(ctx) # svid.ID = spiffe://entityos.io/payments # svid.Certificates[0].NotAfter = +1h # Rotated automatically — no human touch

Full Stack Components

What a complete Zero Trust deployment looks like.

Zero trust is not a single product — it is an architecture assembled from several components, each providing a distinct layer of the identity and authorisation stack.

SPIRE

Issues SPIFFE SVIDs to every workload. The identity authority for the entire service mesh.

Service Mesh

Istio, Linkerd, or Envoy enforces mTLS between every service using SPIFFE SVIDs automatically.

Policy Engine

OPA or OPAL evaluates fine-grained authorisation — what a verified identity is permitted to do.

Observability

Every request carries verified identity. Logs, traces, and metrics are tied to real workload identities — not anonymous IPs.

ZT-01 Identity-Aware Proxy Every inbound request is intercepted. The proxy verifies the caller's SVID and the request's authorisation policy before forwarding — no unauthenticated traffic reaches your application code. Ingress
ZT-02 Short-Lived Credentials SVIDs expire in minutes to hours. There are no long-lived secrets to rotate, leak, or steal. Compromise of one short-lived credential has a bounded blast radius. Credentials
ZT-03 Workload Attestation Identity is earned through attestation — kernel-level proof that this process is what it claims to be, running where it claims, with the expected configuration. Attestation
ZT-04 Continuous Authorisation Authorisation is not a session cookie set at login. Each request is evaluated against policy: who is this identity, what are they requesting, is this allowed right now? Authorisation

Full Stack Matrix

All three stages combined.

How the complete Stage 1 + Stage 2 + Stage 3 stack handles the full range of enterprise security scenarios.

Scenario Stage 1 (IP) Stage 2 (mTLS) Stage 3 (ZT)
Public internet attacker ✓ Blocked ✓ No cert ✓ No SVID
Lateral movement (internal) ✗ Inside range ✓ No cert ✓ No SVID + policy
Compromised service ✗ No protection ✓ Revoke cert ✓ SVID expires in hours
Ephemeral containers / pods ✗ Dynamic IPs ⚠ Manual cert issue ✓ SVID issued at start
Multi-cloud workloads ✗ CIDR sprawl ⚠ Complex PKI ✓ SPIFFE ID is portable
Thousand-service mesh ✗ Unmanageable ⚠ Cert mgmt at scale ✓ Zero-touch rotation
Over-privileged service ✗ No control ✗ No control ✓ Least-privilege policy
Stolen credential reuse ✗ No protection ⚠ If cert leaked ✓ SVID expired in hours
Audit and compliance ⚠ IP logs only ✓ Cert identity in logs ✓ Full workload identity trail

Implementation

Deploy Stage 3 in seven steps.

01 Deploy SPIRE Server Install SPIRE Server in your cluster or as a managed service. Configure your upstream CA (AWS Private CA or your Stage 2 PKI). Define your trust domain — typically your organisation's domain (e.g., spiffe://entityos.io). Foundation
02 Deploy SPIRE Agents Run a SPIRE Agent as a DaemonSet on every node. Configure node attestors appropriate for your infrastructure: aws_iid for EC2, k8s_psat for Kubernetes, or gcp_iit for GCE. Agents attest nodes before issuing any workload SVIDs. Agents
03 Register workload entries Create a registration entry for every workload: its SPIFFE ID and the selectors (Kubernetes namespace, service account, labels) that identify it. This is your workload identity catalogue — maintain it in version control alongside your service definitions. Identity
04 Deploy service mesh Install Istio or Linkerd configured to use SPIRE as its CA. This enables automatic mTLS between all services using SPIFFE SVIDs — each sidecar proxy presents and validates SVIDs on behalf of its workload. No application code changes required. Mesh
05 Define authorisation policies Use OPA or Istio AuthorizationPolicy to define what each SPIFFE identity is permitted to do. Start permissive (log-only), measure real traffic, then tighten to least-privilege. Policies live in Git — changes are reviewed, not clicked. Policy
06 Enable identity-aware observability Configure distributed tracing and logging to propagate SPIFFE IDs through request headers. Every trace, log line, and metric is now attributed to a verified workload identity — not an anonymous IP or pod name. Observe
07 Run breach simulation exercises Regularly test your zero trust posture: simulate a compromised workload and verify that its blast radius is bounded by SVID expiry and policy. Verify that lateral movement attempts are blocked and logged. Zero trust is only real if it is tested. Validate

Best Practices

Rules that make Zero Trust real.

The most common failure mode is treating zero trust as a checkbox. These rules keep it a genuine security posture, not an architectural diagram on a slide.

Rule 01

Start with observation, not enforcement

Deploy in permissive mode first. Log all traffic with SPIFFE identity. Measure real access patterns before writing any deny policies. Premature enforcement breaks things and erodes trust in the programme.

Rule 02

Treat registration entries as code

SPIRE registration entries define your identity catalogue. Store them in Git, review changes in PRs, deploy via CI/CD. An unreviewed entry is an unreviewed access grant.

Rule 03

Use the shortest possible SVID TTL

A 1-hour SVID limits the window for credential misuse to 60 minutes. A 24-hour SVID is 24× more dangerous. Push for the shortest TTL your automation can reliably renew. Test rotation under load before going live.

Rule 04

One SPIFFE ID per service, per environment

Do not share SPIFFE IDs across services or environments. spiffe://entityos.io/prod/payments must be separate from spiffe://entityos.io/staging/payments. Shared identities defeat least-privilege policy.

Rule 05

Log every authorisation decision

Every allow and deny decision by your policy engine should be logged with: the caller's SPIFFE ID, the target, the action, the policy that matched, and the timestamp. This is your audit trail. Without it, compliance is theatre.

Rule 06

Never disable attestation for convenience

Under pressure to "just get it working", teams add wildcard selectors or disable attestation checks. This completely defeats workload identity. If attestation is blocking a deployment, fix the attestation — don't bypass it.

Common Mistakes to Avoid
Deploying zero trust without Stages 1 and 2

Zero trust does not replace network controls and mTLS — it extends them. Without IP boundaries and cert-based auth already working, zero trust has no foundation to build on.

Treating "zero trust" as a product you buy

No single vendor product delivers zero trust. It is an architecture that requires SPIRE (identity), a service mesh (enforcement), a policy engine (authorisation), and observability working together.

Writing overly permissive policies at launch

Starting with allow: * and planning to tighten later means it never gets tightened. Define real policies from day one, even if they are coarse-grained.

Not testing breach scenarios

If you have never simulated a compromised workload and verified the blast radius is bounded, you don't know if your zero trust posture works. Test it. Schedule it quarterly.

The Complete Stack

Three stages.
One security posture.

Each stage builds on the last. Together they form a layered defence where an attacker must defeat multiple independent controls — network, cryptographic identity, and continuous authorisation policy.

01 Complete

IP Allowlisting

Network boundary control. Deny all, allow known CIDRs. Fast to deploy, immediately effective.

Security Groups WAF IP Rules Private Endpoints
02 Complete

mTLS + X.509

Cryptographic identity for every connection. Both sides prove who they are before data flows.

AWS Private CA cert-manager ALB mTLS
03 Current Stage

Full Zero Trust

Automated workload identity, continuous authorisation, and observability at every hop.

SPIFFE / SPIRE Istio / Envoy OPA Policy
Stage 3 Principle

Zero trust means no implicit trust anywhere — not from inside the network, not from a service that connected successfully before. Every request is verified against workload identity and authorisation policy. Combined with Stages 1 and 2, an attacker must defeat three independent controls simultaneously: network boundary, cryptographic certificate, and authorisation policy.