Zero-Trust Network Access
Our VPN gave every authenticated user access to the entire 10.0.0.0/8 network — production databases, staging environments, and internal wiki included. A compromised laptop credential meant lateral movement everywhere. Moving to ZTNA replaced the flat network with per-application policies: engineers reach staging, on-call reaches production, finance reaches the ERP — each gated by identity, device posture, and MFA.
Zero trust principles
Traditional security: "trust inside the perimeter, verify at the gate."
Zero trust: "never trust, always verify" — for every request, regardless of origin.
| Principle | Implementation |
|---|---|
| Verify explicitly | Authenticate and authorize every access request |
| Least privilege | Grant minimum access needed for the task |
| Assume breach | Micro-segment, monitor, limit blast radius |
ZTNA architecture
[User Device] ──> [ZTNA Client/Agent]
|
[Identity Provider]
(Okta, Azure AD)
|
[Policy Engine]
(access decision)
|
[ZTNA Connector/Proxy]
/ \
[Internal App A] [Internal App B]
Components:
- Identity Provider (IdP) — authenticates users via SSO/MFA
- Policy Engine — evaluates identity, device, context against rules
- ZTNA Connector — lightweight agent near internal apps, no inbound ports
- Client — device agent or browser-based access portal
Policy-based access
Define policies per application:
policies:
- name: engineering-staging
application: staging-api.internal
allow:
groups: [engineering, qa]
device_posture:
os_version: ">= 13.0"
disk_encrypted: true
managed: true
mfa: required
time: business_hours
- name: production-oncall
application: prod-api.internal
allow:
groups: [oncall, sre]
device_posture:
managed: true
certificate: company-device
mfa: required
approval: manager
session:
max_duration: 4h
record: true
Access decisions combine multiple signals — not just username and password.
Device posture checks
Evaluate before granting access:
{
"device_id": "abc-123",
"platform": "macOS",
"os_version": "14.5",
"disk_encrypted": true,
"firewall_enabled": true,
"antivirus_running": true,
"jailbroken": false,
"managed": true,
"last_seen": "2026-05-29T10:00:00Z"
}
| Check | Blocks when |
|---|---|
| OS version | Below minimum patched version |
| Disk encryption | FileVault/BitLocker disabled |
| Managed device | Not enrolled in MDM |
| Certificate | Company device cert missing |
| Jailbreak/root | Device integrity compromised |
Micro-segmentation
Replace flat network zones with per-app isolation:
Traditional:
VPN → 10.0.0.0/8 → everything
Zero Trust:
User A → Policy → App 1 only
User A → Policy → App 2 (denied)
User B → Policy → App 2 only
Each application runs behind its own ZTNA connector. No shared network segment between apps.
Implementation steps
- Inventory applications — catalog internal services and current access patterns
- Deploy IdP integration — SSO with MFA for all users
- Install ZTNA connectors — one per application or application group
- Define policies — map user groups to applications with conditions
- Enable device posture — require managed devices for sensitive apps
- Pilot with one team — validate access before broad rollout
- Decommission VPN — migrate remaining users, remove network-level access
ZTNA vs. VPN comparison
| Aspect | VPN | ZTNA |
|---|---|---|
| Access scope | Entire network | Specific applications |
| Authentication | Once at connect | Per session, continuous |
| Device checks | None | Posture evaluation |
| Lateral movement | Possible after connect | Blocked by segmentation |
| Inbound ports | VPN gateway exposed | Outbound-only connectors |
| Visibility | Limited | Per-session logging |
| User experience | Full network tunnel | Direct app access |
Monitoring and audit
Log every access decision:
{
"timestamp": "2026-05-29T14:30:00Z",
"user": "[email protected]",
"application": "prod-api.internal",
"decision": "allow",
"factors": {
"identity": "verified",
"mfa": "passed",
"device_posture": "compliant",
"location": "US-CA"
},
"session_id": "sess_xyz",
"duration": "2h15m"
}
Alert on:
- Access denied spikes (credential stuffing)
- Non-compliant device access attempts
- After-hours production access
- Policy changes
Common ZTNA platforms
| Platform | Model |
|---|---|
| Cloudflare Access | Cloud proxy, browser + agent |
| Zscaler Private Access | Cloud-native ZTNA |
| Tailscale | WireGuard mesh, identity-based |
| Google BeyondCorp | Identity-aware proxy |
| Palo Alto Prisma | SASE with ZTNA |
Evaluate based on existing IdP integration, application types (HTTP, SSH, RDP), and deployment model (cloud vs. self-hosted).
Legacy application access
Not every app supports modern ZTNA connectors. For SSH, RDP, and proprietary protocols, use ZTNA client agents that proxy non-HTTP traffic. Migrate HTTP apps first; keep VPN segments for legacy until connectors are available.
Break-glass access
Define emergency access procedures for when IdP or ZTNA platform is down. Break-glass accounts should be heavily audited, time-limited, and require multi-person approval. Test break-glass quarterly.
Identity-aware proxy
BeyondCorp model: every request authenticated and authorized regardless of network location. IAP or Cloudflare Access in front of internal tools replaces VPN IP trust.
Device posture signals
Require managed device certificate or EDR healthy status for sensitive admin access. Compromised laptop on corporate Wi-Fi gets same policy as coffee shop.
Micro-segmentation
Service mesh mTLS with SPIFFE IDs—service A talks to service B only if policy allows, not because they share a VPC CIDR.
Zero Trust Network Access: operational depth
Zero trust removes implied safety from corporate IP ranges—identity and device posture replace VPN trust. Teams that skip instrumentation ship blind—baseline p75 latency and error rate on affected routes one week before change and compare seven days after.
Integration boundaries deserve contract tests with golden fixtures sampled from production traffic anonymized. Synthetic empty payloads pass CI while production fails on nullable fields you never modeled.
Security review asks three questions: what untrusted input enters, what secrets could leak in logs, and what happens when upstream is slow or malicious. Answers belong in the PR, not a post-launch wiki page.
Rollout prefers feature flags or canary deploys when behavior touches authentication, payments, or PII. Rollback command documented in runbook header—not discovered during incident via git archaeology.
On-call dashboards slice metrics by region and device class. Global averages hide mobile regressions until App Store reviews mention slowness—field data honesty beats demo Lighthouse scores.
Edge cases in zero trust network access
Treat zero trust network access as a product capability with an owner, a dashboard, and a rollback plan. Define the user-visible success metric before debating tools.
Delivery
Ship behind a flag when blast radius is high. Prefer managed services for undifferentiated heavy lifting. Document the escape hatch for teams that cannot adopt zero trust network access yet — and review escape hatches quarterly.
Operability
Alerts should page on symptoms users feel, not on every internal retry. Link runbooks from alerts. After incidents involving zero trust network access, add one test or one alert that would have shortened detection.
Knowledge
Keep a short FAQ in frontmatter synchronized with reality. Outdated answers are worse than none. Point to primary sources (RFCs, vendor docs) in Resources rather than secondary blog summaries when behavior is subtle.
Validation scenarios for zero trust network access
Before calling zero trust network access done, exercise these scenarios in a staging environment that mirrors production identity, data volume, and failure injection:
- Happy path with production-like payload sizes.
- Auth failure — expired token, missing scope, revoked session.
- Dependency down — timeout the primary collaborator; confirm degraded mode or clear error.
- Replay / duplicate — submit the same event or request twice; confirm idempotency.
- Rollback — disable the flag or revert the deploy; confirm state converges.
Capture traces for each scenario and store them next to the runbook for zero trust network access.
Ownership and interfaces
Name the producing and consuming teams for zero trust network access. Publish the API/event contract with versioning rules. If you need a breaking change, run dual-write or dual-read long enough for consumers to migrate. Silent breakages erode trust faster than slow features.
Resources
- NIST SP 800-207: Zero Trust Architecture
- Google BeyondCorp papers
- Cloudflare Zero Trust docs
- CISA Zero Trust Maturity Model
- Gartner ZTNA market guide
Extended guidance (1) for Zero Trust Network Access
Operators owning zero trust network access should run a pre-mortem before launch: dependency unavailable, duplicate events, certificate expiry, regional failover. Each scenario needs detectable metrics, a runbook step, and a tested rollback. Game days beat postmortems for building muscle memory.
Contract tests at boundaries use anonymized production samples—nullable fields and unicode edge cases break synthetic fixtures. Security review documents untrusted inputs and log redaction rules in the PR description so auditors and on-call engineers inherit context without archaeology.
Performance work ties to field data on mid-tier mobile hardware, not desktop lab profiles. Slice dashboards by route, deploy version, and region before declaring victory on global averages.
Frequently asked questions
How does ZTNA differ from a corporate VPN?
Traditional VPN grants network-layer access to a broad subnet once authenticated—attackers who compromise a VPN credential can scan internal services. ZTNA publishes individual applications or resources per session, validates identity and device posture continuously, and denies lateral movement by default. Users reach specific apps, not the entire LAN.
What is device posture assessment?
Before granting access, the ZTNA agent or device management integration checks OS patch level, disk encryption, jailbreak status, and endpoint protection running. Non-compliant devices receive limited access or remediation prompts. Posture checks reduce risk from personal laptops with outdated antivirus joining corporate resources.
Can ZTNA work with legacy applications?
Yes via connectors or agents that proxy TCP/HTTP to apps without modern SSO. Legacy RDP or admin consoles sit behind ZTNA brokers publishing per-app tunnels rather than flat network access. Migration often runs VPN and ZTNA in parallel until all critical apps publish through the broker.
Hiring a senior Android / Flutter engineer?
I architect and ship production mobile software — Kotlin, Jetpack Compose, Flutter — for robotics, EV infrastructure, fintech, and real-time systems. Open to remote roles in Europe and the US.
Get in touch →