<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ztna on IAMDevBox</title><link>https://www.iamdevbox.com/tags/ztna/</link><description>Recent content in Ztna on IAMDevBox</description><image><title>IAMDevBox</title><url>https://www.iamdevbox.com/IAMDevBox.com.jpg</url><link>https://www.iamdevbox.com/IAMDevBox.com.jpg</link></image><generator>Hugo -- 0.146.0</generator><language>en-us</language><lastBuildDate>Tue, 23 Jun 2026 20:30:52 -0400</lastBuildDate><atom:link href="https://www.iamdevbox.com/tags/ztna/index.xml" rel="self" type="application/rss+xml"/><item><title>ZTNA vs VPN: Why Zero Trust Network Access Wins for Modern Enterprises</title><link>https://www.iamdevbox.com/posts/ztna-vs-vpn-zero-trust-network-access-complete-guide/</link><pubDate>Tue, 23 Jun 2026 20:30:00 +0000</pubDate><guid>https://www.iamdevbox.com/posts/ztna-vs-vpn-zero-trust-network-access-complete-guide/</guid><description>ZTNA vs VPN: Complete enterprise comparison covering identity-based access, lateral movement prevention, performance, and migration strategy. Includes provider-specific Keycloak, Okta, and Entra ID integration patterns.</description><content:encoded><![CDATA[<p>VPN was designed in 1996 for a world where corporate networks had a defined perimeter. Zero Trust Network Access (ZTNA) was designed for a world where the perimeter doesn&rsquo;t exist — where users work from anywhere, applications live in multiple clouds, and &ldquo;inside the network&rdquo; is no longer a meaningful security concept.</p>
<p>This guide explains the architectural difference, the identity verification model behind ZTNA, and how to migrate from legacy VPN to a modern ZTNA deployment.</p>
<h2 id="the-core-problem-vpns-trust-model">The Core Problem: VPN&rsquo;s Trust Model</h2>
<p>Traditional VPN authenticates once and grants network-level access. A user connects, and the client receives a private IP address on your corporate subnet. From that point, the VPN treats all traffic as trusted — the user can reach file servers, databases, internal APIs, and management interfaces beyond what their job requires.</p>
<p>This &ldquo;authenticate once, trust everything&rdquo; model is why ransomware spreads so effectively through corporate networks. The attacker compromises one endpoint, establishes a VPN session, and uses that implicit trust to move laterally.</p>
<p>ZTNA inverts this model: <strong>never trust, always verify, at the application layer</strong>.</p>
<h2 id="ztna-architecture">ZTNA Architecture</h2>
<h3 id="how-ztna-works">How ZTNA Works</h3>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 496 249"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>U</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>[</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='216' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='224' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='240' y='4' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='240' y='84' fill='currentColor' style='font-size:1em'>[</text>
<text text-anchor='middle' x='240' y='100' fill='currentColor' style='font-size:1em'>[</text>
<text text-anchor='middle' x='240' y='116' fill='currentColor' style='font-size:1em'>[</text>
<text text-anchor='middle' x='240' y='148' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='248' y='4' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='248' y='84' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='248' y='100' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='248' y='116' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='248' y='148' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='248' y='228' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='256' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='256' y='84' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='256' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='256' y='116' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='256' y='148' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='256' y='228' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='264' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='264' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='264' y='100' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='264' y='116' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='264' y='148' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='264' y='228' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='272' y='4' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='272' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='272' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='272' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='272' y='148' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='272' y='228' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='280' y='4' fill='currentColor' style='font-size:1em'>]</text>
<text text-anchor='middle' x='280' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='280' y='100' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='280' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='280' y='148' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='280' y='228' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='288' y='36' fill='currentColor' style='font-size:1em'>Z</text>
<text text-anchor='middle' x='288' y='52' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='288' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='288' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='288' y='116' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='288' y='180' fill='currentColor' style='font-size:1em'>Z</text>
<text text-anchor='middle' x='288' y='196' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='288' y='228' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='296' y='4' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='296' y='36' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='296' y='52' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='296' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='296' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='296' y='148' fill='currentColor' style='font-size:1em'>G</text>
<text text-anchor='middle' x='296' y='180' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='296' y='196' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='296' y='228' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='304' y='36' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='304' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='304' y='84' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='304' y='100' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='304' y='148' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='304' y='180' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='304' y='196' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='312' y='4' fill='currentColor' style='font-size:1em'>Z</text>
<text text-anchor='middle' x='312' y='36' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='312' y='52' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='312' y='100' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='312' y='116' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='312' y='148' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='312' y='180' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='312' y='228' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='320' y='4' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='320' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='320' y='84' fill='currentColor' style='font-size:1em'>V</text>
<text text-anchor='middle' x='320' y='100' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='320' y='116' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='320' y='148' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='320' y='196' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='320' y='228' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='328' y='4' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='328' y='36' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='328' y='52' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='328' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='328' y='100' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='328' y='116' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='328' y='148' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='328' y='180' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='328' y='196' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='328' y='228' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='336' y='4' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='336' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='336' y='52' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='336' y='84' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='336' y='100' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='336' y='116' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='336' y='148' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='336' y='180' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='336' y='196' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='336' y='228' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='344' y='20' fill='currentColor' style='font-size:1em'>↓</text>
<text text-anchor='middle' x='344' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='344' y='68' fill='currentColor' style='font-size:1em'>↓</text>
<text text-anchor='middle' x='344' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='344' y='116' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='344' y='132' fill='currentColor' style='font-size:1em'>↓</text>
<text text-anchor='middle' x='344' y='148' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='344' y='164' fill='currentColor' style='font-size:1em'>↓</text>
<text text-anchor='middle' x='344' y='180' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='344' y='196' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='344' y='212' fill='currentColor' style='font-size:1em'>↓</text>
<text text-anchor='middle' x='344' y='228' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='352' y='4' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='352' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='352' y='52' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='352' y='84' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='352' y='100' fill='currentColor' style='font-size:1em'>V</text>
<text text-anchor='middle' x='352' y='116' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='352' y='148' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='352' y='180' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='352' y='228' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='360' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='360' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='360' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='360' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='360' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='360' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='360' y='148' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='360' y='180' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='360' y='196' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='360' y='228' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='368' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='368' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='368' y='52' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='368' y='84' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='368' y='100' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='368' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='368' y='148' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='368' y='180' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='368' y='196' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='368' y='228' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='376' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='376' y='36' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='376' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='376' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='376' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='376' y='116' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='376' y='148' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='376' y='180' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='376' y='196' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='376' y='228' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='384' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='384' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='384' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='384' y='100' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='384' y='116' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='384' y='148' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='384' y='180' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='384' y='196' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='384' y='228' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='392' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='392' y='36' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='392' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='392' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='392' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='392' y='116' fill='currentColor' style='font-size:1em'>]</text>
<text text-anchor='middle' x='392' y='148' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='392' y='180' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='392' y='196' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='392' y='228' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='400' y='36' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='400' y='52' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='400' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='400' y='100' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='400' y='148' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='400' y='196' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='408' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='408' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='408' y='100' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='408' y='196' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='416' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='416' y='100' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='416' y='148' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='416' y='196' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='424' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='424' y='84' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='424' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='424' y='148' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='432' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='432' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='432' y='148' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='440' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='440' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='448' y='100' fill='currentColor' style='font-size:1em'>]</text>
<text text-anchor='middle' x='448' y='148' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='456' y='84' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='456' y='148' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='464' y='84' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='464' y='148' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='472' y='84' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='480' y='84' fill='currentColor' style='font-size:1em'>]</text>
</g>

    </svg>
  
</div>
<p>The ZTNA connector runs inside your network and maintains an outbound-only connection to the ZTNA cloud control plane. Your applications never need inbound firewall rules opened — the connector initiates the connection, not the user&rsquo;s device.</p>
<h3 id="identity-verification-model">Identity Verification Model</h3>
<p>ZTNA integrates directly with your Identity Provider (IdP) using OIDC or SAML. Every application access request triggers a fresh authorization check:</p>
<table>
  <thead>
      <tr>
          <th>Signal</th>
          <th>VPN</th>
          <th>ZTNA</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>User authentication</td>
          <td>Once at tunnel start</td>
          <td>Per-app connection + CAE</td>
      </tr>
      <tr>
          <td>Device trust</td>
          <td>IP address only</td>
          <td>MDM certificate + compliance check</td>
      </tr>
      <tr>
          <td>Application scope</td>
          <td>Entire subnet</td>
          <td>Specific app:port</td>
      </tr>
      <tr>
          <td>Context evaluation</td>
          <td>None</td>
          <td>Time, location, risk score</td>
      </tr>
      <tr>
          <td>Session revocation</td>
          <td>Manual disconnect</td>
          <td>Real-time (CAE)</td>
      </tr>
  </tbody>
</table>
<h3 id="keycloak-as-ztna-identity-broker">Keycloak as ZTNA Identity Broker</h3>
<p>Keycloak can serve as the OIDC identity broker for ZTNA solutions:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># Keycloak realm configuration for ZTNA</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Create a dedicated client for the ZTNA provider</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>POST /admin/realms/corporate/clients
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;clientId&#34;</span>: <span style="color:#e6db74">&#34;ztna-provider&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;protocol&#34;</span>: <span style="color:#e6db74">&#34;openid-connect&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;publicClient&#34;</span>: false,
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;redirectUris&#34;</span>: <span style="color:#f92672">[</span><span style="color:#e6db74">&#34;https://your-ztna-provider.com/callback&#34;</span><span style="color:#f92672">]</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;attributes&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;access.token.lifespan&#34;</span>: <span style="color:#e6db74">&#34;300&#34;</span>,  // <span style="color:#ae81ff">5</span> min - ZTNA re-verifies frequently
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;use.refresh.tokens&#34;</span>: <span style="color:#e6db74">&#34;true&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;pkce.code.challenge.method&#34;</span>: <span style="color:#e6db74">&#34;S256&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><p>Configure device posture claims using Keycloak&rsquo;s Protocol Mapper to pass device compliance status in the access token:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;name&#34;</span>: <span style="color:#e6db74">&#34;device-compliance&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;protocol&#34;</span>: <span style="color:#e6db74">&#34;openid-connect&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;protocolMapper&#34;</span>: <span style="color:#e6db74">&#34;oidc-hardcoded-claim-mapper&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;config&#34;</span>: {
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;claim.name&#34;</span>: <span style="color:#e6db74">&#34;device_compliant&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;claim.value&#34;</span>: <span style="color:#e6db74">&#34;true&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;id.token.claim&#34;</span>: <span style="color:#e6db74">&#34;false&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;access.token.claim&#34;</span>: <span style="color:#e6db74">&#34;true&#34;</span>
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>The ZTNA policy engine reads the <code>device_compliant</code> claim and blocks access from non-compliant devices at the network layer, before the application ever receives the request.</p>
<h2 id="ztna-vs-vpn-complete-comparison">ZTNA vs VPN: Complete Comparison</h2>
<h3 id="security-model">Security Model</h3>
<table>
  <thead>
      <tr>
          <th>Aspect</th>
          <th>VPN</th>
          <th>ZTNA</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Access scope</td>
          <td>Full network subnet</td>
          <td>Single application</td>
      </tr>
      <tr>
          <td>Lateral movement</td>
          <td>Possible — user can reach any accessible IP</td>
          <td>Impossible — no network adjacency</td>
      </tr>
      <tr>
          <td>Credential theft impact</td>
          <td>Full network compromise</td>
          <td>One app compromised</td>
      </tr>
      <tr>
          <td>Session re-evaluation</td>
          <td>Never (until disconnect)</td>
          <td>Continuous (CAE)</td>
      </tr>
      <tr>
          <td>Zero-day exploits</td>
          <td>VPN appliance is a public attack surface</td>
          <td>Control plane is SaaS, connector is outbound-only</td>
      </tr>
      <tr>
          <td>Unmanaged devices</td>
          <td>Usually blocked by IP/cert</td>
          <td>Clientless ZTNA enables browser-based access</td>
      </tr>
  </tbody>
</table>
<h3 id="performance-characteristics">Performance Characteristics</h3>
<p>VPN routes all traffic through a central gateway, causing backhauling — a user in Austin accessing Salesforce has traffic routed through the corporate data center in Dallas, then back to Salesforce&rsquo;s cloud, doubling latency.</p>
<p>ZTNA uses split tunneling by default:</p>
<ul>
<li><strong>SaaS apps</strong>: Direct to cloud, no backhauling</li>
<li><strong>Private apps</strong>: Routed via nearest ZTNA PoP → private connector</li>
<li><strong>Internet traffic</strong>: Direct, unrouted through ZTNA</li>
</ul>
<p>The result: most users see improved performance for SaaS applications immediately after switching.</p>
<h3 id="cost-comparison">Cost Comparison</h3>
<table>
  <thead>
      <tr>
          <th>Item</th>
          <th>VPN</th>
          <th>ZTNA</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Hardware</td>
          <td>VPN concentrators ($5K-$50K)</td>
          <td>None (SaaS)</td>
      </tr>
      <tr>
          <td>Licensing</td>
          <td>Per device or concurrent users</td>
          <td>Per user/month</td>
      </tr>
      <tr>
          <td>Bandwidth</td>
          <td>All traffic through corporate WAN</td>
          <td>Only private app traffic</td>
      </tr>
      <tr>
          <td>Operational</td>
          <td>VPN appliance patching, firmware updates</td>
          <td>Managed by vendor</td>
      </tr>
      <tr>
          <td>Incident response</td>
          <td>Broad blast radius investigations</td>
          <td>App-scoped forensics</td>
      </tr>
  </tbody>
</table>
<p>For enterprises with 500+ remote users, ZTNA typically reduces total cost by 30-60% when factoring in appliance hardware, bandwidth, and operational overhead.</p>
<h2 id="provider-comparison">Provider Comparison</h2>
<h3 id="cloudflare-access">Cloudflare Access</h3>
<p>Cloudflare Access is the ZTNA component of Cloudflare Zero Trust. Strong for:</p>
<ul>
<li>Web application access (HTTP/HTTPS)</li>
<li>SSH/RDP via browser-rendered clients</li>
<li>Tight integration with Cloudflare CDN (performance benefit)</li>
<li>Free tier for up to 50 users</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># Cloudflare Access — configure application with Keycloak IdP</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Via Cloudflare dashboard or Terraform:</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>resource <span style="color:#e6db74">&#34;cloudflare_access_application&#34;</span> <span style="color:#e6db74">&#34;private_app&#34;</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  zone_id          <span style="color:#f92672">=</span> var.zone_id
</span></span><span style="display:flex;"><span>  name             <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Internal Dashboard&#34;</span>
</span></span><span style="display:flex;"><span>  domain           <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;dashboard.corp.example.com&#34;</span>
</span></span><span style="display:flex;"><span>  session_duration <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;24h&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>resource <span style="color:#e6db74">&#34;cloudflare_access_policy&#34;</span> <span style="color:#e6db74">&#34;corp_users&#34;</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  application_id <span style="color:#f92672">=</span> cloudflare_access_application.private_app.id
</span></span><span style="display:flex;"><span>  name           <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Corp Users Only&#34;</span>
</span></span><span style="display:flex;"><span>  decision       <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;allow&#34;</span>
</span></span><span style="display:flex;"><span>  include <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    email_domain <span style="color:#f92672">=</span> <span style="color:#f92672">[</span><span style="color:#e6db74">&#34;corp.example.com&#34;</span><span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>  require <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Device posture via Cloudflare WARP client</span>
</span></span><span style="display:flex;"><span>    device_posture <span style="color:#f92672">=</span> <span style="color:#f92672">[</span>cloudflare_device_posture_rule.compliant.id<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h3 id="zscaler-private-access-zpa">Zscaler Private Access (ZPA)</h3>
<p>ZPA leads in enterprise deployments. Strong for:</p>
<ul>
<li>Large-scale deployments (100K+ users)</li>
<li>Complex segmentation policies</li>
<li>Integration with Okta and Entra ID</li>
<li>App Connectors behind firewall with no inbound rules</li>
</ul>
<h3 id="palo-alto-prisma-access">Palo Alto Prisma Access</h3>
<p>Prisma ZTNA + SASE. Strong for:</p>
<ul>
<li>Customers with existing Palo Alto Next-Gen Firewall</li>
<li>Unified security policy across ZTNA and web filtering</li>
<li>Advanced threat prevention inline with access</li>
</ul>
<h2 id="oauth-token-flow-in-ztna">OAuth Token Flow in ZTNA</h2>
<p>ZTNA relies on standard OAuth 2.0 flows for application access tokens. Understanding this flow helps diagnose access failures:</p>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 640 137"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'>2</text>
<text text-anchor='middle' x='0' y='36' fill='currentColor' style='font-size:1em'>3</text>
<text text-anchor='middle' x='0' y='52' fill='currentColor' style='font-size:1em'>4</text>
<text text-anchor='middle' x='0' y='68' fill='currentColor' style='font-size:1em'>5</text>
<text text-anchor='middle' x='0' y='84' fill='currentColor' style='font-size:1em'>6</text>
<text text-anchor='middle' x='0' y='100' fill='currentColor' style='font-size:1em'>7</text>
<text text-anchor='middle' x='0' y='116' fill='currentColor' style='font-size:1em'>8</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='8' y='20' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='8' y='36' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='8' y='52' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='8' y='68' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='8' y='84' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='8' y='100' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='8' y='116' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>U</text>
<text text-anchor='middle' x='24' y='20' fill='currentColor' style='font-size:1em'>Z</text>
<text text-anchor='middle' x='24' y='36' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='24' y='52' fill='currentColor' style='font-size:1em'>Z</text>
<text text-anchor='middle' x='24' y='68' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='24' y='84' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='24' y='100' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='24' y='116' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='32' y='20' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='32' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='32' y='52' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='32' y='68' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='32' y='84' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='32' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='32' y='116' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='40' y='20' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='40' y='36' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='40' y='52' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='40' y='68' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='40' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='40' y='116' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='48' y='20' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='48' y='52' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='48' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='48' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='48' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='48' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='56' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='56' y='68' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='56' y='84' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='56' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='56' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='64' y='20' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='64' y='36' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='64' y='52' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='64' y='68' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='64' y='84' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='64' y='100' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='64' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='72' y='20' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='72' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='72' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='72' y='84' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='72' y='100' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>q</text>
<text text-anchor='middle' x='80' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='80' y='36' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='80' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='80' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='80' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='80' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='80' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='88' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='88' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='88' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='88' y='68' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='88' y='84' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='88' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='88' y='116' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='96' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='96' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='96' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='96' y='68' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='96' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='96' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='96' y='116' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='104' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='104' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='104' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='104' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='104' y='84' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='104' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='112' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='112' y='52' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='112' y='68' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='112' y='84' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='112' y='100' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='112' y='116' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='120' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='120' y='36' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='120' y='100' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='128' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='128' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='128' y='52' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='128' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='128' y='84' fill='currentColor' style='font-size:1em'>Z</text>
<text text-anchor='middle' x='128' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='128' y='116' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='136' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='136' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='136' y='52' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='136' y='68' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='136' y='84' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='136' y='100' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='136' y='116' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='144' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='144' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='144' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='144' y='68' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='144' y='84' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='144' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='144' y='116' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='152' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='152' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='152' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='152' y='68' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='152' y='84' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='152' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='152' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='160' y='20' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='160' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='160' y='68' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='160' y='100' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='160' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='168' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='168' y='36' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='168' y='68' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='168' y='84' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='168' y='116' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='176' y='20' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='176' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='176' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='176' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='176' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='176' y='100' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='176' y='116' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='184' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='184' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='184' y='52' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='184' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='184' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='184' y='100' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='184' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='192' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='192' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='192' y='52' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='192' y='68' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='192' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='192' y='100' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='192' y='116' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='200' y='52' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='200' y='84' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='200' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='208' y='20' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='208' y='36' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='208' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='208' y='68' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='208' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='208' y='100' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='208' y='116' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='216' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='216' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='216' y='68' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='216' y='84' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='216' y='100' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='216' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='224' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='224' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='224' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='224' y='52' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='224' y='68' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='224' y='100' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='224' y='116' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='232' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='232' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='232' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='232' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='232' y='68' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='232' y='84' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='240' y='4' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='240' y='20' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='240' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='240' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='240' y='68' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='240' y='84' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='240' y='100' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='240' y='116' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='248' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='248' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='248' y='36' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='248' y='68' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='248' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='248' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='248' y='116' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='256' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='256' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='256' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='256' y='52' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='256' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='256' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='256' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='256' y='116' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='264' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='264' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='264' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='264' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='264' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='264' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='264' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='272' y='20' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='272' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='272' y='52' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='272' y='68' fill='currentColor' style='font-size:1em'>Z</text>
<text text-anchor='middle' x='272' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='272' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='280' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='280' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='280' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='280' y='68' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='280' y='84' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='280' y='100' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='280' y='116' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='288' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='288' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='288' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='288' y='68' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='288' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='288' y='100' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='288' y='116' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='296' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='296' y='36' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='296' y='52' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='296' y='68' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='296' y='84' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='296' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='296' y='116' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='304' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='304' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='304' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='304' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='304' y='100' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='304' y='116' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='312' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='312' y='36' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='312' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='312' y='68' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='312' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='312' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='320' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='320' y='68' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='320' y='84' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='320' y='100' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='328' y='20' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='328' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='328' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='328' y='68' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='328' y='84' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='328' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='328' y='116' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='336' y='20' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='336' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='336' y='52' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='336' y='68' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='336' y='116' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='344' y='20' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='344' y='36' fill='currentColor' style='font-size:1em'>z</text>
<text text-anchor='middle' x='344' y='52' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='344' y='68' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='344' y='84' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='344' y='100' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='344' y='116' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='352' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='352' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='352' y='68' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='352' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='352' y='100' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='352' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='360' y='20' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='360' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='360' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='360' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='360' y='100' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='360' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='368' y='20' fill='currentColor' style='font-size:1em'>K</text>
<text text-anchor='middle' x='368' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='368' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='368' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='368' y='100' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='368' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='376' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='376' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='376' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='376' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='384' y='20' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='384' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='384' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='384' y='84' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='384' y='100' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='384' y='116' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='392' y='20' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='392' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='392' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='392' y='100' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='392' y='116' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='400' y='20' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='400' y='36' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='400' y='52' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='400' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='400' y='100' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='400' y='116' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='408' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='408' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='408' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='408' y='84' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='408' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='408' y='116' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='416' y='20' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='416' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='416' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='416' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='416' y='116' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='424' y='20' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='424' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='424' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='424' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='424' y='116' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='432' y='20' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='432' y='52' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='432' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='432' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='440' y='20' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='440' y='52' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='440' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='448' y='20' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='448' y='52' fill='currentColor' style='font-size:1em'>K</text>
<text text-anchor='middle' x='448' y='84' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='448' y='116' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='456' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='456' y='52' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='456' y='84' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='456' y='116' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='464' y='20' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='464' y='52' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='464' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='472' y='20' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='472' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='472' y='116' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='480' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='480' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='480' y='116' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='488' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='488' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='488' y='116' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='496' y='52' fill='currentColor' style='font-size:1em'>q</text>
<text text-anchor='middle' x='496' y='116' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='504' y='52' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='504' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='504' y='116' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='512' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='512' y='84' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='520' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='520' y='84' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='528' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='528' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='536' y='52' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='536' y='84' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='544' y='52' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='544' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='552' y='84' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='560' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='568' y='84' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='584' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='592' y='84' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='600' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='608' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='616' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='624' y='84' fill='currentColor' style='font-size:1em'>l</text>
</g>

    </svg>
  
</div>
<p>If you see <code>invalid_grant</code> errors in ZTNA access logs, the root cause is usually an expired or replayed authorization code — see <a href="/posts/oauth-invalid-grant-error-complete-troubleshooting-guide/">OAuth invalid_grant Error: Complete Troubleshooting Guide</a>.</p>
<p>For the token verification mechanics ZTNA uses, see <a href="/posts/how-to-decode-jwt-tokens-in-javascript-using-the-jwt-decode-npm-package/">How to Decode JWT Tokens in JavaScript</a> and the <a href="/tools/jwt-decode/">JWT Decoder tool</a>.</p>
<h2 id="implementing-ztna-with-entra-id">Implementing ZTNA with Entra ID</h2>
<p>Microsoft Entra Private Access is Microsoft&rsquo;s ZTNA solution, deeply integrated with Entra ID Conditional Access:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span><span style="color:#75715e"># Entra Private Access — configure Quick Access connector</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Install the Private Network Connector on a domain-joined server</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 1. Register connector via Entra admin center</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 2. Configure Quick Access application</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 3. Set Conditional Access policy requiring MFA + compliant device</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$policy = @{
</span></span><span style="display:flex;"><span>    DisplayName = <span style="color:#e6db74">&#34;ZTNA - Require Compliant Device&#34;</span>
</span></span><span style="display:flex;"><span>    State = <span style="color:#e6db74">&#34;enabled&#34;</span>
</span></span><span style="display:flex;"><span>    Conditions = @{
</span></span><span style="display:flex;"><span>        Users = @{ IncludeGroups = @(<span style="color:#e6db74">&#34;All Corp Users&#34;</span>) }
</span></span><span style="display:flex;"><span>        Applications = @{ IncludeApplications = @(<span style="color:#e6db74">&#34;</span>$EntraPrivateAccessAppId<span style="color:#e6db74">&#34;</span>) }
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    GrantControls = @{
</span></span><span style="display:flex;"><span>        Operator = <span style="color:#e6db74">&#34;AND&#34;</span>
</span></span><span style="display:flex;"><span>        BuiltInControls = @(<span style="color:#e6db74">&#34;mfa&#34;</span>, <span style="color:#e6db74">&#34;compliantDevice&#34;</span>)
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>New-MgIdentityConditionalAccessPolicy -BodyParameter $policy
</span></span></code></pre></div><p>For broader Entra ID configuration patterns for Zero Trust, see <a href="/posts/zero-trust-architecture-implementation-a-practical-guide-for-iam-engineers/">Zero Trust Architecture Implementation: A Practical Guide for IAM Engineers</a>.</p>
<h2 id="migration-strategy-vpn--ztna">Migration Strategy: VPN → ZTNA</h2>
<h3 id="phase-1-application-discovery-week-1-2">Phase 1: Application Discovery (Week 1-2)</h3>
<p>Before migrating, inventory which applications are accessed via VPN and categorize by protocol:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># Analyze VPN firewall logs to find top private app destinations</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># (adjust for your firewall log format)</span>
</span></span><span style="display:flex;"><span>awk <span style="color:#e6db74">&#39;{print $7}&#39;</span> /var/log/vpn-access.log | <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  sort | uniq -c | sort -rn | head -20
</span></span></code></pre></div><p>Applications typically fall into three categories:</p>
<ul>
<li><strong>Web/HTTPS</strong>: Immediate ZTNA candidates (highest ROI)</li>
<li><strong>SSH/RDP</strong>: ZTNA with clientless browser rendering</li>
<li><strong>Custom protocols (UDP, raw TCP)</strong>: Requires ZTNA TCP proxy or keep on VPN</li>
</ul>
<h3 id="phase-2-pilot-deployment-week-3-6">Phase 2: Pilot Deployment (Week 3-6)</h3>
<p>Start with your top 5 web applications and 20-50 pilot users:</p>
<ol>
<li>Deploy ZTNA connector in your DMZ or private subnet</li>
<li>Onboard pilot applications to ZTNA portal</li>
<li>Configure IdP integration with Keycloak/Okta/Entra ID</li>
<li>Enable device posture checking via MDM certificates</li>
<li>Keep VPN active as fallback</li>
</ol>
<p>Measure: user support tickets, latency (compare P95 before/after), authentication success rate.</p>
<h3 id="phase-3-full-rollout-month-2-4">Phase 3: Full Rollout (Month 2-4)</h3>
<p>Onboard remaining web/SSH/RDP applications. For mTLS-secured services (internal microservices), ZTNA and mTLS complement each other — the ZTNA layer handles user identity while mTLS handles service-to-service authentication. For implementation details, see <a href="/posts/mtls-certificate-authentication-microservices-kubernetes/">mTLS Certificate Authentication for Microservices in Kubernetes</a>.</p>
<h3 id="phase-4-vpn-decommission">Phase 4: VPN Decommission</h3>
<p>Retire client VPN for remote users. Keep site-to-site VPN/SD-WAN for office-to-office connectivity where network-level access is required.</p>
<h2 id="security-hardening">Security Hardening</h2>
<h3 id="block-lateral-movement-at-the-source">Block Lateral Movement at the Source</h3>
<p>With ZTNA, lateral movement is structurally impossible — users never get a network-level IP address inside your private subnet. However, if an application itself is compromised, you still need application-layer controls.</p>
<p>For APIs behind ZTNA, implement OAuth scopes to enforce least privilege:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># FastAPI + Keycloak OIDC token validation behind ZTNA</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> fastapi <span style="color:#f92672">import</span> Depends, HTTPException, status
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> fastapi.security <span style="color:#f92672">import</span> HTTPBearer
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>security <span style="color:#f92672">=</span> HTTPBearer()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">async</span> <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">verify_ztna_token</span>(credentials <span style="color:#f92672">=</span> Depends(security)):
</span></span><span style="display:flex;"><span>    token <span style="color:#f92672">=</span> credentials<span style="color:#f92672">.</span>credentials
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># ZTNA already verified user identity, but validate token claims</span>
</span></span><span style="display:flex;"><span>    payload <span style="color:#f92672">=</span> decode_and_validate_jwt(token, KEYCLOAK_PUBLIC_KEY)
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Enforce application-level scope</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#e6db74">&#34;app:admin&#34;</span> <span style="color:#f92672">not</span> <span style="color:#f92672">in</span> payload<span style="color:#f92672">.</span>get(<span style="color:#e6db74">&#34;scope&#34;</span>, <span style="color:#e6db74">&#34;&#34;</span>)<span style="color:#f92672">.</span>split():
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">raise</span> HTTPException(status_code<span style="color:#f92672">=</span><span style="color:#ae81ff">403</span>, detail<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Insufficient scope&#34;</span>)
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Check device compliance claim (set by Keycloak mapper)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> payload<span style="color:#f92672">.</span>get(<span style="color:#e6db74">&#34;device_compliant&#34;</span>, <span style="color:#66d9ef">False</span>):
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">raise</span> HTTPException(status_code<span style="color:#f92672">=</span><span style="color:#ae81ff">403</span>, detail<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Device not compliant&#34;</span>)
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> payload
</span></span></code></pre></div><p>For Non-Human Identity (NHI) access behind ZTNA — service accounts, CI/CD pipelines, AI agents — use short-lived credentials rather than static API keys. See <a href="/posts/nhi-secrets-sprawl-fixing-the-non-human-identity-credential-crisis/">NHI Secrets Sprawl: Fixing the Non-Human Identity Credential Crisis</a>.</p>
<h2 id="faq">FAQ</h2>
<h3 id="does-ztna-work-for-iot-and-ot-devices">Does ZTNA work for IoT and OT devices?</h3>
<p>Standard ZTNA clients require a software agent, which IoT/OT devices cannot run. For these environments, consider:</p>
<ul>
<li>Network-based ZTNA (policy enforced at the switch/firewall level via device certificates)</li>
<li>Microsegmentation instead of ZTNA for device-to-device communication</li>
<li>ZTNA only for human access to OT management interfaces</li>
</ul>
<h3 id="what-happens-if-the-ztna-control-plane-goes-down">What happens if the ZTNA control plane goes down?</h3>
<p>Most enterprise ZTNA providers offer 99.99% uptime SLAs. If the control plane is unreachable, connectors fail-closed (no access) rather than fail-open (all access). This is the opposite of VPN, where a failed concentrator causes a complete outage. Design for this with VPN fallback for critical systems during migration.</p>
<h3 id="how-does-ztna-handle-service-to-service-calls">How does ZTNA handle service-to-service calls?</h3>
<p>ZTNA handles human-to-application access. For service-to-service calls between microservices, use mTLS with workload identity (SPIFFE/SPIRE) or the OAuth 2.0 Client Credentials flow. ZTNA and workload identity are complementary layers in a full Zero Trust architecture.</p>
]]></content:encoded></item></channel></rss>