| Component | Role | Technology Options | Scaling Strategy |
|---|---|---|---|
| Policy Engine (PE) | Makes access/deny decisions based on multiple signals | OPA/Rego, Azure AD Conditional Access, Google BeyondCorp | Stateless, horizontally scalable |
| Policy Administrator (PA) | Translates PE decisions into enforcement actions | SPIFFE/SPIRE, Istio Pilot, cloud IAM | Federated across regions |
| Policy Enforcement Point (PEP) | Executes access decisions at runtime | Envoy proxy, Istio sidecar, API gateway, identity-aware proxy | Per-workload sidecar or per-node ambient |
| Identity Provider (IdP) | Authenticates users and issues tokens | Entra ID, Okta, Google Workspace, Keycloak | Multi-region with failover |
| Device Trust Agent | Assesses endpoint health and compliance | Microsoft Intune, Google Endpoint Verification, CrowdStrike | Agent per device |
| SIEM/Analytics | Collects signals, detects anomalies | Microsoft Sentinel, Splunk, Google Chronicle, Elastic | Tiered retention |
| # | Pillar | Traditional | Initial | Advanced | Optimal |
|---|---|---|---|---|---|
| 1 | Identity | Passwords, limited MFA | MFA everywhere, centralized IdP | Risk-adaptive auth, FIDO2/phishing-resistant MFA | Continuous identity verification, just-in-time access |
| 2 | Devices | Managed devices only, basic AV | Device registration, health checks | Real-time compliance enforcement, auto-remediation | Continuous posture assessment, zero-standing access |
| 3 | Networks | Perimeter firewall, VPN | Basic segmentation, encrypted tunnels | Microsegmentation, encrypted east-west traffic | Software-defined perimeter, per-workload isolation |
| 4 | Applications | On-prem apps, VPN access | Identity-aware proxy for cloud apps | Per-app policies, API gateway with auth | Continuous app behavior analysis, runtime protection |
| 5 | Data | Classification labels, DLP at egress | Automated classification, encryption at rest | Dynamic access based on sensitivity, DRM | Real-time data-level access control, automated response |
| Principle | Description | Implementation |
|---|---|---|
| Verify explicitly | Authenticate and authorize using all available signals | MFA + device compliance + location + risk score |
| Least privilege access | JIT/JEA, risk-based adaptive policies | Conditional access, PIM, time-boxed admin |
| Assume breach | Minimize blast radius, segment access | Microsegmentation, end-to-end encryption, analytics |
START: What is your current security posture?
├── Perimeter-only (VPN + firewall)?
│ ├── YES → Phase 1: Deploy MFA everywhere + centralized identity (IdP)
│ └── NO ↓
├── MFA deployed but no microsegmentation?
│ ├── YES → Phase 2: Implement device trust + network segmentation
│ └── NO ↓
├── Running Kubernetes workloads?
│ ├── YES → Deploy Istio/Linkerd with STRICT mTLS + AuthorizationPolicy
│ └── NO ↓
├── Running traditional VMs/bare metal?
│ ├── YES → Deploy identity-aware proxy (oauth2-proxy) + host-based firewall
│ └── NO ↓
├── Need to protect legacy systems?
│ ├── YES → Isolate in restricted zone + auth proxy + enhanced monitoring
│ └── NO ↓
├── Multi-cloud environment?
│ ├── YES → SPIFFE/SPIRE for cross-cloud workload identity + Terraform
│ └── NO ↓
└── DEFAULT → Follow CISA maturity model: Identity → Devices → Networks → Apps → Data
Deploy centralized identity with MFA as the foundation of all access decisions. NIST SP 800-207 defines identity governance as the first deployment model. [src1]
# Configure Azure AD Conditional Access via CLI
az ad conditional-access policy create \
--display-name "Require MFA for all users" \
--conditions '{"applications":{"includeApplications":["All"]},"users":{"includeUsers":["All"]}}' \
--grant-controls '{"builtInControls":["mfa"],"operator":"OR"}' \
--state "enabled"
Verify: az ad conditional-access policy list --query "[].{name:displayName, state:state}" -o table → shows policy as "enabled"
Register all devices and enforce health checks before granting access. Non-compliant devices must be blocked or given limited access. [src2]
# Check device compliance (Microsoft Graph API)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://graph.microsoft.com/v1.0/deviceManagement/managedDevices?\$filter=complianceState eq 'noncompliant'" \
| jq '.value[] | {deviceName, complianceState, lastSyncDateTime}'
Verify: Non-compliant devices should be listed and blocked from sensitive resources.
Deploy Istio with STRICT mTLS to encrypt and authenticate all east-west traffic. [src5]
# Mesh-wide strict mTLS
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
name: default
namespace: istio-system
spec:
mtls:
mode: STRICT
Verify: istioctl analyze -n production → no configuration issues.
Replace VPN with identity-aware proxy that authenticates users before granting access to internal applications. [src4]
# oauth2-proxy deployment (Kubernetes)
apiVersion: apps/v1
kind: Deployment
metadata:
name: oauth2-proxy
spec:
template:
spec:
containers:
- name: oauth2-proxy
image: quay.io/oauth2-proxy/oauth2-proxy:v7.6.0
args:
- --provider=oidc
- --oidc-issuer-url=https://login.microsoftonline.com/TENANT/v2.0
- --upstream=http://internal-app:8080
- --cookie-secure=true
Verify: Access internal app URL → should redirect to IdP login page.
Define network policies as code to enforce least-privilege network access between tiers. [src6]
# AWS VPC microsegmentation
resource "aws_security_group" "api_tier" {
name_prefix = "zt-api-"
vpc_id = aws_vpc.main.id
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
security_groups = [aws_security_group.web_tier.id]
}
}
Verify: terraform plan → shows security group rules restricted to expected sources.
Define authorization policies centrally using OPA/Rego for consistent evaluation. [src6]
# Zero Trust authorization policy
package authz
import rego.v1
default allow := false
allow if {
input.identity.authenticated == true
input.device.compliant == true
input.identity.roles[_] == required_role
}
Verify: opa eval -d policy/ -i input.json 'data.authz.allow' → returns true only when all conditions are met.
# Input: Kubernetes cluster with Istio installed
# Output: Strict mTLS + deny-by-default + explicit allow rules
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
name: default
namespace: istio-system
spec:
mtls:
mode: STRICT
---
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: deny-all
namespace: production
spec: {}
---
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: allow-checkout
namespace: production
spec:
selector:
matchLabels:
app: payment-service
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/production/sa/checkout-service"]
to:
- operation:
methods: ["POST"]
paths: ["/api/v1/charge"]
# Input: SPIFFE trust bundle + peer certificate
# Output: Verified workload identity (SPIFFE ID)
from pyspiffe.spiffe_id.spiffe_id import SpiffeId # pyspiffe >= 0.7.0
from pyspiffe.workloadapi.default_workload_api_client import DefaultWorkloadApiClient
def verify_workload_identity(expected_id: str) -> bool:
client = DefaultWorkloadApiClient()
svid = client.fetch_x509_svid().svid
actual_id = str(svid.spiffe_id)
if actual_id != str(SpiffeId.parse(expected_id)):
raise PermissionError(f"Identity mismatch: {actual_id}")
return True
# Input: AWS VPC ID
# Output: Microsegmented security groups with least-privilege rules
resource "aws_security_group" "app" {
name_prefix = "zt-app-"
vpc_id = var.vpc_id
description = "Zero Trust: app tier - only accepts from LB"
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
security_groups = [aws_security_group.lb.id]
description = "Allow from load balancer only"
}
}
// Input: HTTP request with Bearer token + X-Device-ID header
// Output: Authorized request or 403 Forbidden
func (zt *ZeroTrustMiddleware) Verify(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
token, err := jwt.Parse(r.Header.Get("Authorization")[7:], zt.keyFunc)
if err != nil || !token.Valid {
http.Error(w, "unauthorized", http.StatusUnauthorized)
return
}
deviceID := r.Header.Get("X-Device-ID")
if !zt.DeviceChecker.IsCompliant(deviceID) {
http.Error(w, "device not compliant", http.StatusForbidden)
return
}
claims := token.Claims.(jwt.MapClaims)
ctx := context.WithValue(r.Context(), "user", claims["sub"])
next.ServeHTTP(w, r.WithContext(ctx))
})
}
# BAD -- VPN grants broad network access after authentication
# Once inside the VPN, lateral movement is unrestricted
User --> VPN --> [Full network access to all internal resources]
# GOOD -- Each resource requires independent auth + authorization
User --> IdP (MFA) --> Policy Engine --> PEP (per-app proxy) --> [Single resource]
# BAD -- single security group trusts all internal IPs
resource "aws_security_group" "internal" {
ingress {
from_port = 0
to_port = 65535
protocol = "tcp"
cidr_blocks = ["10.0.0.0/8"] # All internal IPs trusted
}
}
# GOOD -- each tier only communicates with adjacent tiers
resource "aws_security_group" "api_tier" {
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
security_groups = [aws_security_group.web_tier.id]
}
}
# BAD -- long-lived API key, no rotation, no identity
env:
- name: API_KEY
value: "sk-hardcoded-never-rotated-key-12345"
# GOOD -- Istio manages certs automatically (24h expiry, 12h rotation)
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
name: default
namespace: istio-system
spec:
mtls:
mode: STRICT
# BAD -- allows all authenticated traffic
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
spec:
rules:
- from:
- source:
principals: ["*"]
# GOOD -- specific source, method, and path restrictions
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
spec:
selector:
matchLabels:
app: payment-service
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/prod/sa/checkout"]
to:
- operation:
methods: ["POST"]
paths: ["/api/v1/charge"]
istioctl analyze to verify all workloads support mTLS. [src5]# Check Istio mTLS status
istioctl x authz check <pod-name> -n <namespace>
# Verify mTLS active between services
istioctl proxy-config secret <pod-name> -n <namespace> | head -20
# List PeerAuthentication policies
kubectl get peerauthentications --all-namespaces
# List AuthorizationPolicy enforcement
kubectl get authorizationpolicies --all-namespaces -o wide
# Verify SPIFFE workload identity
spire-agent api fetch x509 -socketPath /run/spire/sockets/agent.sock
# Test network segmentation (should fail if properly segmented)
kubectl exec -n web-tier web-pod -- curl -s -o /dev/null -w "%{http_code}" http://db-service.db-tier:5432
# Check AWS security group rules
aws ec2 describe-security-groups --group-ids $SG_ID \
--query 'SecurityGroups[].{Ingress:IpPermissions,Egress:IpPermissionsEgress}'
# Verify OPA policy decisions
opa eval -d policy/ -i request.json 'data.authz.allow'
# Check Azure Conditional Access policies
az ad conditional-access policy list --query "[].{name:displayName, state:state}" -o table
# Monitor Istio certificate expiry
istioctl proxy-config secret <pod> -o json | jq '.dynamicActiveSecrets[].secret'
| Standard/Framework | Version | Status | Key Feature |
|---|---|---|---|
| NIST SP 800-207 | 1.0 | Current (Aug 2020) | Core ZTA reference architecture, 3 deployment models |
| NIST SP 800-207A | 1.0 | Current (Aug 2023) | ZTA for cloud-native apps, multi-cloud extension |
| CISA ZTMM | v2.0 | Current (Apr 2023) | 5 pillars, 4 maturity stages |
| OMB M-22-09 | 1.0 | Active mandate | US federal ZTA mandate, Sep 2024 deadline |
| Istio | 1.24.x | Current | Ambient mesh (sidecar-less mTLS), STRICT mode |
| SPIFFE/SPIRE | 1.9.x | Current | Cross-platform workload identity, X.509 SVIDs |
| OPA | 0.68.x | Current | Rego v1 syntax, Wasm compilation |
| Google BeyondCorp | Enterprise | GA | Identity-Aware Proxy, Access Context Manager |
| Use When | Don't Use When | Use Instead |
|---|---|---|
| Multi-cloud or hybrid environment with distributed workloads | Single isolated application with no network connectivity | Standard application security controls |
| Remote/hybrid workforce accessing internal resources | Fully air-gapped network with no external access | Network segmentation + physical security |
| Compliance requirements mandate ZTA (NIST, CISA, OMB) | Small team (<10) with single SaaS app and SSO | SSO + MFA is sufficient |
| Post-breach remediation requiring reduced blast radius | Proof-of-concept with no sensitive data | Basic authentication only |
| Kubernetes/microservices with east-west traffic | Monolithic application with single database | Application-level auth + WAF |