Security Zero Trust

Zero Trust Architecture Blueprint: Identity, Network, and Data Pillars

Quick take: Zero Trust is not a product you buy — it is an architectural stance that assumes breach and verifies every access request against real-time signals. If your security model still trusts anything purely because it sits inside the corporate network, an attacker who phishes one user already owns more than you think.

MediSecure Health had a flat /16 network, domain-joined laptops trusted by default, and a VPN that handed out a route to everything the moment a user connected. After one phishing email landed a foothold on a billing workstation, the attacker moved laterally for eleven days — RDP to a jump box, then the file server, then the unsegmented subnet where the electronic health record (EHR) database lived — before anyone noticed the export volume. The post-incident review wrote itself: there was no second checkpoint anywhere. Once you were “inside,” you were trusted. Zero Trust became the board-level mandate, and the team’s job was no longer “harden the perimeter” but “remove implicit trust from every hop and prove each request on its own merits.”

This article is the blueprint they wished they had on day one. Zero Trust is an architecture, not a SKU, so we treat it as one: the three principles that anchor every decision, the five pillars (identity, devices, network, applications, data) you secure independently then weave together, the Policy Decision Point / Policy Enforcement Point (PDP/PEP) control plane that makes it real, and the hard mechanics — micro-segmentation, continuous access evaluation, conditional access, ZTNA versus VPN, and SASE — that separate a slide deck from a system. We map it to NIST SP 800-207 (the canonical reference architecture) and to the Microsoft Entra and Azure controls that implement each piece, with real Conditional Access JSON, az CLI, and Bicep.

By the end you will treat Zero Trust as a design discipline, not a marketing word: every request carries identity, device posture, and context to a decision engine; the engine consults policy and live risk; an enforcement point grants the least access for this request and re-evaluates continuously; and the blast radius of any single compromise is bounded by segmentation and explicit per-resource authorization. That is the whole game, and it is buildable today.

What problem this solves

Perimeter security trusts too much, in exactly the wrong place. The classic “castle and moat” model spends its entire budget on a strong edge — firewalls, the VPN concentrator, the DMZ — then runs a soft, flat, mutually-trusting interior. The assumption baked in is that network location is the authorization: if your packet originates from 10.x, you are an employee, and employees are trusted. Every modern breach weaponizes that assumption. Phishing, token theft, a compromised third-party VPN account, a malicious insider, or an exposed management port turns one foothold into a free pass across the estate, because nothing inside re-checks anything.

What breaks without Zero Trust is lateral movement containment. The initial compromise is rarely the crown jewels — it is a marketing laptop, a contractor’s account, an unpatched internal app. The damage comes from the hops after: credential dumping, pass-the-hash, RDP chaining, the slow walk toward the database, the backup server, the domain controller. In a flat network those hops are unimpeded. Zero Trust’s purpose is to make every hop a fresh authorization decision the attacker must re-win, using signals (device health, identity risk, location, target sensitivity) they cannot easily forge.

Who hits this: essentially everyone now, because the perimeter dissolved. Hybrid work put users on home and coffee-shop Wi-Fi; SaaS put corporate data in Microsoft 365, Salesforce, and a hundred other tenants outside any firewall; cloud workloads run in subscriptions reachable over the public internet; and contractors and BYOD devices need scoped access without being “on the network.” There is no single edge left to defend. The only coherent answer is to move the trust boundary to the resource and the identity — verify explicitly at every access, grant the minimum, and design as though the attacker is already inside, because statistically, somewhere, they are.

Here is the shift stated as a table — the same access request, decided two ways:

Dimension Perimeter / “castle and moat” Zero Trust
Trust basis Network location (you’re on 10.x → trusted) Verified identity + device + context, per request
Default posture Allow inside, deny outside Deny by default everywhere; allow on proof
Authentication Once, at VPN/login Continuous; re-evaluated on signal change
Authorization scope Broad (full network route) Least privilege, per-application, just-in-time
Lateral movement Largely unimpeded after entry Blocked by segmentation + per-resource auth
Blast radius of one compromise Whole estate Bounded to what that one identity could reach
Where the control lives The edge (firewall/VPN) The identity provider + per-resource PEPs
Failure mode One foothold → game over One foothold → contained, alerted, scoped

Learning objectives

By the end of this article you can:

Prerequisites & where this fits

You should be comfortable with cloud identity and networking fundamentals: what an identity provider (IdP) does, how OAuth 2.0 / OpenID Connect issue access and ID tokens, what MFA and SSO are, and the basics of TCP/IP, subnets, NSGs, and DNS. You should be able to run az in Cloud Shell and read JSON. Familiarity with Microsoft Entra ID (formerly Azure AD), Conditional Access, and Microsoft Intune helps — they are the reference implementation here — but the principles are vendor-neutral and map cleanly to other stacks.

This sits at the top of the Security architecture track: the organizing model the more specific articles plug into. Identity leans on the Entra controls in Conditional Access at Scale: Personas & Authentication Context and Zero Trust with Conditional Access & PIM; the network pillar builds on Micro-segmentation with NSGs, ASGs & Application Tier Isolation; and privileged access — the highest-value target — is detailed in Privileged Identity Management: PIM & PAM Architecture. Treat this article as the map and those as the territory.

A quick orientation on who owns what, so the roadmap later has the right people in the room:

Pillar Primary control plane Who usually owns it First Zero Trust move
Identity Entra ID (Conditional Access, PIM, Identity Protection) IAM / security Enforce MFA + phishing-resistant auth for all
Devices Intune / Defender for Endpoint Endpoint / EUC team Require compliant, managed devices in CA
Network Azure networking (NSG/ASG, Firewall, Private Link) Network team Segment around workloads; kill the flat network
Applications Entra app registrations / app proxy / ZTNA App + platform Per-app access; no broad VPN route
Data Microsoft Purview / sensitivity labels / RBAC Data governance Classify, then label, encrypt, and gate by label
Visibility / automation Sentinel / Defender XDR SecOps Centralize signals; automate response

Core concepts

Five mental models make every later decision obvious. Internalize these and the rest of the article is application.

Zero Trust is a stance, not a product. No single appliance “does Zero Trust.” It is an architecture in which implicit trust is removed from every interaction and replaced with explicit, signal-driven verification. Vendors sell components that implement parts of it (an IdP, a ZTNA broker, a CASB, a microsegmentation engine), but the architecture is the integration of those parts around a consistent policy. When someone sells you “a Zero Trust box,” they have missed the point.

Every access is a decision made by a PDP and enforced by a PEP. The Policy Decision Point (PDP) — in Microsoft’s stack, Conditional Access in Entra ID — evaluates the request’s signals against policy and returns grant, grant-with-conditions (step-up MFA, compliant device), or deny. The Policy Enforcement Point (PEP) — the front-end gateway, reverse proxy, app, or token issuer — carries out that decision: block, challenge, or admit, plus session constraints. NIST 800-207 splits the PDP into a Policy Engine + Policy Administrator, fed by inputs (CDM, threat intel, PKI, ID management, SIEM, activity logs) feeding the trust algorithm. Keep PDP-decides / PEP-enforces straight and the architecture reads itself.

The trust algorithm scores; it does not toggle. Zero Trust replaces binary allow/deny rules with a trust algorithm weighing many signals — who (identity, group, role), what device (managed? compliant? healthy?), from where (location, network), how risky now (Identity Protection risk, impossible travel, leaked credentials), and what is being accessed (sensitivity). The output is graded: low risk to a low-sensitivity app passes silently; the same identity reaching for the crown jewels from an unmanaged device on an anonymous IP gets stepped up or blocked. Designing in signals and gradients, not flat allow-lists, is the conceptual leap.

Least privilege is dynamic, scoped, and time-bound — not a static role grant. Zero Trust authorization is just enough (only the permissions the task needs), just in time (elevated via PIM activation with approval), and just for this session (re-evaluated continuously). A human carrying Global Administrator 24×7 is the antithesis. The model is per-application: granting access to one app grants nothing else — precisely what a VPN route fails to do.

Assume breach changes the questions you ask. Designing as though an attacker already has a foothold, you stop asking “how do I keep them out?” and start asking “when they’re in, how far can they get, how fast will I see it, how quickly can I revoke it?” That reframe produces micro-segmentation (limit reach), continuous evaluation and short token lifetimes (limit dwell), telemetry to a SIEM (see it), and automated revocation/CAE (kill it). Every Zero Trust control traces back to one of those four questions.

The vocabulary in one table

Pin down every moving part before the deep sections. The glossary repeats these for lookup; this is the mental model side by side:

Term One-line definition Where it lives (Microsoft) Why it matters
Zero Trust Architecture that removes implicit trust; verify every request The whole estate The organizing principle
PDP (Policy Decision Point) Engine that evaluates signals and decides Conditional Access (Entra) Makes the grant/deny/step-up call
PEP (Policy Enforcement Point) Gateway/proxy/app that enforces the decision App Proxy, ZTNA broker, the app Actually blocks or admits
Policy Engine / Administrator The decide-then-issue pair inside the PDP (NIST) Entra CA + token service NIST’s internal split of the PDP
Trust algorithm The weighted, signal-driven scoring of a request Entra CA + Identity Protection Graded decisions, not binary
Signal An input to the decision (identity, device, risk, location) Entra, Intune, Defender, threat intel The raw material of the decision
Conditional Access (CA) Entra’s policy engine: if-conditions → grant controls Entra ID The PDP you actually configure
CAE (Continuous Access Evaluation) Near-real-time token revocation on critical events Entra + CAE-aware resources Kills the “valid token for an hour” gap
Least privilege Just-enough, just-in-time, just-for-this-session access RBAC + PIM Bounds what a compromise can do
Micro-segmentation Fine-grained isolation between workloads NSG/ASG, Firewall, Private Link Bounds lateral movement
ZTNA Per-app, identity-aware access (no network route) App Proxy / Global Secure Access Replaces broad VPN access
SASE Network + security as a converged cloud edge Global Secure Access (SSE) The delivery model for ZTNA + SWG + CASB
Assume breach Design as if the attacker is already inside Mindset → all controls Reframes every design question

The three principles, applied

Microsoft and NIST both anchor Zero Trust on the same three principles. They sound like slogans; the value is in applying each to a concrete decision. Here is the spine of the whole architecture:

Principle What it means What it rejects A concrete control that implements it
Verify explicitly Authenticate and authorize on all available signals every time “You’re on the network, so you’re fine” Conditional Access requiring MFA + compliant device + acceptable risk
Use least-privilege access Just-enough, just-in-time, risk-adaptive access Standing admin rights; broad VPN routes PIM eligible roles with approval + time limit; per-app access
Assume breach Minimize blast radius; segment; verify end-to-end; use analytics “Inside = trusted; no need to re-check” Micro-segmentation + CAE + Sentinel detections + encryption everywhere

Verify explicitly

“Verify explicitly” means every request authenticates and authorizes using all the signals you have — not just a password, and never network location as a proxy for identity. In practice: strong authentication (ideally phishing-resistant — FIDO2/passkeys/WHfB), device posture (known, managed, compliant?), and context (location, application, live risk). The anti-pattern it kills is the implicit grant — trusting a request because it came over the VPN or from inside the firewall.

What “all available signals” actually includes, and where each comes from:

Signal class Specific signals Source Used in CA as
Identity User, group, role, app being accessed Entra ID Assignment scope (users/groups/roles, target resources)
Authentication strength MFA, phishing-resistant, certificate-based Entra auth methods Grant control: require authentication strength
Device Managed, compliant, Hybrid Entra joined Intune / Entra Grant control: require compliant / Hybrid joined device
Risk User risk, sign-in risk, leaked creds, anomalies Entra ID Protection Condition: user risk / sign-in risk level
Location Country, IP range, named/trusted locations Entra named locations Condition: locations (include/exclude)
Client / platform OS, browser vs app, legacy auth Entra Condition: device platforms / client apps
Network Compliant network, Global Secure Access Entra / GSA Condition: network (with GSA)
Session Real-time sign-in risk, app-enforced restrictions Entra + app Session control: sign-in frequency / CAE / app restrictions

Use least-privilege access

Least privilege has three axes, and Zero Trust insists on all three: just enough (narrowest permission set), just in time (granted only when needed, then expired), and just for the right context (risk-adaptive — a role available from a compliant device but not an unmanaged one). The poster child of the violation is permanent Global Administrator. The replacement is an eligible assignment activated through PIM with justification, approval, and a time limit, scoped further by Conditional Access (phishing-resistant MFA + compliant device to even activate).

The three axes, what violates each, and the Microsoft control that fixes it:

Axis of least privilege Violation it prevents Microsoft control Mechanism
Just enough (scope) Over-broad role (Owner where Reader suffices) Azure RBAC / Entra roles Assign the narrowest built-in or custom role
Just in time (time) Standing 24×7 admin access PIM Eligible (not active) assignment; activate on demand
Just-enough-with-approval Self-elevation without oversight PIM approval workflow Require approver + justification on activation
Just for the right context Admin from an unmanaged device CA + authentication context Gate activation/use behind compliant device + strong auth
Just the right surface One grant unlocking everything Per-app access (ZTNA) Access to app A grants nothing about app B

Assume breach

“Assume breach” produces most of the architecture, because it reframes design around four questions. How far can they reach? → minimize blast radius with micro-segmentation, per-app access, and least-privilege RBAC. How long can they stay? → minimize dwell with short token lifetimes, CAE, and PIM expiry. Will I see them? → maximize visibility with centralized logging to Sentinel and Defender XDR. How fast can I stop them? → maximize response speed with CAE revocation and automated playbooks. It justifies spending on segmentation, CAE, and a SIEM even when “nothing is wrong” — because the whole point is that you will not always know when something is.

The five pillars

Zero Trust is built pillar by pillar: identity, devices, network, applications, data, all surrounded by visibility/analytics and automation/orchestration. You secure each pillar with its own controls, then connect them through the policy plane so a single decision can consider all of them at once (e.g. “this identity, on this device, reaching this application, holding this data sensitivity, from this network”). Microsoft’s reference model and the US CISA Zero Trust Maturity Model both use this pillar decomposition; treat the pillars as the columns of your roadmap.

The pillars at a glance — what “good” looks like and the Microsoft control that gets you there:

Pillar Zero Trust goal Key Microsoft controls “Done well” looks like
Identity Every identity strongly verified, least-privileged Entra ID, Conditional Access, PIM, Identity Protection MFA/passkeys for all; no standing admin; risk-based policies
Devices Only known, healthy, compliant endpoints Intune, Defender for Endpoint, compliance policies CA requires compliant device; posture is a signal
Network Segmented, encrypted, no implicit east-west trust NSG/ASG, Azure Firewall, Private Link, DDoS Workload-level segmentation; private connectivity; inspected egress
Applications Per-app access; modern auth; no broad routes App registrations, App Proxy / Global Secure Access ZTNA per app; legacy auth blocked; OAuth governed
Data Classified, labeled, encrypted, access-gated by sensitivity Purview, sensitivity labels, RBAC, DLP, encryption Data discovered, labeled, protected and rights-aware

Identity — the new control plane

Identity is the first pillar and the one to do first, because in a Zero Trust world identity is the perimeter — every access decision starts with “who (or what) is this?” The controls: strong, ideally phishing-resistant authentication (FIDO2 keys, passkeys, Windows Hello for Business, certificate-based auth); Conditional Access as the PDP; PIM for least-privilege admin; and Entra ID Protection for risk-based detection. Identity also covers workload identities — service principals and managed identities — increasingly the attacker’s target because they are often over-permissioned and unmonitored.

The identity controls and what each one buys:

Control What it does Zero Trust principle served Where configured
MFA (all users) Second factor on sign-in Verify explicitly CA grant: require MFA
Phishing-resistant auth FIDO2/passkeys/WHfB/CBA resist AiTM Verify explicitly CA grant: authentication strength
Conditional Access The signal-driven PDP All three Entra → Security → Conditional Access
PIM Eligible, time-bound, approved admin roles Least privilege Entra → Identity Governance → PIM
Identity Protection User/sign-in risk detection + remediation Assume breach Entra → Protection → Identity Protection
Continuous Access Evaluation Near-real-time token revocation Assume breach Enabled by default for CAE-aware resources
Workload identity protection CA + risk for service principals Verify explicitly CA (workload identities) + Identity Protection

The phishing-resistant ladder matters enough to break out — not all MFA is equal against an adversary-in-the-middle (AiTM) proxy that replays a one-time code:

Method Strength Phishing-resistant? Notes
SMS / voice OTP Weak No SIM-swap and OTP-replay vulnerable; avoid
Authenticator app (push + number match) Medium Partially Number matching defeats simple MFA fatigue; still proxiable
TOTP code Medium No Replayable by AiTM
FIDO2 security key Strong Yes Hardware-bound; origin-checked; AiTM-resistant
Passkey (device-bound / synced) Strong Yes Same FIDO2 cryptography; great UX
Windows Hello for Business Strong Yes TPM-bound; per-device
Certificate-based auth (CBA) Strong Yes PKI-backed; good for high-assurance/regulated

Devices — posture as a signal

A verified identity on a compromised device is still a breach. The devices pillar makes device posture a first-class signal: is the device managed (Intune-enrolled), compliant (meets policy — encryption, OS version, no jailbreak, EDR healthy), and ideally attested (hardware-backed)? Conditional Access then requires a compliant or Hybrid Entra joined device for sensitive resources. The clinician on a managed workstation sails through; on a personal tablet they’re blocked or limited, because the device can’t be verified.

Device states and what each unlocks in policy:

Device state Meaning Trust level Typical CA treatment
Unmanaged / BYOD (unenrolled) Unknown to the org Lowest Block, or browser-only with app-enforced restrictions
Entra registered Known identity, light management Low–medium Allow low-sensitivity; require MFA
Entra joined Cloud-joined, manageable Medium Allow with compliance check
Hybrid Entra joined On-prem AD + Entra joined Medium–high Common enterprise baseline
Compliant (Intune) Meets compliance policy High Required for sensitive apps
Compliant + attested Hardware health attestation Highest Privileged / regulated workloads

A sane compliance policy feeds “compliant = true” from a handful of signals: disk encryption (BitLocker/FileVault — a lost device isn’t a breach), OS minimum version (patched against known CVEs), EDR healthy (Defender for Endpoint running with machine risk ≤ medium), no jailbreak/root (tamper integrity), firewall/secure boot on, a password/PIN with lockout, and the live Defender risk score gating compliance.

Network — segment, encrypt, never trust east-west

The network pillar stops treating the internal network as a trust zone. Three moves: micro-segmentation (isolation so a compromised workload cannot freely reach neighbors), encryption everywhere (TLS in transit, no cleartext east-west), and private, inspected connectivity (private endpoints so PaaS isn’t internet-exposed; filtered egress). “We have VLANs” is not segmentation — a VLAN is a broadcast domain, not an authorization boundary; without enforced rules between segments, lateral movement is unchanged.

The network controls and the Azure service that delivers each:

Control Purpose Azure service Granularity
Subnet/NSG segmentation Allow/deny by 5-tuple between subnets Network Security Groups Subnet / NIC
Application-tier segmentation Group by role, not IP Application Security Groups (ASG) Workload role
Centralized inspection/filtering Inspect + filter east-west and egress Azure Firewall Hub / flow
Private connectivity to PaaS Keep PaaS off the public internet Private Link / Private Endpoint Per resource
Microsegmentation at host Per-VM/identity rules NSG + (3rd-party agents) Host / process
Volumetric protection Absorb DDoS at the edge DDoS Protection VNet
Encrypted transit No cleartext east-west TLS / IPsec / app-layer Per flow
Inspected, identity-aware egress Control + log what leaves Firewall + FQDN filtering / SWG Egress

Applications — per-app access, modern auth

The applications pillar replaces “connect to the network, then reach any app” with “authenticate to this application and get only this application.” Modern apps integrate with Entra for SSO and Conditional Access; legacy/on-prem apps are published via App Proxy or Global Secure Access for the same identity-aware, per-app access without a network route. Legacy authentication (basic auth, IMAP/POP/SMTP-AUTH) bypasses Conditional Access entirely and must be blocked. OAuth consent and app permissions are governed so a malicious or over-permissioned app can’t quietly hoard delegated rights.

Application access models, from worst to best for Zero Trust:

Access model How a user reaches the app Zero Trust posture Verdict
Full VPN to network Network route to everything Broad implicit trust Avoid (legacy)
Reverse proxy, no identity Published URL, no auth integration Network-scoped, weak auth Better than VPN, still weak
Entra SSO + Conditional Access Per-app token, CA-evaluated Per-app, signal-driven Good (modern SaaS/LOB)
App Proxy (on-prem app) Outbound connector + Entra pre-auth Per-app, no inbound route Good (legacy apps)
ZTNA / Global Secure Access Identity-aware per-app tunnel Least privilege, no network exposure Best

Legacy authentication must die first because Conditional Access cannot see it: basic auth sends credentials with no MFA, IMAP/POP3 and SMTP AUTH allow password-only mailbox access and send (the latter abused for exfil and spam), and older Office/EWS clients predate modern auth entirely. Block all of these via a CA legacy-clients policy and disable the protocols per-mailbox unless a specific workload truly requires one.

Data — classify, label, protect, gate

Data is the pillar most teams reach last and the one the whole exercise is for. Zero Trust data protection is a chain: discover and classify (where is sensitive data, and how sensitive?), label (sensitivity labels that travel with the file), protect (encryption and rights management tied to the label), and gate access (authorize by label and identity, with DLP to stop exfiltration). The aim is rights-aware access: a confidential file stays encrypted even if it leaves the environment, and bulk export of regulated data triggers approval and inspection rather than flowing silently.

The data-protection chain and the Microsoft control at each link:

Stage Goal Microsoft control Example
Discover Find sensitive data at rest/in motion Purview data map / classifiers Locate PII, PHI, secrets across stores
Classify Assign sensitivity Sensitivity labels / classifiers Public / Internal / Confidential / Restricted
Label Tag the data so policy travels with it Purview Information Protection Label persists in the file
Protect Encrypt + apply usage rights Label-based encryption (RMS) “Confidential” → encrypt + no-forward
Gate access Authorize by label + identity CA + RBAC + label policy Restricted data only on compliant device
Prevent exfiltration Stop unsanctioned movement Purview DLP Block bulk export of labeled data
Monitor Detect risky data activity Insider Risk / Defender for Cloud Apps Alert on mass download

A simple classification scheme to anchor labels (adapt the names to your org):

Label Examples Protection Access rule of thumb
Public Marketing, published docs None required Anyone
Internal Internal wikis, non-sensitive ops Encryption optional Authenticated employees
Confidential Customer PII, contracts, source Encrypt + watermark Need-to-know + compliant device
Restricted / Regulated PHI, payment data, secrets Encrypt + strict rights + DLP Explicit grant + step-up + audit

The PDP/PEP control plane

The pillars are the what; the PDP/PEP plane is the how it gets decided. Every request is intercepted by a Policy Enforcement Point, which asks the Policy Decision Point for a verdict; the PDP runs the signals through the trust algorithm and returns grant / step-up / deny plus session constraints; the PEP enforces it. NIST 800-207 splits the PDP into a Policy Engine (decides) and a Policy Administrator (executes by issuing or revoking credentials). In Microsoft’s stack, Conditional Access is the PDP, and the PEPs are the token service, App Proxy / Global Secure Access, the apps, and CAE-aware resources.

The NIST 800-207 logical components mapped to Microsoft reality:

NIST 800-207 component Role Microsoft implementation
Policy Engine (PE) Makes the grant/deny decision Conditional Access evaluation logic
Policy Administrator (PA) Executes the decision (issue/deny/revoke) Entra token service; CAE signaling
Policy Enforcement Point (PEP) Enables/terminates the connection App Proxy, Global Secure Access, the app, CAE-aware resources
CDM system Asset/device state Intune compliance, Defender device risk
Threat intelligence External threat signals Entra ID Protection, Defender threat intel
Activity logs / SIEM Behavior + analytics Entra sign-in logs → Sentinel
Data access policy What identities may do with data Entra roles, RBAC, Purview labels
PKI / ID management Credentials and identities Entra ID, certificate-based auth

How a single request flows through the plane (this is the access sequence the diagram below depicts):

Step Actor Action Outcome
1 User/app Requests a resource Hits the PEP, not the resource
2 PEP Forwards request context to the PDP PDP receives identity + device + context
3 PDP (Policy Engine) Runs the trust algorithm over signals Decision: grant / step-up / deny
4 PDP (Policy Administrator) Issues/denies a scoped, short-lived token Credential reflects least privilege
5 PEP Enforces the verdict; opens the session Access granted with constraints
6 CAE / monitoring Watches for critical events mid-session Token revoked on risk; session re-checked

Conditional Access as the policy engine

Conditional Access is where the abstract PDP becomes a thing you configure. A policy is an if-then: if a set of assignments (users/groups/roles, target resources, network) and conditions (sign-in risk, device platform, locations, client app) match, then apply grant controls (require MFA, compliant device, authentication strength, block) and/or session controls (sign-in frequency, app-enforced restrictions, CAE). The art is composing a small set of policies that together express your trust algorithm without locking yourself out.

The anatomy of a Conditional Access policy:

Part Sub-elements Example
Assignments → Users Include/exclude users, groups, roles, guests All users, exclude break-glass accounts
Assignments → Target resources Cloud apps, user actions, auth context All cloud apps; or “register security info”
Conditions → Risk User risk, sign-in risk Sign-in risk ≥ Medium
Conditions → Device Platforms, filter for devices iOS/Android; or device.isCompliant
Conditions → Location Named/trusted locations Exclude trusted corporate ranges
Conditions → Client apps Browser, mobile/desktop, legacy Block legacy authentication clients
Grant controls MFA, compliant device, auth strength, block Require compliant device + phishing-resistant MFA
Session controls Sign-in frequency, CAE, app restrictions Sign-in frequency 1h for high-risk; CAE on

A baseline policy set every tenant should have (each is one Zero Trust principle in action):

# Policy Trust principle Effect
1 Require MFA for all users Verify explicitly No password-only sign-in
2 Block legacy authentication Verify explicitly Closes the CA-bypass hole
3 Require compliant/Hybrid-joined device for sensitive apps Verify explicitly Posture as a gate
4 Require phishing-resistant MFA for admins Verify explicitly AiTM-resistant privileged auth
5 Block or step-up on high user/sign-in risk Assume breach Risk-adaptive enforcement
6 Require approved app + app-protection on mobile Verify explicitly Managed app data on BYOD
7 Sign-in frequency + CAE for high-risk sessions Assume breach Short dwell; fast revocation
8 Always exclude break-glass accounts from all of the above Resilience Survives a PDP misconfig/outage

Continuous verification and CAE

A core Zero Trust idea is that verification is continuous, not a one-time gate at login. The legacy model authenticates once and trusts the token for its full lifetime (often an hour) — so if a user is disabled, a device falls out of compliance, or risk spikes during that hour, nothing happens until the token expires. Continuous Access Evaluation (CAE) closes that gap: CAE-aware resources subscribe to critical Entra events and revoke access in near real-time (minutes) when the account is disabled, the password changes, an admin revokes sessions, or risk is detected. Combined with sign-in frequency controls and risk-based re-evaluation, authorization adapts to the present, not the past.

One-time vs continuous verification, side by side:

Aspect One-time (legacy) Continuous (CAE + risk)
When checked At login only At login + on critical events
Revocation latency Up to token lifetime (~1h) Near real-time (minutes)
Reacts to disabled account No (until expiry) Yes
Reacts to compliance loss No Yes (re-evaluated)
Reacts to risk spike mid-session No Yes (step-up or block)
Network change handling Ignored Re-evaluated (IP/location)

The critical events CAE responds to:

Event Effect with CAE Why it matters
User account disabled/deleted Access revoked in minutes Offboarding takes effect immediately
Password change / reset Existing tokens invalidated Stops a stolen session post-reset
Admin revokes user sessions Access killed near real-time Incident response actually works
MFA registration changed Re-evaluated Detects attacker enrolling new MFA
Risk detected (Identity Protection) Step-up or block mid-session Risk doesn’t wait for token expiry
IP address change (location policy) Token re-evaluated against CA Catches token replay from new geo

Micro-segmentation in depth

Micro-segmentation is the network expression of “assume breach”: divide the estate into the smallest practical zones and enforce what may cross between them, so a compromised workload is boxed in. The crucial distinction: segmentation is enforced authorization between segments, not merely having separate subnets or VLANs. A flat network with twelve VLANs but “any-any” rules between them is, for an attacker, one network. In Azure you build it from NSGs (5-tuple allow/deny at subnet/NIC), ASGs (rules by application role instead of brittle IP ranges), Azure Firewall (centralized, inspected, FQDN-aware filtering in a hub), and Private Link (PaaS reached privately, not over the internet). Identity-based segmentation — authorizing service-to-service calls by workload identity — is the frontier beyond IP rules.

The segmentation toolbox and when to reach for each:

Tool Boundary it enforces Best for Limit / gotcha
NSG 5-tuple (src/dst IP, port, proto) Subnet/tier isolation IP-based; rules sprawl without ASGs
ASG Logical app-role groups Role-based rules that survive IP changes Same region/VNet scope
Azure Firewall Centralized L3–L7 + FQDN Hub inspection, egress filtering, threat intel Cost; must route traffic through it (UDRs)
Private Link / Endpoint Private path to a PaaS resource Removing public exposure of PaaS Per-resource; DNS must resolve privately
Service tags Azure service ranges in rules Allowing specific Azure services cleanly Coarser than per-resource
Identity-based (workload) Authn/authz of the calling identity True least privilege east-west Requires app/mesh support

A worked example — a three-tier app segmented so each tier only talks to the next:

From → To Allowed? Rule (conceptual) Why
Internet → Web tier Yes (443 only) NSG allow 443 from Internet to asg-web Public entry, HTTPS only
Web → App tier Yes (app port) Allow asg-webasg-app on 8080 Web calls app API
App → Data tier Yes (DB port) Allow asg-appasg-data on 1433 App reads/writes DB
Web → Data tier No Deny asg-webasg-data Web has no business at the DB
Any tier → Internet (egress) Filtered Route via Azure Firewall, FQDN allow-list Control + log what leaves
Data tier → Internet No Deny direct egress; private endpoints only DB should never reach out

ASGs make this maintainable — the same intent as NSG rules by application group, so a rule survives IP churn:

# Create application security groups for each tier
az network asg create -g rg-zt-prod -n asg-web  -l centralindia
az network asg create -g rg-zt-prod -n asg-app  -l centralindia
az network asg create -g rg-zt-prod -n asg-data -l centralindia

# Allow web -> app on 8080, by ASG (no hard-coded IPs)
az network nsg rule create -g rg-zt-prod --nsg-name nsg-app -n allow-web-to-app \
  --priority 100 --direction Inbound --access Allow --protocol Tcp \
  --source-asgs asg-web --destination-asgs asg-app \
  --destination-port-ranges 8080

# Explicitly deny web -> data (defense in depth, above the default deny)
az network nsg rule create -g rg-zt-prod --nsg-name nsg-data -n deny-web-to-data \
  --priority 110 --direction Inbound --access Deny --protocol Tcp \
  --source-asgs asg-web --destination-asgs asg-data \
  --destination-port-ranges 1433
// NSG for the data tier: allow only the app tier on 1433, deny everything else inbound
resource nsgData 'Microsoft.Network/networkSecurityGroups@2023-11-01' = {
  name: 'nsg-data'
  location: location
  properties: {
    securityRules: [
      {
        name: 'allow-app-to-data'
        properties: {
          priority: 100
          direction: 'Inbound'
          access: 'Allow'
          protocol: 'Tcp'
          sourceApplicationSecurityGroups: [ { id: asgApp.id } ]
          destinationApplicationSecurityGroups: [ { id: asgData.id } ]
          destinationPortRange: '1433'
          sourcePortRange: '*'
        }
      }
      {
        name: 'deny-all-inbound'
        properties: {
          priority: 4096
          direction: 'Inbound'
          access: 'Deny'
          protocol: '*'
          sourceAddressPrefix: '*'
          destinationAddressPrefix: '*'
          sourcePortRange: '*'
          destinationPortRange: '*'
        }
      }
    ]
  }
}

To keep PaaS off the public internet (the other half of network Zero Trust), use a private endpoint instead of the service’s public IP:

# Private endpoint for an Azure SQL server — the DB is reachable only inside the VNet
az network private-endpoint create -g rg-zt-prod -n pe-sql \
  --vnet-name vnet-zt --subnet snet-data \
  --private-connection-resource-id $(az sql server show -g rg-zt-prod -n sql-zt-prod --query id -o tsv) \
  --group-id sqlServer --connection-name sql-conn

For the full treatment — ASG patterns, hub inspection, host-level segmentation — see Micro-segmentation with NSGs, ASGs & Application Tier Isolation; for controlling egress, Centralized Internet Egress with FQDN Filtering & Explicit Proxy; and for private connectivity without a DNS mess, Private Endpoints & DNS at Scale.

ZTNA versus VPN, and where SASE fits

The most visible Zero Trust change for users is replacing the VPN with Zero Trust Network Access (ZTNA). A VPN authenticates you once and drops you onto the network — you get a route, and reach anything the firewall permits. That is implicit trust by design: network position equals access. ZTNA inverts it: there is no network route. The user authenticates per session, the broker checks identity, device, and context, then brokers a connection to one specific application — the user never sees the network, and reaching app A grants nothing toward app B. In Microsoft’s stack, Entra Application Proxy and Global Secure Access (the SSE/ZTNA service) provide this.

VPN versus ZTNA, head to head:

Dimension Traditional VPN ZTNA
What you get on connect A route onto the network Access to one named app
Trust model Authenticate once → trusted on the network Verify per session; never trust the network
Lateral movement Possible (you’re on the network) None (no network exposure)
Authorization granularity Network/subnet Per application / per resource
Device & risk signals Often none post-connect Evaluated continuously (CA + posture)
Inbound exposure VPN concentrator is internet-facing App Proxy uses outbound connectors; no inbound port
User experience Client, full tunnel, latency Seamless per-app, often clientless
Blast radius if creds stolen Whole network The one app that identity could reach
Best for Legacy “be on the LAN” needs Modern per-app remote access

When each still makes sense (ZTNA is the target, but be honest about edges):

Scenario Use Why
Remote access to internal web/LOB apps ZTNA (App Proxy / GSA) Per-app, no network exposure
Third-party / contractor access to one system ZTNA Scope to exactly one app; no LAN
A handful of legacy thick clients needing raw network VPN (scoped) or ZTNA for non-web Some protocols still need network-level reach
Site-to-site connectivity (datacenter ↔ cloud) VPN/ExpressRoute Infrastructure link, not user access
Admin access to servers ZTNA + PIM + bastion Brokered, just-in-time, audited

SASE (Secure Access Service Edge) is the delivery model that packages ZTNA with the other cloud-edge security functions: networking (SD-WAN) converged with Security Service Edge (SSE), where SSE bundles ZTNA + Secure Web Gateway (SWG) + Cloud Access Security Broker (CASB) + Firewall-as-a-Service (FWaaS) delivered from the cloud, close to the user. The point is consistent Zero Trust policy whether the user is in an office, at home, or on a plane — the security stack follows the identity, not the building. Microsoft’s Global Secure Access is its SSE (Internet Access = SWG/CASB controls; Private Access = ZTNA), integrated with Conditional Access so the same policies apply.

The SASE/SSE components and what each enforces:

Component What it does Zero Trust role Microsoft mapping
ZTNA Per-app, identity-aware access to private apps Replaces VPN GSA Private Access / App Proxy
SWG (Secure Web Gateway) Inspects/filters web traffic, blocks bad sites Controls egress to the internet GSA Internet Access
CASB Visibility/control over SaaS usage Governs sanctioned/shadow SaaS Defender for Cloud Apps
FWaaS Cloud-delivered firewall Network filtering without appliances GSA / Azure Firewall
DLP (in-line) Stops sensitive data leaving Data pillar at the edge Purview DLP + GSA

For the network-egress and SaaS-governance pieces, Defender for Cloud Apps: Shadow IT & Session Policies covers the CASB layer in depth.

NIST 800-207 and the Microsoft Zero Trust model

You do not invent Zero Trust from scratch — two reference frameworks exist, and citing them makes your architecture defensible to auditors and your board. NIST SP 800-207 is the canonical, vendor-neutral Zero Trust Architecture standard, defining the logical components (the PE/PA/PEP split above) and seven tenets. Microsoft’s Zero Trust model (and the parallel CISA Zero Trust Maturity Model) operationalizes the same ideas around the five pillars with a concrete maturity progression. Use NIST for the why and the vocabulary, Microsoft/CISA for the how and the roadmap.

The seven NIST 800-207 tenets, each translated into something you actually configure:

# NIST 800-207 tenet (paraphrased) What it demands Concrete control
1 All data sources and computing services are resources Treat everything as a protected resource Inventory + per-resource policy
2 All communication is secured regardless of network location No cleartext; no “trusted” segment TLS everywhere; encrypted east-west
3 Access is granted per-session No standing, broad sessions Short-lived, scoped tokens; CAE
4 Access is determined by dynamic policy Decide on identity + state + behavior + environment Conditional Access trust algorithm
5 The enterprise monitors asset integrity/security posture Device/asset posture is continuously assessed Intune compliance + Defender risk
6 Authentication and authorization are dynamic and strictly enforced before access Verify then grant, every time CA grant controls as PEP gate
7 The enterprise collects data to improve security posture Telemetry feeds detection + policy Sentinel/Defender; iterate policy

A Zero Trust maturity model (aligned with CISA’s stages) to place yourself honestly on the journey:

Maturity stage Identity Network Access Visibility
Traditional Passwords; some MFA Flat; perimeter firewall VPN, broad routes Siloed logs
Initial MFA broadly; basic CA Some macro-segmentation A few per-app integrations Central log collection
Advanced Phishing-resistant; risk-based CA; PIM Micro-segmentation; private endpoints ZTNA for most apps; CAE on SIEM + correlation + some automation
Optimal Passwordless default; continuous, adaptive Identity-based, dynamic segmentation Per-resource, fully ZTNA, just-in-time Real-time analytics; automated response

To speak both languages: NIST’s Policy Engine/Decision Point is Conditional Access; its Policy Enforcement Point is App Proxy / GSA / the app / CAE; its CDM system and threat intelligence inputs are Intune compliance and Identity Protection / Defender; and NIST’s deployment scenarios map to Microsoft’s five-pillar decomposition with the CISA maturity model as the journey.

A phased adoption roadmap

The single biggest Zero Trust failure mode is the big bang — trying to do all five pillars at once, which stalls in committee and burns credibility. Zero Trust is adopted in waves, and the ordering is not arbitrary: identity first (highest-leverage and the prerequisite for the rest), then devices (posture becomes a signal), then network and applications (segmentation and per-app access), then data (the hardest and the goal). Each phase ships value on its own, and every phase carries a break-glass safeguard so a policy mistake never locks you out.

The roadmap, phase by phase:

Phase Focus Key moves Quick win Main trap
0 Inventory & break-glass Asset/identity/data inventory; create 2 break-glass accounts; baseline logging You know what you’re protecting Skipping break-glass → lockout later
1 Identity baseline MFA for all; block legacy auth; baseline CA; Identity Protection on Kills the cheapest attacks immediately Forgetting to exclude break-glass from CA
2 Privileged access PIM eligible roles; phishing-resistant MFA for admins; remove standing admin Crown-jewel accounts hardened Approver bottlenecks; emergency access gaps
3 Devices Intune enrollment; compliance policies; CA requires compliant device Posture becomes a real signal Locking out unmanaged users with no ramp
4 Network segmentation NSG/ASG tiering; private endpoints; inspected egress Lateral movement bounded “VLANs = done”; any-any rules left behind
5 Applications & ZTNA App Proxy / GSA per-app; retire broad VPN; govern OAuth VPN blast radius eliminated Migrating apps without warm cutover
6 Data Discover, classify, label, encrypt, DLP The actual goal: data is protected Boiling the ocean; label everything at once
7 Visibility & automation Centralize to Sentinel; risk-based automation; CAE everywhere Detect + respond in minutes Alert fatigue; no playbooks

What to do first if you can only do three things this quarter:

Priority Action Why it’s #1-3 Effort
1 Enforce MFA for all + block legacy auth Stops the overwhelming majority of account takeovers Low
2 PIM + phishing-resistant MFA for admins Protects the accounts that can do the most damage Medium
3 Require compliant device for sensitive apps Makes a stolen credential far less useful Medium

Break-glass is non-negotiable: Zero Trust intentionally makes access hard, and the day Conditional Access misfires you still need a way in. The rules:

Break-glass rule Why
Create 2+ emergency accounts, cloud-only Survive on-prem/federation outages
Exclude them from all Conditional Access policies A CA mistake must not lock everyone out
Use long, unique, vaulted passwords + FIDO2 keys High assurance without depending on normal MFA
Alert on every sign-in of these accounts Their use is always an event worth investigating
Review and test them on a schedule An untested break-glass account is not a safeguard

KPIs that prove the program is working (not just busy):

KPI What it measures Target direction
% users with phishing-resistant MFA Identity hardening ↑ toward 100%
% privileged roles via PIM (no standing) Least privilege for admins ↑ toward 100%
% sign-ins from compliant devices Device posture coverage
% apps behind per-app access (ZTNA) App pillar progress ↑; VPN routes ↓
Mean time to revoke (offboard/incident) Assume-breach response ↓ toward minutes
% sensitive data labeled & protected Data pillar progress
Legacy-auth sign-ins CA-bypass exposure ↓ toward 0

For privileged access specifically — the highest-value phase — Privileged Identity Management: PIM & PAM Architecture is the deep dive, and Zero Trust with Conditional Access & PIM ties CA and PIM together. For risk-based policies, Entra ID Protection: Risk-Based Policies, Tuning & Investigation covers phase 1 and 7.

Architecture at a glance

The architecture has three planes. The control plane is where decisions are made: a Policy Decision Point (Conditional Access) sits at the center, fed by signals — identity and groups from Entra ID, device posture from Intune/Defender, live risk from Identity Protection, location, and threat intelligence — which it runs through the trust algorithm. The enforcement plane is the ring of Policy Enforcement Points — the token service, App Proxy / Global Secure Access, and the apps — that carry out the verdict and open (or refuse) the session. The resource plane is the five pillars protected: identities, devices, the segmented network, applications, and classified data, all emitting telemetry to a SIEM that loops back into the signals. Read it center-out: a request arrives, the PDP scores it against every signal, a PEP enforces the graded decision, and continuous evaluation keeps re-checking for the life of the session.

Zero Trust control plane: a central Policy Decision Point (Conditional Access) ingesting identity, device-posture, risk, location and threat-intel signals, feeding the trust algorithm, with Policy Enforcement Points (token service, App Proxy/Global Secure Access, apps) gating access to the five pillars — identity, devices, network, applications and data

The second view is the access sequence — the life of a single request. A user or workload requests a resource and is intercepted by the PEP; the PEP hands context to the PDP; the PDP gathers identity, device, and risk signals, runs the trust algorithm, and returns a graded decision; the Policy Administrator issues a scoped, short-lived token (or denies); the PEP opens the session under the granted constraints; and from then on CAE and session controls re-check critical events, revoking or re-challenging in near-real-time if anything changes.

Zero Trust access-request sequence: user/workload → Policy Enforcement Point → Policy Decision Point gathering identity, device posture and risk signals → trust-algorithm decision → scoped short-lived token issued → session opened with constraints → Continuous Access Evaluation re-checking critical events mid-session

The third view is the decision flow itself — the trust algorithm’s branching logic, from “is the identity strongly verified?” through device, risk, and sensitivity checks to a final grant, step-up, or block. It is the same logic your Conditional Access policy set encodes, drawn as the questions asked in order.

Zero Trust decision flow: evaluate identity authentication strength, then device compliance, then sign-in/user risk, then resource sensitivity — branching to allow, step-up (require stronger auth / compliant device), or block, with continuous re-evaluation feeding back

Real-world scenario

MediSecure Health (the breached provider from the opening) ran a 14-month Zero Trust program after the lateral-movement incident, and the numbers tell the story of why ordering matters.

Before. A flat 10.10.0.0/16 network; ~3,200 staff with password + optional SMS MFA (≈40% enrolled); a VPN that granted a full network route; domain-joined laptops trusted by default; the EHR SQL database on an unsegmented subnet reachable from any workstation; 28 humans holding standing Global Administrator or equivalent; and siloed logs nobody correlated. The breach: a phished billing clerk → token theft → VPN route → RDP chain → 11 days of dwell → bulk PHI staged for export, caught only by a storage-egress spike.

The program, in the roadmap’s order. Phase 1 (months 1–3): MFA enforced for all 3,200 users, legacy auth blocked tenant-wide, Identity Protection on, two cloud-only break-glass accounts created and excluded from every CA policy. Account-takeover alerts dropped sharply within weeks. Phase 2 (months 3–5): every privileged role moved to PIM eligible-with-approval, standing admins cut from 28 to 0, activation gated behind FIDO2 keys + a compliant device. Phase 3 (months 5–8): 2,900 devices enrolled in Intune (BitLocker, EDR healthy, OS minimum), and CA began requiring a compliant device for the EHR and finance apps — the clinician on a personal tablet now got blocked, exactly as intended. Phase 4 (months 8–11): the flat network was carved into ASG tiers; the EHR database moved behind a private endpoint with NSG rules permitting only the app tier on 1433, and workstation→DB paths denied. Phase 5 (months 11–13): the VPN was retired for Global Secure Access per-app access to the dozen internal web apps staff actually needed. Phase 7 (ongoing): all signals flowed to Sentinel, with CAE enabled.

After. The same attack, re-run as a red-team exercise nine months in, died at the second hop: the stolen token was useless for the EHR (non-compliant device), lateral RDP to the data subnet was denied by segmentation, and the moment Identity Protection flagged the impossible-travel sign-in, CAE revoked the session inside four minutes. Mean time to revoke an offboarded user went from “up to an hour” to under five minutes. Standing admin accounts: zero. The clinician experience improved — on a managed workstation, passkeys meant no passwords. The lesson MediSecure repeats: identity-first bought ~80% of the risk reduction in the first quarter; the network and data phases, while essential, were the long tail.

Advantages and disadvantages

Zero Trust is the right architecture for the modern estate, but it is not free and not frictionless. Weigh it honestly:

Advantages Disadvantages
Bounds blast radius — one compromise can’t roam the estate Genuinely complex: many signals, products, and integrations to wire together
Context-aware, risk-adaptive access — decisions reflect now, not last login User friction if tuned badly — over-aggressive MFA/step-up frustrates legitimate users
Built for hybrid/remote/SaaS — security follows identity, not the building Identity becomes the crown jewel — compromise of the IdP is catastrophic, raising the stakes on that pillar
Maps cleanly to compliance (least privilege, audit, encryption) Legacy systems resist it — old apps lack modern auth, agents, or posture support
Continuous verification (CAE) makes offboarding and incident response actually fast Operational maturity required — break-glass, monitoring, and policy hygiene are ongoing work
Per-app access kills the VPN’s “route to everything” problem Cost and effort front-loaded — licenses (often P1/P2), tooling, and a multi-quarter program
Telemetry-driven — every decision is logged and improvable Easy to do as theater — buying “a Zero Trust product” without the architecture changes nothing

The advantages dominate for any organization with sensitive data, hybrid users, SaaS sprawl, third-party access, or a realistic threat model — now most organizations. Temper the ambition only for a tiny internal lab, a throwaway tool, or an air-gapped system — though identity hygiene (MFA, no standing admin) is cheap insurance even there. The disadvantages are all manageable: complexity yields to phasing, friction to good tuning and passwordless UX, and the identity-as-crown-jewel risk is exactly why phase 2 hardens privileged access first. The one failure that isn’t manageable is treating Zero Trust as a purchase rather than an architecture.

Hands-on lab

This lab builds the identity core of Zero Trust — Conditional Access policies for MFA, blocking legacy auth, and risk — in report-only mode in a test tenant, then validates and tears down. It is free on an Entra P2 trial (risk-based CA needs P2; plain CA needs P1). Use a non-production test tenant — Conditional Access can lock people out, which is exactly why step 1 comes first.

Step 1 — Create a break-glass account FIRST (before any policy). This is the rule that saves you.

# Sign in to the test tenant
az login --allow-no-subscriptions

# Create a cloud-only emergency account with a long random password
az ad user create \
  --display-name "Break Glass 01" \
  --user-principal-name "breakglass01@<your-test-tenant>.onmicrosoft.com" \
  --password "$(openssl rand -base64 32)" \
  --force-change-password-next-sign-in false

Record the UPN; you will exclude it from the policy in step 3. (Assign it a privileged role and a FIDO2 key in a real tenant; for the lab, the exclusion is the lesson.)

Step 2 — Inspect the existing Conditional Access policies (know your baseline).

# List current CA policies (Microsoft Graph via az rest)
az rest --method GET \
  --uri "https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies" \
  --query "value[].{name:displayName, state:state}" -o table

Expected: either an empty list or any default/security-default-derived policies. A fresh test tenant is usually empty.

Step 3 — Create a “require MFA for all users” policy in report-only mode. Report-only lets you see what would happen without locking anyone out — always start here.

cat > ca-require-mfa.json <<'JSON'
{
  "displayName": "ZT-Require-MFA-AllUsers (report-only)",
  "state": "enabledForReportingButNotEnforced",
  "conditions": {
    "users": {
      "includeUsers": ["All"],
      "excludeUsers": ["<object-id-of-breakglass01>"]
    },
    "applications": { "includeApplications": ["All"] },
    "clientAppTypes": ["all"]
  },
  "grantControls": {
    "operator": "OR",
    "builtInControls": ["mfa"]
  }
}
JSON

az rest --method POST \
  --uri "https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies" \
  --headers "Content-Type=application/json" \
  --body @ca-require-mfa.json

Expected: a 201 Created with a policy id. Note the break-glass exclusion and report-only state — both are the Zero Trust safeguards in action. Replace <object-id-of-breakglass01> with the account’s object ID (az ad user show --id <upn> --query id -o tsv).

Step 4 — Block legacy authentication (the cheapest, highest-value policy).

cat > ca-block-legacy.json <<'JSON'
{
  "displayName": "ZT-Block-Legacy-Auth (report-only)",
  "state": "enabledForReportingButNotEnforced",
  "conditions": {
    "users": { "includeUsers": ["All"], "excludeUsers": ["<object-id-of-breakglass01>"] },
    "applications": { "includeApplications": ["All"] },
    "clientAppTypes": ["exchangeActiveSync", "other"]
  },
  "grantControls": { "operator": "OR", "builtInControls": ["block"] }
}
JSON

az rest --method POST \
  --uri "https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies" \
  --headers "Content-Type=application/json" --body @ca-block-legacy.json

clientAppTypes of exchangeActiveSync and other are precisely the legacy authentication clients that bypass interactive MFA — this policy closes that hole.

Step 5 — Validate in report-only. Sign in as a normal test user (not break-glass) in a private browser window, then inspect the sign-in logs to confirm the policy would have applied:

# Check the most recent sign-ins and which CA policies evaluated (report-only shows as 'reportOnlySuccess' / 'reportOnlyFailure')
az rest --method GET \
  --uri "https://graph.microsoft.com/v1.0/auditLogs/signIns?\$top=5" \
  --query "value[].{user:userPrincipalName, app:appDisplayName, status:status.errorCode, ca:appliedConditionalAccessPolicies[].displayName}" -o json

Expected: your MFA policy appears in appliedConditionalAccessPolicies with a report-only result. This is the moment to confirm the policy targets the right people before enforcing.

Step 6 — (Optional, P2) Add a sign-in risk policy, report-only. Requires Identity Protection (P2).

cat > ca-signin-risk.json <<'JSON'
{
  "displayName": "ZT-High-SignInRisk-Block (report-only)",
  "state": "enabledForReportingButNotEnforced",
  "conditions": {
    "users": { "includeUsers": ["All"], "excludeUsers": ["<object-id-of-breakglass01>"] },
    "applications": { "includeApplications": ["All"] },
    "signInRiskLevels": ["high"],
    "clientAppTypes": ["all"]
  },
  "grantControls": { "operator": "OR", "builtInControls": ["block"] }
}
JSON

az rest --method POST \
  --uri "https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies" \
  --headers "Content-Type=application/json" --body @ca-signin-risk.json

Validation checklist. You created a break-glass account before any policy, authored MFA + legacy-block + risk policies all in report-only, excluded break-glass from every one, and confirmed in the sign-in logs that the policies evaluate against real sign-ins without enforcing yet. In a real rollout, you would watch report-only for a week, fix any surprises, then flip state to enabled — never the reverse order.

Teardown. Delete the lab policies and the break-glass account so nothing lingers:

# Delete each policy by id (repeat for each you created)
az rest --method GET --uri "https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies?\$filter=startswith(displayName,'ZT-')" --query "value[].id" -o tsv \
| while read pid; do az rest --method DELETE --uri "https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies/$pid"; done

# Remove the break-glass test account
az ad user delete --id "breakglass01@<your-test-tenant>.onmicrosoft.com"

Cost note. Conditional Access requires Entra P1; risk-based policies and Identity Protection require P2. Both are available as 30-day trials, so this lab costs nothing if you use a trial tenant. There are no per-policy or per-evaluation charges.

The lab steps mapped to what each proves:

Step What you did Zero Trust lesson
1 Break-glass account first Never build policy without an escape hatch
3 MFA policy, report-only, excluding break-glass Verify explicitly; roll out safely
4 Block legacy auth Close the #1 CA-bypass before anything else
5 Validate in sign-in logs Test in report-only before enforcing
6 Risk-based block (P2) Make authorization risk-adaptive
Teardown Remove policies + account Hygiene; reversible experiments

Common mistakes & troubleshooting

Zero Trust fails in predictable ways. Here is the playbook — symptom → root cause → how to confirm → fix — for the mistakes that bite hardest in real rollouts.

# Symptom Root cause Confirm (exact path / command) Fix
1 Everyone (including admins) locked out after a CA change No break-glass exclusion; policy too broad Sign-in logs → blocked by CA policy; check policy excludeUsers Sign in with break-glass; exclude it from all CA; fix scope
2 “Zero Trust project” stalled for a year, no value shipped Big-bang approach; trying all pillars at once Roadmap has no phased milestones Re-plan identity-first; ship phase 1 in weeks
3 MFA enforced but accounts still phished (AiTM) MFA isn’t phishing-resistant (OTP/push replayable) Auth methods report shows SMS/TOTP dominant Move admins to FIDO2/passkeys; CA authentication strength
4 Account-takeover succeeds despite CA Legacy authentication bypasses CA Sign-in logs filtered to legacy client apps show success Block legacy auth in CA (exchangeActiveSync, other)
5 Disabled/offboarded user still active for ~1 hour One-time tokens; CAE not in effect Token still valid post-disable; resource not CAE-aware Enable CAE; use CAE-aware clients; revoke sessions
6 “We segmented” but lateral movement still works VLANs without enforced rules (any-any) NSG effective rules show permissive allows Add explicit deny + least-privilege ASG rules
7 Standing admin still everywhere RBAC roles assigned permanently, not via PIM az role assignment list shows permanent Owner/GA Convert to PIM eligible; require approval + expiry
8 Health/compliance gate locks out legitimate BYOD with no path Required compliant device, no ramp/alternative CA blocks unmanaged; users have no enrolled option Phase device enrollment; offer app-protection/browser-only
9 Risk policies generate noise / false positives Untuned Identity Protection thresholds Identity Protection risky sign-ins full of benign hits Start report-only; tune; exclude known-good named locations
10 Workload (service principal) compromised, unnoticed Workload identities over-permissioned, no CA/risk App role assignments broad; no workload CA Scope app permissions; CA for workload identities; rotate/secretless
11 VPN “retired” but full network route still reachable ZTNA added alongside, VPN never decommissioned VPN gateway still up; routes present Cut over per-app to GSA/App Proxy; decommission VPN
12 Data labeled but still exfiltrated in bulk No DLP / labels not tied to enforcement Purview shows labels but no DLP policy blocking egress Add DLP rules on labeled data; gate bulk export
13 PIM approvals bottleneck incident response No emergency-access path; single approver PIM activation pending with no approver online Define break-glass + on-call approver group; SLA
14 Policies conflict / unexpected grant Multiple CA policies, OR/AND logic misunderstood “What If” tool shows an allow you didn’t expect Use What-If; consolidate; remember grant controls combine

The expanded reasoning for the ones that cause the most pain:

1. Everyone locked out after a CA change. A broad policy (“require compliant device, all apps, all users”) with no break-glass exclusion catches even admins the moment it enforces. The sign-in logs attribute the failure to your policy, and its excludeUsers is empty. Sign in with the cloud-only break-glass account (which is why it exists), exclude it from every CA policy, and re-scope the offending policy. This is the failure the lab’s step-1-first ordering prevents.

3. MFA on, but accounts still phished. The MFA in use (SMS, TOTP, push without number matching) is not phishing-resistant — an AiTM proxy relays the code in real time. The authentication-methods report shows weak methods dominating. Require phishing-resistant authentication strength in CA (FIDO2/passkeys/WHfB/CBA), starting with admins. See Phishing-Resistant Passwordless: FIDO2 & Passkeys Rollout.

5. Disabled user active for an hour. Tokens are valid for their lifetime and the resource isn’t CAE-aware, so disabling the account doesn’t revoke existing sessions until expiry. Ensure CAE is enabled and clients/resources are CAE-aware; for incident response, explicitly revoke sessions (Revoke-MgUserSignInSession / portal “revoke sessions”), which CAE enforces in minutes.

6. Segmented on paper, flat in practice. “We have VLANs/subnets” is mistaken for segmentation while the rules between zones are effectively any-any. The NSG effective security rules on a NIC show permissive allows. Add explicit least-privilege ASG rules plus an explicit deny above the default — a subnet is not an authorization boundary until a rule makes it one.

14. Unexpected grant from policy interaction. Multiple CA policies combine in ways the author didn’t intend (grant controls within a policy use AND/OR; across policies, all apply, but an exclude in one creates a gap). The Conditional Access “What If” tool replays a hypothetical sign-in and lists which policies apply and the net result. Use What-If before and after every change, and keep the policy set small and clearly named.

Best practices

Security notes

Cost & sizing

Zero Trust cost is mostly licensing and effort, not infrastructure — the controls are largely features of identity and management suites you may already own.

A rough monthly picture for a 1,000-user organization (indicative INR; verify current pricing):

Component Licensing/charge basis Rough INR / month (1,000 users) Phase Notes
Entra ID P1 (CA, App Proxy) Per user ~₹5–6 lakh (or bundled in E3) 1 Often already owned via E3
Entra ID P2 (risk, PIM, IdP) Per user ~₹8–9 lakh (or bundled in E5) 1–2 Needed for risk-based ZT
Intune (device pillar) Per user Bundled in E3/E5 / EMS 3 Compliance + posture
Azure Firewall (hub) Hourly + per-GB ~₹50,000–1,00,000+ 4 Centralized inspection/egress
Private Endpoints Per endpoint hourly + GB ~₹500–1,000 each 4 Per PaaS resource
Global Secure Access (ZTNA) Per user (separate) Offset by retired VPN 5 Net cost often near-neutral
Microsoft Sentinel Per-GB ingest + retention ~₹50,000–2,00,000 7 Sample/tier to control

Right-sizing: do the per-user identity controls first (highest ROI, often already licensed), defer infrastructure-heavy network controls to phase 4, and offset ZTNA against the VPN you decommission. The cheapest, highest-impact spend is the one you may already own — turning on MFA, CA, and PIM costs effort, not new licenses, for any E3/E5 tenant.

Interview & exam questions

1. What is Zero Trust, in one sentence, and what is the common misconception? A security architecture that removes implicit trust and verifies every access request explicitly using identity, device, and contextual signals, granting least privilege and assuming breach. The misconception is that it’s a product you buy — it’s an architectural stance integrating many controls (IdP, ZTNA, segmentation, classification) around a consistent policy, not a single appliance.

2. State the three Zero Trust principles and give a concrete control for each. Verify explicitly — Conditional Access requiring MFA + compliant device + acceptable risk. Use least-privilege access — PIM eligible-with-approval roles instead of standing admin, plus per-app access. Assume breach — micro-segmentation + CAE + a SIEM with automated response to bound blast radius and dwell.

3. Explain PDP and PEP, and name Microsoft’s implementation of each. The Policy Decision Point evaluates signals against policy and decides grant/step-up/deny — Microsoft’s is Conditional Access. The Policy Enforcement Point carries out the decision and opens or refuses the session — Microsoft’s are the token service, App Proxy / Global Secure Access, the apps, and CAE-aware resources. NIST further splits the PDP into a Policy Engine (decides) and Policy Administrator (executes).

4. What is the difference between ZTNA and a VPN? A VPN authenticates once and grants a network route — implicit trust by location. ZTNA grants access to one specific application after per-session verification of identity, device, and context, with no network exposure — reaching app A grants nothing toward app B, and there’s no lateral movement because there’s no network position.

5. What is Continuous Access Evaluation and what problem does it solve? Legacy auth checks once at login and trusts the token for its full lifetime (~1 hour), so a disabled account or a risk spike mid-session isn’t acted on until expiry. CAE has resources subscribe to critical Entra events (account disabled, password change, session revoke, risk detected) and revoke access in near real-time (minutes), making offboarding and incident response fast.

6. Why is “identity first” the right ordering for Zero Trust adoption? Identity is the new perimeter and the prerequisite for every other pillar — device, network, and data policies all key off who the identity is and its risk. Identity controls (MFA, block legacy auth, PIM) are also the highest-ROI and often already licensed, delivering the largest risk reduction in the first quarter before the costlier network and data phases.

7. What is the difference between segmentation and just having VLANs/subnets? A VLAN or subnet is a broadcast/address boundary, not an authorization boundary. Real segmentation enforces what may cross between zones with least-privilege rules (NSG/ASG denies, firewall inspection). A network with many VLANs but any-any rules is, to an attacker, one flat network.

8. What does NIST SP 800-207 contribute, and how does it relate to Microsoft’s model? NIST 800-207 is the vendor-neutral Zero Trust Architecture standard: it defines the logical components (Policy Engine/Administrator/Enforcement Point + inputs) and seven tenets. Microsoft’s model and CISA’s maturity model operationalize the same ideas around the five pillars — NIST for vocabulary, Microsoft/CISA for the roadmap.

9. Why is break-glass essential in a Zero Trust rollout, and how do you configure it? Zero Trust deliberately makes access conditional, so a Conditional Access misconfiguration can lock everyone out — including admins. Break-glass accounts are 2+ cloud-only emergency accounts excluded from all CA policies, secured with vaulted passwords + FIDO2, alerted on for every sign-in, and tested on a schedule.

10. What is SASE, and how does ZTNA fit into it? SASE converges networking (SD-WAN) with Security Service Edge (SSE) delivered from the cloud near the user. SSE bundles ZTNA + Secure Web Gateway + CASB + FWaaS (and often in-line DLP). ZTNA is the private-access component; the others handle internet/SaaS. Microsoft’s Global Secure Access is its SSE, integrated with Conditional Access.

11. How do you protect workload identities under Zero Trust, and why do they matter? Service principals and managed identities are increasingly attacker targets because they’re often over-permissioned and unmonitored. Protect them by scoping permissions tightly, applying Conditional Access for workload identities and Identity Protection risk, preferring managed identities / federated credentials over secrets, and rotating the rest. A compromised over-privileged workload is as dangerous as a compromised admin — and quieter.

12. Give an example of the trust algorithm producing a graded decision for the same user. A clinician on a managed, compliant workstation from the hospital network reaching a low-sensitivity app passes silently. The same clinician on an unmanaged tablet from an anonymous IP reaching the EHR is stepped up or blocked — the trust algorithm weighs device posture, location, risk, and resource sensitivity together, not a flat allow/deny.

These map to SC-100 (Cybersecurity Architect)design a Zero Trust strategy and architecture is a major domain — and to SC-300 (Identity and Access Administrator) for the Conditional Access, PIM, and Identity Protection mechanics. AZ-700 / SC-200 touch the network-segmentation and detection-and-response angles. A compact cert mapping:

Question theme Primary cert Objective area
Zero Trust strategy, pillars, NIST SC-100 Design a Zero Trust strategy & architecture
Conditional Access, PIM, Identity Protection SC-300 Implement access management & governance
Micro-segmentation, private connectivity AZ-700 Design & implement network security
CAE, risk, detection & response SC-200 Mitigate threats; respond with automation
Data classification, DLP, labels SC-400 Implement information protection

Quick check

  1. Name the three Zero Trust principles, and which one most directly produces micro-segmentation as an architectural requirement.
  2. A user’s account is disabled during an active session, but they can still call an API for nearly an hour. What mechanism is missing, and what does it do?
  3. True or false: deploying a VPN with MFA satisfies Zero Trust network access.
  4. You are starting a Zero Trust program with limited budget this quarter. What are the top two moves, and why those?
  5. What is the difference between the PDP and the PEP, and which Microsoft service is the PDP?

Answers

  1. Verify explicitly, use least-privilege access, assume breach. Assume breach most directly produces micro-segmentation — if you design as though the attacker is already inside, bounding their reach (segmentation, per-app access) becomes a requirement rather than an option.
  2. Continuous Access Evaluation (CAE) is missing. CAE has resources subscribe to critical Entra events (account disabled, password change, risk detected, session revoke) and revoke access in near-real-time (minutes) instead of waiting out the token’s ~1-hour lifetime.
  3. False. A VPN — even with MFA — grants a network route, which is implicit trust by location; once connected, lateral movement across the network is possible. Zero Trust network access (ZTNA) grants per-app access with no network exposure, so reaching one app grants nothing toward others.
  4. (1) Enforce MFA for all users and block legacy authentication, and (2) move admins to PIM with phishing-resistant MFA and remove standing admin. They’re the highest-ROI moves (stopping the cheapest, most common attacks and hardening the most dangerous accounts), they’re often already licensed via E3/E5, and identity is the prerequisite pillar for everything else.
  5. The PDP (Policy Decision Point) evaluates a request’s signals against policy and decides grant/step-up/deny; the PEP (Policy Enforcement Point) enforces that decision by opening or refusing the session. In Microsoft’s stack the PDP is Conditional Access; the PEPs are the token service, App Proxy / Global Secure Access, the apps, and CAE-aware resources.

Glossary

Next steps

You can now design a Zero Trust architecture pillar by pillar and sequence its adoption. Build outward:

SecurityZero TrustConditional AccessMicro-segmentationZTNASASENIST 800-207Entra ID
Need this built for real?

Vinod is a Senior Cloud Architect (22+ yrs) — available for Azure / AWS / GCP architecture, landing zones, and migrations.

Work with me

Comments

Keep Reading