ZIA • Policy Enforcement • Order of Execution • Field Notes

Every security feature you enable participates in a defined enforcement model. For web traffic, a blocking violation stops the policies that follow, and the applicable sequence changes depending on whether ZIA is evaluating a GET request, a POST request, or the response.

Why this one exists

There is a sentence that turns up early in most ZIA projects, usually said with relief:

“We’re buying a cloud proxy. We don’t have to manage the infrastructure anymore.”

The first half is true, and it is a substantial win. The racks, cooling, capacity planning, patching and hardware refresh genuinely stop being your problem.

The second half is where the trouble starts, because not managing the infrastructure is not the same thing as not managing the service.

The platform offers URL filtering, cloud app control, tenant restrictions, firewall, DNS control, IPS, SSL inspection, DLP, sandbox, file type controls, antivirus and advanced threat protection. It is understandable for an organization to enable as much as its licence permits. But these controls do not operate as unrelated appliances, and enabling more functions does not remove the need to understand how their decisions interact.

First, the vocabulary

The rest of this article talks about GET requests, POST requests, CONNECT, SNI and responses as though everybody works with them daily. Plenty of people who have to understand ZIA policy do not, and the enforcement order makes very little sense without them.

So this section is a short primer on what actually happens when a browser opens an HTTPS page. None of it is Zscaler-specific — it is how the protocols work, and it would be equally true with any proxy, or with none at all. If it is already familiar, skip to the next section.

One request, eight stages

A user types an address and presses enter. To the user that is one action. To the network it is a sequence, and each step exposes something different to anything sitting in the path.

The stages of an HTTPS request from resolving the name to receiving an encrypted response, with a band below showing what an on-path system can observe at each stage
Figure 1. Eight stages, and the band underneath shows what is legible at each one. Everything a content policy needs exists only in the last two. Original diagram — Zero Trust Navigator.

Resolving the name. Before anything can be sent, the hostname has to become an address. At this point the only information in play is the name being looked up and the answer that comes back.

Opening the transport. A TCP connection, or a QUIC session over UDP. What is visible is an address and a port — enough to know that something is talking to something, and nothing about what.

Reaching the destination. This step differs depending on how traffic is being forwarded, which is the subject of the next figure. In one arrangement the browser issues a CONNECT naming the destination. In the other it simply opens a connection, and the domain has to be learned elsewhere.

Beginning TLS. The client sends a ClientHello, and inside it the Server Name Indication — the SNI — which states which hostname the client wants. The SNI travels in the clear. This single fact is why a security platform can make domain-level decisions on encrypted traffic without decrypting anything, and a great deal of policy depends on it.

The server responds with its certificate. Historically this was another way to learn the destination name when no SNI was present. It is becoming less useful: under TLS 1.2 the certificate is sent in the clear, but under TLS 1.3 it is encrypted as part of the handshake. Treating it as a dependable fallback is increasingly optimistic.

The handshake completes, keys are agreed, and from here everything is encrypted.

The request, and then the response. This is where the method, the full URL, the headers and the body finally exist — and where an uploaded file or a downloaded document lives. On the wire they are indistinguishable from noise unless something is decrypting.

Almost everything a content policy wants to read exists only in the last two stages, and only after decryption.

One caveat, since this article is careful about such things elsewhere: where Encrypted Client Hello is deployed, the SNI assumption in stage four no longer holds. It is not yet widespread, and it is worth watching.

Two ways traffic arrives, and two first questions

The third stage above is where a real difference appears, and it changes what the first usable piece of information is.

Explicit proxy compared with transparent forwarding: in the first the browser addresses the proxy with a CONNECT request, in the second the traffic is tunnelled and the proxy sees the ClientHello directly
Figure 2. Same destination, same browser, two different first pieces of information for whatever is sitting in the path. Original diagram — Zero Trust Navigator.

With an explicit proxy, the browser has been told there is a proxy and addresses it deliberately. For an HTTPS destination it issues a CONNECT request naming the host and port — CONNECT portal.example.com:443 — and asks the proxy to open a tunnel. The destination domain is therefore stated in the clear, in an ordinary HTTP request, before any TLS begins.

With transparent forwarding — a GRE or IPsec tunnel from a location, or a tunnel established by an endpoint client — the browser has no proxy configured. As far as it is concerned it is connecting straight to the destination. The steering happens underneath, and no CONNECT request is ever generated. What arrives is the TLS ClientHello, and the domain has to be read from the SNI.

Worth being precise about: with tunnel-based client forwarding, the browser does not address the Public Service Edge as its HTTP proxy at all. The traffic is steered rather than proxied by configuration, which is why the first observable is a ClientHello rather than a CONNECT.

Both paths end up able to make a domain-level decision. They simply learn the domain from a different place, at a slightly different moment, and that is enough to matter when you are reconstructing why something was allowed or blocked.

There is no such thing as an HTTP packet

This one clears up a confusion that turns up constantly in troubleshooting conversations, usually in the form of somebody asking to see “the HTTP packet”.

The layers between an HTTP message and the packets on the wire, showing that the same data is divided differently at each layer and that the boundaries do not line up
Figure 3. The same data, divided differently at every layer. The dashed lines show that none of those divisions agree with each other. Original diagram — Zero Trust Navigator.

An HTTP message is a logical thing: a method, a URL, headers and possibly a body. It is what a policy wants to read, and it has no fixed size.

That message is carried inside TLS records, which encrypt it. One message can span several records, and one record can carry parts of more than one message.

Those records are carried inside TCP segments, or divided differently again by QUIC over UDP. And those in turn travel as IP packets, which is what is actually on the wire.

The important part is that none of these boundaries line up. A single HTTP request can be spread across many packets, and a single packet can contain the tail of one thing and the beginning of another.

Which is why an inline system reassembles rather than judges packet by packet, and why some decisions cannot be taken on the first thing that arrives.

GET, POST and the response are three different subjects

Finally, the distinction that matters most for everything that follows, because the enforcement order treats these three as genuinely different things.

What information exists in an HTTP GET request, an HTTP POST request and a response, and why each one is a different subject for policy
Figure 4. Three moments, three sets of available information. A policy can only judge what exists at the moment it runs. Original diagram — Zero Trust Navigator.

A GET request asks for something. It carries a destination, a method, a URL and headers. What it does not carry is a body being uploaded, and nothing has been returned yet. There is no file to scan, because no file has arrived.

A POST request sends something. It carries everything a GET carries, plus an outbound body: form data, a submitted document, an uploaded file. This is the moment where content leaving the organization exists.

A response is what comes back: a status, headers, and an inbound body — a page, a document, a downloaded file. This is the moment where content arriving at the organization exists.

GET is where the user is going. POST is what the user is sending. The response is what the destination is returning.

Hold on to that, because the next few sections are built on it. When the platform applies a different set of policies to each of the three, it is not being arbitrary. It is applying the policies that have something to read.

Part one

The model

1. Nine products, or one decision

Ask an engineer who grew up with appliances what a security stack looks like, and the answer is a list of boxes: a VPN concentrator, firewall, proxy, DNS server, IPS, antivirus gateway, DLP appliance and sandbox.

One function, one box, one configuration and one console. Each could be tuned without necessarily considering the internal decision model of the others.

The appliance model compared with a single ZIA inspection pass
Figure 5. Eight boxes with eight configurations, or one pass read by multiple security engines. Original diagram — Zero Trust Navigator.

Zscaler’s Single Scan Multi-Action architecture works differently. Packets are placed in shared memory available to the CPUs on a Public Service Edge, with dedicated processing resources for different functions. The inspection engines can inspect the same packets in a single pass rather than sending traffic through a chain of independent appliances.

After the SSMA inspection process is complete, the Public Service Edge executes policies with specific precedence.

The inspection engines can operate on the same traffic within SSMA. Policy enforcement then follows the documented precedence. That distinction governs the rest of this article.

Field note: turning everything on at once is not a security posture. Introduce controls in a sequence that lets the team identify which policy produced each outcome.

2. “Why is there no NOT?”

Here is an objection I have heard more than once, usually from somebody competent, usually about two weeks in.

“Why can’t I write all groups except that one? I have to build two rules to express something that should be one condition.”

Many ZIA policy criteria are expressed through combinations of AND between criterion families and OR within selected families. The exact selectors vary by policy. A policy may, for example, treat users, groups or departments as alternatives within one family while combining that result with locations, time and other criteria.

Where a policy does not expose an exclusion selector, the usual supported design is structural: place a narrow exception rule above the broader rule and let rule order determine which one matches first. Some policy types provide dedicated exception constructs, exclude options or alternative evaluation modes, so this should not be treated as a universal statement that every ZIA policy behaves identically.

What you are actually paying for

A service running globally and evaluating policy at scale has to favour constructs that remain predictable, supportable and understandable under operational pressure.

A missing option may be a product limitation, a deliberate design choice, or a construct expressed elsewhere in the policy model. The practical question is whether the supported alternative remains clear, testable and maintainable.

You are buying scale, speed and resilience. The trade-off is that not every appliance-era customization has a direct one-rule equivalent.

And the honest question underneath

It is worth asking of each customisation: how much of this is a real requirement, and how much is a technical flourish?

Some exclusions exist because a regulator demands them. Others exist because somebody could build them elegantly, and nobody asked whether two supported rules would have been sufficient.

At the next software release or service change, what happens to my beautifully engineered custom configuration?

The truthful answer is that it needs to be validated. That is comfortable in a lab and less comfortable in production, where undocumented behaviour is difficult to support when the original designer is no longer available.

Two rules in a supported construct that anybody can read are not necessarily a compromise. Quite often they are the more maintainable design.

3. Two modules, three paths

Each Public Service Edge has two main modules that apply policy: a web module and a Firewall module. Which module sees a transaction depends on the traffic type, direction and whether the relevant Firewall policy is enabled for the location.

Traffic flows through the ZIA Firewall and web modules
Figure 6. Outbound web traffic can touch both modules; outbound non-web traffic uses the Firewall module; inbound web responses use the web module. Original diagram — Zero Trust Navigator.

Outbound web traffic is evaluated by the Firewall module when the documented enforcement conditions are met. If it violates a Firewall policy, it is blocked there. If it passes, it proceeds to the web module.

Outbound non-web traffic going to ports other than 80 and 443, or other configured HTTP and HTTPS ports, is evaluated only by the Firewall module when Firewall policy is enabled for the location.

Inbound web traffic, meaning a response to an HTTP GET or POST request, is sent to the web module. It is not sent back through the Firewall module for another policy evaluation.

Why two log views can disagree about one transaction

When web traffic violates a Firewall policy, both Firewall Insights and Web Insights indicate that it was blocked. If it passes the Firewall policy and is later blocked by a web policy, Firewall Insights can show it as allowed while Web Insights shows it as blocked.

Both views describe the outcome observed by their respective modules.

And the firewall does not have the final word

Zscaler’s example allows Box.net in Firewall policy and blocks the same application in Web policy. The user is blocked because a Firewall allow permits evaluation to continue; it does not exempt the transaction from the web module.

4. Three transactions, three orders

There is not one web-policy sequence. Zscaler documents three separate enforcement orders, with different policies and lengths, depending on whether the web module evaluates an HTTP GET request, HTTP POST request, or the response.

The documented policy orders for GET, POST and response traffic
Figure 7. Ten policy stages on a GET, fourteen on a POST and nine on the response. Original diagram — Zero Trust Navigator.

GET request: Custom Malicious URLs, Cloud App Control, URL Filtering, Security Exceptions, Browser Control, Country-Based Blocking, IPS Signature Detection, Suspicious Content Protection, P2P Control and Bandwidth Control.

At this stage ZIA evaluates the outbound request to retrieve a resource. Controls that operate on uploaded or returned files appear in the POST or response sequences instead.

POST request: Custom Malicious URLs, Cloud App Control, URL Filtering, Security Exceptions, Browser Control, Country-Based Blocking, Malicious URL Block, IPS Signature Detection, Suspicious Content Protection, Malware Protection, File Type Control, Data Loss Prevention, P2P Control and Bandwidth Control.

Response: Security Exceptions, IPS Signature Detection, Suspicious Content Protection, Sandbox for known malicious files, Malware Protection, File Type Control, Sandbox for unknown files, AI/ML-based Content Categorization and Bandwidth Control.

A blocking violation stops the policies that follow

When the web module determines that a transaction violates a specific policy, the Public Service Edge immediately blocks that transaction and does not continue enforcing the policies that follow.

Zscaler’s documentation provides a worked example in which File Type Control blocks an outbound PDF before DLP can evaluate the sensitive data inside it. File Type Control appears at position eleven in the POST sequence, before DLP at position twelve.

The file is blocked, but DLP is not triggered and its configured auditor notification is not generated. The immediate security objective is met, while the expected DLP event and compliance notification are not produced.

Field note: a security outcome and a compliance outcome are not the same thing. Enforcement order can deliver one without the other.

What Security Exceptions actually does

Security Exceptions is an allowlist configured in the Security Exceptions tab of Malware Protection or Advanced Threat Protection. For a matching URL, the Public Service Edge skips the relevant Malware Protection, Advanced Threat Protection and Sandbox checks identified by the documentation.

It is a targeted exemption from threat controls, not a universal allowlist that overrides every access policy.

Part two

What the order can actually see

5. When only the domain exists

The sequence is defined, but the information available to its controls depends on the stage of the connection. The sharpest example is encrypted traffic before decryption.

Policies available when ZIA can see only the destination domain
Figure 8. During CONNECT or SNI evaluation, the documentation identifies four domain-based policy checks. Original diagram — Zero Trust Navigator.

During a CONNECT request or an incoming SSL/TLS connection evaluated through Client Hello SNI, ZIA has the destination domain, not the full URL or HTTP headers.

The documented subset is Known Malicious URLs, Cloud App Control, URL Filtering and Bandwidth Control.

Where evaluation starts depends on traffic forwarding

In explicit proxy mode, URL Filtering and Cloud App Control are evaluated against the first CONNECT request, and the SSL/TLS Inspection policy is evaluated against that CONNECT request.

In transparent proxy mode, the first policy evaluation occurs on the incoming SSL/TLS connection using the SNI.

Without user context, evaluation is skipped rather than guessed

Surrogate IP or Zscaler Client Connector is required for the Public Service Edge to have user context during CONNECT or Client Hello SNI evaluation. If user context is missing and authentication is enabled for the location, the service skips that policy evaluation to avoid an incorrect decision. If policy for unauthenticated traffic is enabled, it evaluates that policy instead.

6. SSL inspection: the switch that moves everything else

SSL/TLS Inspection determines whether ZIA can expose the HTTP request, headers and payload needed by downstream content controls. It therefore has a wider policy effect than the act of decryption alone.

SSL inspection actions and their effect on subsequent policies
Figure 9. Inspect, evaluate other policies without inspection, or bypass other policies. Original diagram — Zero Trust Navigator.

Inspect. ZIA decrypts the traffic, evaluates the applicable request or response policy sequence against the information now available, and re-encrypts traffic allowed to continue. Which controls run still depends on transaction type, enabled policies, configuration and content.

Do Not Inspect and Evaluate Other Policies. The traffic remains encrypted. ZIA continues evaluating controls that can operate on visible information. During CONNECT or SNI evaluation, the enforcement documentation identifies the four domain-based checks described above.

Do Not Inspect and Bypass Other Policies. The service bypasses the other web policies for matching traffic. This broad exception should have the narrowest practical scope, a documented owner and a review date.

The absence of a URL Filtering block does not by itself prove that URL Filtering evaluated a transaction. A higher-order SSL/TLS bypass may have prevented downstream evaluation.

Two behaviours around the block page

If SSL/TLS Inspection is disabled but Show EUN for Blocked Traffic is enabled, the Public Service Edge performs inspection on the first HTTPS transaction so it can return an end-user notification.

When the destination domain is known to contain an advanced threat, the connection terminates without an EUN. A block on the CONNECT host header returns HTTP 403; a block on SNI resets the connection.

Part three

The two policies that argue with each other

7. Cloud App Control and URL Filtering

These policies appear next to each other in the documented GET and POST sequences, at positions two and three.

By default, if a Cloud App Control rule explicitly allows the requested cloud-app action, the service applies that result and skips URL Filtering, then proceeds to Browser Control. This is a specific documented interaction, not a general statement that any allow in an earlier policy always prevents later policies from running.

In Zscaler’s example, Cloud App Control allows viewing Facebook while URL Filtering blocks http://www.facebook.com. Without cascading, the user is allowed. With Allow Cascading to URL Filtering, URL Filtering is evaluated after the Cloud App Control allow and the user is blocked.

Cloud App Control and URL Filtering cascading outcomes
Figure 10. Cascading changes the path after a Cloud App Control allow; it does not reverse a Cloud App Control block. Original diagram — Zero Trust Navigator.

In the documented interaction, cascading adds URL Filtering after a Cloud App Control allow. It does not override a transaction that Cloud App Control has already blocked.

If there is no applicable Cloud App Control rule for the cloud app, URL Filtering evaluates normally.

Configuration details need their own source

The exact placement and scope of cascading controls in the administration interface are configuration details and may vary with service updates, rule type and predefined application rules.

Before relying on a global option, per-rule field or predefined Microsoft 365 rule, verify the current Cloud App Control and Advanced Settings documentation for the tenant in which the change will be made.

Cascading is not enabled by default in the behaviour described by the policy-enforcement documentation.

8. Specific match before rule order

Rule order is a dominant pattern across ZIA policy configuration, and the web enforcement chain stops after a policy blocks a transaction. URL category specificity introduces a separate decision before the relevant URL Filtering rule is selected.

When enforcing URL Filtering policy rules containing a wildcard, the Public Service Edge always looks for a specific match first.

Exact URL category matching before wildcard category matching
Figure 11. The exact domain category match is resolved before the wildcard category that would otherwise contain it. Original diagram — Zero Trust Navigator.

Custom Category 1 contains .example.com. Custom Category 2 contains abc.example.com. A URL Filtering rule blocks everything in Custom Category 1 for a given location.

A request to abc.example.com is not blocked by that rule, because the exact domain matches Custom Category 2, which is not blocked in the example.

A more specific category can therefore create an exception to the coverage expected from a wildcard category. The policy list may appear correctly ordered because the category candidate was resolved before rule order became decisive.

If you have read the ZPA articles in this series, the shape may feel familiar. This is an analogy, not a claim that ZIA and ZPA use the same enforcement implementation.

Part four

And then it goes live

9. The logs are where the order becomes useful

Policies are the part of the platform users feel. A blocked site, held download or certificate warning becomes a ticket, and the service desk or SecOps team has to explain it.

The policy reason explains the recorded outcome

Web Insights and NSS reporting expose policy-reason values that identify or explain many policy outcomes. Read that field alongside the action, policy type, request method and relevant log view.

  • A URL Filtering denylist block points to the request-side URL Filtering stage.
  • A reputation block can point to Advanced Threat Protection.
  • A download blocked by an antivirus signature belongs to the response path.
  • A Sandbox first-time action may hold or quarantine a file rather than issue a permanent block.
  • A DLP rule can be violated while the transaction is allowed and an email is sent to the auditor.
  • An override password can produce an initial block followed by an allowed transaction.

Read the action and policy reason first. Identify the module and traffic direction, then locate the policy in the applicable GET, POST or response sequence.

Remember the module asymmetry: a transaction blocked by a web policy can appear allowed in Firewall Insights because it passed that module before the web module blocked it.

Triage

ZIA troubleshooting symptoms and first investigation areas
Figure 12. Common ticket shapes and the first areas to investigate. Original diagram — Zero Trust Navigator.

Treat symptoms as starting hypotheses rather than proof. For certificate warnings, check trust, server-certificate validation and the inspection chain. If a browser succeeds while a developer tool fails, verify whether the tool uses a separate trust store or different proxy support. For command-line failures, check TLS compatibility, proxy handling and protocol negotiation. If an application terminates an inspected session without a useful error, certificate pinning is one possibility alongside mutual TLS and application-specific certificate validation.

Some incidents are configuration defects; others are consequences of the selected enforcement path or of how the application handles an intercepted TLS session. The action, policy reason, module and traffic direction distinguish them.

10. Management does not come free

ZIA is not a product you understand once at project level and then simply hand over. It requires operational ownership after go-live.

Operational layers required after ZIA go-live
Figure 13. Platform governance, role separation, support capability and training. Original diagram — Zero Trust Navigator.

The platform. Rules drift and exceptions accumulate. Policy needs scheduled review, owners and expiry or review dates for exceptions.

Role separation. The service desk may need to read logs without editing URL categories. Administrative access should be scoped deliberately.

Support capability. Blocked sites, held files and certificate failures need an owned first-line process that can identify the relevant module and policy sequence.

Training. The service desk needs policy and logging basics; administrators need the sequence and interaction model; somebody must own the platform as a whole.

Every product has a learning curve. This one moved where the effort goes.

The operational benefit is substantial: no appliance capacity planning, hardware refresh or local patching cycle. But the effort does not disappear. It moves from keeping infrastructure alive to understanding and governing the service.

And the help is there, if you go and get it

Documentation, courses, certifications, reference architectures, deployment guides and troubleshooting runbooks exist. The organization still has to invest the time to use them.

The attackers study, test and specialise. The defensive team needs an equally deliberate learning path.

Final thoughts

The appliance-era mental model treated each security function as an independent box. ZIA consolidates inspection and policy enforcement, but the interactions created by that consolidation have to be learned rather than assumed.

Two modules, with outbound web traffic able to touch both. Three documented web sequences, one for GET, one for POST and one for the response. A blocking violation stops the web policies that follow. SSL/TLS Inspection determines how much information downstream controls can evaluate.

Those principles explain many of the surprises teams encounter during deployment and troubleshooting.

The rest is operations: ownership, review, support and training decide whether the design remains controlled eighteen months after go-live.

Sources and references

The enforcement sequences, module flows, worked examples and core interactions described here follow Zscaler’s published policy-enforcement documentation. Operational observations and design recommendations are identified as field notes or author analysis. Configuration options and product behaviour can change, and some features support alternative evaluation modes, so verify the current documentation and tenant configuration before relying on any sequence or setting in a production design.

Discover more from Zero Trust Navigator

Subscribe now to keep reading and get access to the full archive.

Continue reading