Most engineers think…
A ZPA Access Policy is just like a firewall rulebase - so end it with a Deny Any-Any to be safe.
Wrong - and that bottom deny can break you. ZPA is implicit-deny by default: anything no ALLOW rule matches is already denied. Every rule you write only opens a door; the wall is pre-built. Add a manual block-all and you risk mis-ordering it above your ALLOWs. Get this, and rule order, identity toggles and posture all click into place.
① Default-deny by design: the rule you never have to write
The first thing that trips up engineers moving from firewalls to ZPA: there is no bottom "block all" rule — and you must not add one. A ZPA Access Policy is implicit-deny: if no ALLOW rule matches a request, the session is denied automatically. Every rule you write only ever opens a door; the wall is already there. We taught the components, the inside-out microtunnel and the object chain in the ZPA Fundamentals lesson — this lesson is only about the decision engine that sits at step ② of that microtunnel and says yes or no.
Think of a five-star hotel concierge. You do not walk up with a list of every room you are not allowed into — that list would be infinite. Instead the concierge holds a short book of who is allowed where, reads it top to bottom, and the moment one line says "this guest, this room — yes", they stop reading and walk you there. Everyone whose name appears in no line simply does not get a room. That short book is your Access Policy; the infinite "not allowed" list is the implicit deny you never type.
Four myths to flip before we go deeper
Tap each card — front is the assumption most engineers carry over from firewalls, back is the ZPA correction.
No. ZPA is implicit-deny already. A manual block-all is redundant and can mis-order above your ALLOWs. Never write one.
Order is the policy. First-match, top-down — a broad ALLOW above a narrow DENY makes the DENY dead code.
Half right. Different types are AND-ed; multiple values inside one type are OR-ed. Finance OR Treasury, AND Windows.
No. Posture and Trusted Network are ZCC-only — clientless Browser Access and PRA have no agent to report device health.
Anjali at Infosys faces this
Anjali, an L1 engineer migrating from a Palo Alto firewall, writes a beautiful ZPA policy and, out of habit, adds a final "Deny Any-Any" rule at the very bottom "to be safe". Now even her correctly-authorised Finance users are blocked.
On a firewall the explicit bottom deny is normal. In ZPA the deny is already implicit, and a manual broad DENY can sit above later ALLOW logic in priority — or simply be redundant noise that confuses the next engineer.
Open the policy and check rule order. A broad DENY high in the list will short-circuit every ALLOW below it.
Policy ▸ Access Policy ▸ (review rule order)Delete the bottom block-all entirely — ZPA does not need it. Keep only narrow DENY exceptions, and put each one above the broad ALLOW it must override.
Re-test a Finance user; the access log now shows an ALLOW against the intended rule, not a deny.
② The criteria menu: what a rule is allowed to look at
A ZPA rule is a set of conditions plus one action (Allow Access or Block Access). Each condition is a criterion type, and ZPA gives you a fixed menu of them. Knowing the menu — and the exact logic that joins them — is most of the skill.
- Application Segment / Segment Group — which app the rule governs. Rules normally target a Segment Group, not a bare segment.
- SAML Attribute — an attribute (department, email domain, employee type) your IdP asserts at login. Usable only if a per-IdP toggle is on (Section 4).
- SCIM Group / SCIM Attribute — group membership SCIM-synced from your IdP (Entra, Okta).
- Posture Profile — a device-health check (EDR present, disk encrypted, a CrowdStrike ZTA score above a threshold). ZCC-only.
- Trusted Network — is the device on a known corporate network? ZCC-only.
- Platform / OS — Windows, macOS, iOS, Android, Linux.
- Country — the source country of the request (geo-fencing).
- Client Type — ZCC (the agent), Browser Access (clientless web), or PRA. This one quietly decides whether posture and trusted-network even apply.
You write a ZPA Access Policy with three ALLOW rules and nothing else. A request matches none of them. What happens, and do you need a bottom "Block All"?
Pause & Predict
A rule has SCIM Group = (Finance OR Treasury) AND Platform = Windows. A Treasury user on a Mac requests the app. Allowed or denied — and why? Type your guess.
③ Building the rule in the console — Add Access Policy Rule
Here is the actual Add Rule screen, recreated so you recognise the real one. This single rule reads "Finance OR Treasury, on a managed Windows or Mac device that passes posture, may reach SAP — everyone else hits default-deny." Notice the criteria builder, the AND joins, the action dropdown, and the rule-order field.
▶ Watch one request walk the rules
A Finance user on a compliant Windows laptop requests SAP. Press Play for the healthy first-match path, then Break it to see what a mis-ordered broad ALLOW does.
Rohan puts a broad "ALLOW all employees → all apps" rule at order 1, and a narrow "DENY contractors → finance app" rule at order 5. Contractors still reach the finance app. Why?
Rohan at TCS faces this
Rohan needs to block one contractor group from the payroll app while still allowing all staff broad access elsewhere. He adds the DENY, but it never seems to take effect.
His broad ALLOW sits above the narrow DENY, so first-match grants access before the DENY is read.
Compare the two rules' Rule Order values; the DENY has a higher (lower-priority) number.
Policy ▸ Access Policy ▸ (drag DENY above ALLOW)Re-order so the narrow contractor DENY is above the broad staff ALLOW. Re-test the contractor — now the DENY matches first.
The contractor's access log shows a BLOCK against the DENY rule, not an ALLOW.
④ The identity gate: SAML, SCIM and the toggle that fails silently
Identity criteria are where most "valid login but blocked" tickets come from. ZPA does not trust IdP attributes by default — you must explicitly enable, per IdP, that those attributes may be used in policy. There are two switches, under Administration ▸ IdP Configuration:
- "SAML Attributes for Policy" — enables SAML attribute criteria (department, employeeType, etc.).
- "SCIM Attributes and Groups for Policy" — enables SCIM group / attribute criteria.
The trap: if the relevant toggle is off, ZPA does not error and does not log a deny — it silently ignores that criterion. A rule whose match depends on it then never matches, and the user falls through to default-deny despite a perfectly valid SSO login. The symptom is a rule that is skipped, not denied, in the logs.
▶ Watch a valid login get silently dropped
A Finance user with correct SSO requests SAP. Press Play for the healthy identity-gated path, then Break it to see what "SAML Attributes for Policy = off" does.
A user passes SSO but is blocked from an app while colleagues in the same AD group get in. Diagnostics show the ALLOW rule is skipped — not matched, not logged as a deny. What do you check first on the IdP config?
Priya at Wipro faces this
Priya's Finance team is blocked from an internal payments dashboard even though their SSO succeeds and the ALLOW rule names their group. The access log shows the rule was never matched — no deny event at all.
Two suspects: "SAML Attributes for Policy" is off on the IdP (so the attribute criterion is ignored), or Entra SCIM never expanded a nested group, so child-group-only users are absent from the parent roster the rule references.
Open the IdP config and confirm the toggle; then check whether the affected users are direct members of the referenced group.
Administration ▸ IdP Configuration ▸ Edit IdPEnable "SAML Attributes for Policy" (and the SCIM equivalent). Flatten nested groups into a dedicated ZPA group with direct members, then trigger a manual SCIM sync (default cycle ~40 min) instead of waiting.
Re-test a Finance user; the log now shows an ALLOW against the intended rule.
Disclosed 5 Aug 2025 (CVSS 9.6, Critical): a ZPA component did not properly verify the cryptographic signature on the SAML assertion, so a crafted, unsigned or tampered SAML response could be accepted as genuine — a full authentication bypass that lets an attacker impersonate any user and walk straight past every identity criterion in your Access Policy. Because the entire policy engine trusts the asserted identity, a SAML-signature flaw silently invalidates all of your SCIM/SAML rules at once, no matter how carefully ordered. Fix: nothing to patch on your side — Zscaler fixed this server-side across all clouds, with no customer patch or ZCC upgrade required. Still: confirm SAML response signing is enforced end-to-end on the IdP, and audit IdP/SSO logs for any assertions that may have bypassed signature checks.
Pause & Predict
Why does a SAML-signature-verification bug (CVE-2025-54982) undermine even a flawless, well-ordered Access Policy? Type your guess.
⑤ Device posture as a condition — and the ZCC-only catch
A Posture Profile lets a rule demand a healthy device, not just a valid identity. ZPA integrates with EDR vendors — most notably CrowdStrike, which pushes a real-time ZTA device score into ZPA. You can gate a rule on "score ≥ 70", and crucially ZPA can terminate an in-flight session the instant the score drops below the threshold — continuous, not just at login.
The hard catch every exam loves: Posture Profile and Trusted Network only evaluate for Client Type = ZCC. They are collected by the agent, so a clientless path has nothing to report. Add a posture criterion to a Browser Access or PRA rule and ZPA rejects it. Gate clientless access with what you actually have: SAML/SCIM group and Country.
An admin tries to add a Posture Profile criterion to a Browser Access (clientless) rule for contractors "to harden it". What happens?
Pause & Predict
A laptop is reaching SAP under a posture-gated ZCC rule. Mid-session its CrowdStrike score drops below 70. What does ZPA do, and why is this different from a VPN? Type your guess.
Karthik at Infosys faces this
Karthik must give an external auditor SSH to a Linux box (no agent allowed) AND gate his own staff by device health. He tries one Browser Access rule with a posture check for everyone and it will not save.
He is mixing two needs. SSH is not Browser Access at all, and posture cannot live on a clientless rule.
Split it: give the auditor PRA (clientless HTML5 SSH) gated by SAML/SCIM + Country — no posture; give staff a ZCC rule with the Posture Profile. Two client types, two rules.
The staff rule saves with posture; the auditor rule saves only after the posture criterion is removed — proof the client-type gate is real.
⑥ Scale limits & the Timeout Policy that runs after access
Two numbers shape large estates. The Access Policy is capped at roughly 256 rules per tenant, and a tenant supports up to 48 App Connector Groups. Hit the rule cap and you must collapse rules — bundle more apps into Segment Groups and gate by broad SCIM groups — trading fine granularity for headroom. This is the real reason mature ZPA designs lean on Segment Groups and group-based identity rather than per-app, per-user rules.
Access Policy decides whether a session is allowed. A separate Timeout Policy decides how long an idle session lasts before re-authentication — and it runs after access is granted, not during the allow/deny decision. The minimum idle timeout is 10 minutes, and when multiple Timeout rules match a session, the effective timeout is the MINIMUM across them (the strictest wins), not the first match. Do not confuse the two policies: a user who "keeps getting logged out" is a Timeout question, not an Access question.
GET /mgmtconfig/v1/admin/customers/72058304855015433/policySet/rules/policyType/ACCESS_POLICY
# ALLOW rule, order 3, scoped to the SAP segment group
{ "name": "Allow-Finance-SAP", "action": "ALLOW", "ruleOrder": "3",
"conditions": [
{ "operator": "AND", "operands": [
{ "objectType": "SCIM_GROUP", "lhs": "Finance" },
{ "objectType": "PLATFORM", "lhs": "windows", "rhs": "true" },
{ "objectType": "POSTURE", "lhs": "Compliant-Win", "rhs": "true" } ] } ] }
# Timeout Policy — effective idle timeout is the MINIMUM of all matching rules
GET /mgmtconfig/v1/admin/customers/72058304855015433/policySet/rules/policyType/TIMEOUT_POLICY
{ "name": "SAP-strict-idle", "reauthIdleTimeout": "600", "reauthTimeout": "36000" } # 600s = the 10-min floorACCESS_POLICY : 184 rules returned (cap ~256 — 72 rules of headroom left) order 1 Deny-Contractors-Payroll BLOCK order 3 Allow-Finance-SAP ALLOW ← first match for Finance/Windows/compliant (no terminal block-all rule present — implicit default-deny is in effect) TIMEOUT_POLICY : effective idle timeout = 600s (MINIMUM of 600 / 1800 matched)
Read the output like a debugger: the ALLOW sits at order 3 below the contractor DENY, there is deliberately no bottom block-all, and the effective idle timeout is the smallest matching value, not the first.
Vikram at Flipkart faces this
Vikram's ZPA tenant has grown to nearly 256 Access rules and the console refuses to let him add the next one. Every new app currently gets its own user-specific rule.
He has hit the ~256-rule-per-tenant cap because the design is one rule per app per user group — the most granular and least scalable pattern.
Count the rules and look for many near-identical ALLOWs that differ only by app.
Policy ▸ Access Policy ▸ (rule count near cap)Collapse: bundle related apps into Segment Groups and write one broad SCIM-group ALLOW per business function. Trade per-app granularity for headroom — that is the intended design at scale.
Rule count drops well under 256 and the same users still reach the same apps via the consolidated Segment Group rule.
Sneha at HDFC Bank faces this
Sneha's traders complain they are forced to re-authenticate "every few minutes" on the trading app, even though access is granted fine. She has been editing Access Policy rules looking for the cause.
This is a Timeout Policy issue, not Access Policy. Two Timeout rules match the trading app, and ZPA applies the MINIMUM idle timeout of the two — the strictest one wins.
List the Timeout rules matching that segment group and find the smallest reauthIdleTimeout.
Policy ▸ Timeout Policy ▸ (rules matching the segment)Raise or remove the overly-strict Timeout rule (respecting the 10-minute floor) so the minimum across matches is acceptable. Leave Access Policy untouched — it was never the problem.
The API shows the effective idle timeout for the segment is now the intended value; traders stop getting re-prompted.
Do not start with per-user, per-app rules. From the first rule, gate by SCIM group and target Segment Groups, not bare segments. A Finance group reaching a "Finance-Apps" Segment Group is one rule that scales to fifty apps; fifty per-app rules will wall you into the ~256 cap and force a painful re-architecture later.
Never trust "the rule looks right" as proof a user can get in. Confirm it the right way: the user's access log shows an ALLOW against the exact rule and Segment Group you expect. A rule that is skipped (no match, no deny logged) almost always means an identity toggle is off or a nested group never synced. A logged deny means a real criterion failed (wrong posture, wrong country). The log distinguishes the two in seconds — the rule screen cannot.
🤖 Ask the AI Tutor
Tap any question — instant, scoped to this lesson. No login, no waiting.
Pre-curated from Zscaler docs + community Q&A, scoped to this lesson. For a live prod issue, paste your export into chat.techclick.in.
📝 Wrap-up assessment — six more
You've answered 4 inline. Six left. 70% (7 of 10) marks the lesson complete on your profile. Tap Submit all answers at the end.
🧠 In your own words
Type one line: why does a ZPA Access Policy never need a bottom block-all rule? Then compare to the expert version.
🗣 Teach a friend
Best way to lock it in — explain it in one line to a teammate. Tap to generate a paste-ready summary.
📖 Glossary
- Access Policy
- ZPA's first-match, top-down rule list that decides whether a brokered session may reach a private app. Implicit default-deny — no bottom block-all needed.
- Implicit default-deny
- ZPA's built-in behaviour: any request that matches no ALLOW rule is denied automatically. You never write a terminal block-all rule.
- First-match evaluation
- Rules are read top-to-bottom by order; the first rule that matches decides the outcome and evaluation stops. Rule order is the policy.
- Criterion type
- A category a rule can test: Application Segment/Segment Group, SAML Attribute, SCIM Group, Posture Profile, Trusted Network, Platform, Country, Client Type.
- AND / OR logic
- Different criterion types in one rule are joined by AND (you must satisfy all); multiple values inside a single type are joined by OR (any one is enough).
- SAML Attributes for Policy
- A per-IdP toggle (Administration ▸ IdP Configuration). If off, SAML attribute criteria are silently ignored and matching rules never fire.
- SCIM
- System for Cross-domain Identity Management — auto-syncs users/groups from your IdP into ZPA. Nested groups are NOT auto-expanded.
- Posture Profile
- A device-compliance criterion (EDR present, disk encrypted, a CrowdStrike ZTA score) collected by ZCC. Usable only on Client Type = ZCC.
- Trusted Network
- A criterion checking whether the device is on a known corporate network. ZCC-only — never available to Browser Access or PRA.
- Client Type
- The access mode a rule applies to — ZCC (agent), Browser Access (clientless web) or PRA. It decides whether posture/trusted-network are even evaluated.
- CrowdStrike ZTA score
- A real-time device-health score CrowdStrike pushes into ZPA; a rule can gate on a threshold and terminate a session if the score drops mid-session.
- Segment Group
- A bundle of Application Segments that an Access Policy rule targets. Rules point at groups, not bare segments — and the unit you collapse to at scale.
- Browser Access (BA)
- Clientless ZPA for HTTP/HTTPS apps via a reverse proxy at the Service Edge. No ZCC, so no posture or trusted-network checks.
- Timeout Policy
- A separate policy that runs AFTER access is granted, deciding idle re-auth timing. Minimum 10 min; with multiple matches the effective value is the MINIMUM.
📚 Sources
- Zscaler Help — Configuring Access Policies (first-match top-down evaluation by priority; AND-between-types / OR-within-a-type criteria; Allow Access vs Block Access; implicit-deny by default — no bottom block-all). help.zscaler.com/zpa
- Zscaler Help — About IdP Configuration (the per-IdP "SAML Attributes for Policy" and "SCIM Attributes and Groups for Policy" enable gates that make attributes usable in rules). help.zscaler.com/zpa
- Zscaler Product Insights — ZPA and CrowdStrike: device-health integration (real-time ZTA score thresholds, session terminated on score drop, requires ZCC — not Browser Access/PRA). zscaler.com/blogs
- PeerSpot / community practitioner reviews — ZPA pros & cons (the ~256-rule-per-tenant policy cap, connector-group ceiling, IdP wiring complexity). peerspot.com
- NVD — CVE-2025-54982, Zscaler Client Connector / ZPA SAML signature not verified → authentication bypass (CVSS 9.6 Critical; patch + enforce SAML response signing). nvd.nist.gov
- Zscaler Cyber Academy — ZDTA / EDU-200 blueprint (ZPA Access Policy objectives: criteria types, first-match, SAML/SCIM, posture, Browser Access, PRA, Timeout Policy). zscaler.com
- Zscaler Help — About Timeout Policy (runs after access; 10-minute idle minimum; effective timeout is the minimum across matching rules). help.zscaler.com/zpa
What's next?
You can now reason about who ZPA lets in. Next, go clientless: how Browser Access and PRA give contractors and BYOD users app access with no agent - and exactly what posture you give up by going clientless.