Zero-Trust Network Access

Engineering
Share on LinkedIn Share on X Share on Reddit Share on HN Share on Bluesky

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:

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

  1. Inventory applications — catalog internal services and current access patterns
  2. Deploy IdP integration — SSO with MFA for all users
  3. Install ZTNA connectors — one per application or application group
  4. Define policies — map user groups to applications with conditions
  5. Enable device posture — require managed devices for sensitive apps
  6. Pilot with one team — validate access before broad rollout
  7. 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:

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:

  1. Happy path with production-like payload sizes.
  2. Auth failure — expired token, missing scope, revoked session.
  3. Dependency down — timeout the primary collaborator; confirm degraded mode or clear error.
  4. Replay / duplicate — submit the same event or request twice; confirm idempotency.
  5. 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

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 →