zscaler-zia-zpa-audit
Zscaler Internet Access and Private Access SASE policy audit — URL filtering policy analysis, SSL inspection coverage validation, Cloud Firewall rule assessment, ZPA application segment review, access policy evaluation, and connector health verification across ZIA and ZPA tenants.
Zscaler ZIA + ZPA SASE Policy Audit
Comprehensive policy audit of Zscaler Internet Access (ZIA) and Zscaler Private Access (ZPA) SASE deployments. Unlike generic cloud security reviews that check surface-level settings, this skill evaluates the full Zscaler security stack: URL filtering rule effectiveness, Cloud Firewall rule ordering and shadow detection, SSL inspection bypass gaps, DLP engine coverage, ZPA application segment scoping, access policy posture enforcement, and connector health across all connector groups.
Covers ZIA (cloud-delivered SWG, Cloud Firewall, Sandbox, DLP) and ZPA
(ZTNA application access, App Connectors, posture-based policy). For multi-tenant
deployments, audit each tenant independently and compare policy consistency.
Reference references/api-reference.md for ZIA and ZPA API endpoint details,
authentication flows, and rate limiting guidance.
When to Use
- Post-change policy review after ZIA URL filtering, Cloud Firewall, or SSL inspection policy modifications
- Quarterly or annual compliance audit requiring documented evidence of SASE policy coverage and enforcement
- ZPA access policy gap analysis — identifying application segments reachable without posture verification or with overly broad access conditions
- SSL inspection bypass review — quantifying what percentage of traffic evades content inspection through do-not-inspect rules
- Connector health investigation — troubleshooting connectivity failures, version drift, or redundancy gaps across ZPA connector groups
- Tenant consolidation assessment — evaluating policy consistency before merging ZIA or ZPA tenants during M&A or organizational restructuring
- Zero trust maturity validation — measuring how effectively ZIA+ZPA enforce identity-aware, posture-verified, least-privilege access
- DLP coverage audit — verifying that data loss prevention engines and dictionaries cover regulated data types across all egress paths
Prerequisites
- ZIA admin portal access or API key with read-only permissions (requires
ZIA_API_KEYenvironment variable for API-driven audits) - ZPA admin portal access or API credentials with read-only scope (
ZPA_CLIENT_IDandZPA_CLIENT_SECRETenvironment variables for API-driven audits) - Knowledge of the ZIA cloud name (e.g.,
zscaler.net,zscalerone.net,zscalertwo.net,zscloud.net) for correct API base URL selection - Understanding of the location and department hierarchy configured in ZIA — policies may be scoped to specific locations, sub-locations, or departments
- ZPA connector group topology — which connector groups serve which application segments, and expected redundancy (minimum 2 connectors per group)
- IdP integration details — which identity provider is federated with ZIA/ZPA, SCIM provisioning status, SAML attribute mappings
- Awareness of compliance requirements that dictate SSL inspection exemptions (healthcare, financial categories) and DLP dictionary requirements
Procedure
Follow this audit flow sequentially. Each step builds on prior findings. The procedure moves from tenant authentication through ZIA policy analysis, then ZPA policy and connector assessment, concluding with identity and posture integration validation.
Step 1: Tenant Inventory and Authentication
Authenticate to both ZIA and ZPA APIs and collect tenant metadata.
[ZIA] Authenticate and collect tenant info:
POST https://zsapi.<cloud>/api/v1/authenticatedSession
{
"apiKey": "<obfuscated_key>",
"username": "<admin_user>",
"password": "<admin_password>",
"timestamp": "<timestamp>"
}
After authentication, retrieve tenant status:
GET /api/v1/status
Record the ZIA cloud name, activation status, and last policy push timestamp. A stale policy push (>24 hours old) indicates changes pending activation.
[ZPA] Authenticate via OAuth:
POST https://config.<cloud>/signin
{
"client_id": "<ZPA_CLIENT_ID>",
"client_secret": "<ZPA_CLIENT_SECRET>"
}
Retrieve tenant profile:
GET /mgmtconfig/v1/admin/customers/{customerId}
Document both tenant IDs, admin roles used for the audit, and the API base URLs. Verify that API credentials have read-only scope — write access is not required and should not be used.
Step 2: ZIA URL Filtering Policy Audit
Retrieve and evaluate all URL filtering rules.
[ZIA] GET /api/v1/urlFilteringRules
For each URL filtering rule, evaluate:
- Rule ordering: Rules are evaluated top-down. A broad allow rule above a specific block rule creates a bypass. Identify rules where ordering permits traffic that a later rule intends to deny.
- Overly permissive allow rules: Rules that allow all URL categories or
allow categories like
MiscellaneousorOtherwithout justification. These categories contain unclassified sites and are high-risk. - Blocked category bypasses: Check for rules that explicitly allow
categories that the organization's acceptable use policy should block
(e.g.,
Peer-to-Peer,Anonymizer,Malware). - Caution/Warn actions: Rules using
CAUTIONaction allow users to click through warnings. Verify this is intentional for each category. - Location and department scoping: Rules scoped to
Anylocation andAnydepartment apply globally. Verify that global rules are intentional and not overly broad.
Retrieve URL category details for custom categories:
[ZIA] GET /api/v1/urlCategories
Check custom URL categories for stale entries, overly broad wildcard patterns
(e.g., *.com), and categories with no associated policy rule.
Step 3: ZIA Cloud Firewall Rule Assessment
Retrieve the Cloud Firewall rule set:
[ZIA] GET /api/v1/firewallRules
Evaluate each firewall rule against these criteria:
- Any-any rules: Rules with source
Any, destinationAny, and applicationAnyare effectively permit-all. Flag as Critical unless they are the explicit default-deny at the bottom of the rulebase. - Rule ordering and shadows: A rule is shadowed when a preceding rule matches all the same traffic with equal or broader criteria. Shadowed rules never match and create audit confusion.
- Source and destination granularity: Rules should reference specific
IP groups, locations, or departments — not
Anyfor both source and destination. Evaluate whether address groups can narrow scope. - Application granularity: Rules permitting entire application groups
(e.g.,
Web Browsing) when only specific applications are needed. - Disabled rules: Rules with
state: DISABLEDconsume rulebase space. Flag for cleanup. - Logging: Rules without logging enabled (
enableLogging: false) create visibility gaps for incident investigation.
Retrieve network services for port/protocol mapping:
[ZIA] GET /api/v1/networkServices
Verify that custom network services use specific port ranges rather than
broad ranges (e.g., 1-65535).
Step 4: ZIA SSL Inspection Coverage
Retrieve SSL inspection rules:
[ZIA] GET /api/v1/sslInspectionRules
SSL inspection is critical for content-based threat detection. Without inspection, ZIA cannot analyze encrypted payload content for malware, data exfiltration, or policy violations.
Evaluate SSL inspection coverage:
- Do-not-inspect rules: Each rule that bypasses SSL inspection creates a blind spot. Quantify the percentage of traffic categories that are excluded from inspection.
- Justified exclusions: Financial and healthcare categories may require SSL bypass for compliance (PCI DSS, HIPAA). Verify that each exclusion has documented justification.
- Certificate deployment: SSL inspection requires the Zscaler root CA certificate installed on endpoints. Check if certificate deployment coverage is tracked and if exceptions exist.
- Inspection by location: Some locations may have SSL inspection disabled entirely. Identify locations without inspection coverage.
Retrieve the do-not-inspect URL categories:
[ZIA] GET /api/v1/urlCategories?type=URL_CATEGORY
Cross-reference do-not-inspect categories against the URL filtering policy to identify categories that are both allowed and uninspected — these represent the highest-risk blind spots.
Step 5: ZIA DLP Policy Review
Retrieve DLP notification templates and engines:
[ZIA] GET /api/v1/dlpNotificationTemplates
[ZIA] GET /api/v1/dlpEngines
[ZIA] GET /api/v1/dlpDictionaries
Evaluate DLP coverage:
- Engine activation: Verify that DLP engines are enabled and actively scanning. Disabled engines provide no protection.
- Dictionary coverage: Check that dictionaries cover regulated data types required by compliance frameworks (PCI: credit card numbers, HIPAA: PHI identifiers, GDPR: EU personal data).
- Custom dictionaries: Review custom dictionaries for accuracy — overly broad patterns generate false positives, while overly narrow patterns miss data.
- Notification templates: Verify that DLP violation notifications are configured and that incident response contacts are current.
- Egress channel coverage: DLP should cover web traffic, SSL-inspected HTTPS, and cloud application uploads. Verify that SSL inspection bypasses do not create DLP blind spots.
Step 6: ZPA Application Segment Review
Retrieve all application segments:
[ZPA] GET /mgmtconfig/v1/admin/customers/{customerId}/application
Application segments define what internal resources are accessible through ZPA. Overly broad segments violate least-privilege principles.
Evaluate each application segment:
- Wildcard domains: Segments using
*.example.comexpose all subdomains. Verify that wildcard scope is intentional and not a shortcut for incomplete application discovery. - Large port ranges: Segments with port ranges like
1-65535or1-1024grant access to all services on target hosts. Narrow to specific application ports. - Double-encryption (bypass): Check the
bypassTypefield. Segments configured to bypass ZPA inspection may indicate misconfigurations or legacy workarounds. - Segment group assignment: Every application segment should belong to a segment group for organized policy management. Unassigned segments are harder to audit and govern.
- TCP/UDP protocol scope: Segments allowing both TCP and UDP when the application only requires one protocol expand the attack surface.
Retrieve server groups to validate backend connectivity:
[ZPA] GET /mgmtconfig/v1/admin/customers/{customerId}/serverGroup
Cross-reference server groups with application segments to ensure each segment has a valid server group with healthy connectors.
Step 7: ZPA Access Policy Evaluation
Retrieve all access policies:
[ZPA] GET /mgmtconfig/v1/admin/customers/{customerId}/policySet/rules/policyType/ACCESS_POLICY
Access policies control who can reach application segments and under what conditions. Evaluate:
- Default-allow conditions: Policies that allow access without specifying user groups, SCIM attributes, or posture profiles grant overly broad access. Every policy should have an explicit identity condition.
- Missing posture profiles: Access policies without posture profile requirements allow unmanaged or non-compliant devices to access internal applications. Flag policies that lack device trust verification.
- Rule ordering: Like firewall rules, access policies evaluate top-down. A broad allow above a restrictive rule bypasses the restriction.
- App connector group assignment: Policies must reference the correct connector group for the target application segment. Mismatched assignments cause connectivity failures.
- SCIM attribute conditions: Policies using SCIM attributes for department or group-based access should be validated against current IdP group membership.
Retrieve timeout and client forwarding policies:
[ZPA] GET /mgmtconfig/v1/admin/customers/{customerId}/policySet/rules/policyType/TIMEOUT_POLICY
[ZPA] GET /mgmtconfig/v1/admin/customers/{customerId}/policySet/rules/policyType/CLIENT_FORWARDING_POLICY
Check that timeout policies enforce session limits appropriate for the application sensitivity and that client forwarding policies route traffic through ZPA rather than direct internet access for internal applications.
Step 8: ZPA Connector Health
Retrieve connector status across all connector groups:
[ZPA] GET /mgmtconfig/v1/admin/customers/{customerId}/connector
[ZPA] GET /mgmtconfig/v1/admin/customers/{customerId}/connectorGroup
App Connectors are the critical data path for ZPA. Evaluate:
- Connector status: Each connector should report
enabledstatus. Flag connectors indisabledorerrorstate. - Version currency: Compare connector versions against the latest available release. Connectors more than two versions behind are at risk of missing security patches and feature compatibility.
- Connector group redundancy: Each connector group should have a minimum of two active connectors for high availability. Single-connector groups represent a single point of failure.
- Connectivity to ZPA broker: Verify that connectors maintain active connections to the ZPA broker infrastructure. Loss of broker connectivity prevents new session establishment.
- Uptime: Connectors with frequent restarts may indicate resource exhaustion, infrastructure instability, or provisioning issues.
- Geographic distribution: For globally distributed applications, verify that connector groups are deployed in proximity to application servers to minimize latency.
Retrieve provisioning keys for operational awareness:
[ZPA] GET /mgmtconfig/v1/admin/customers/{customerId}/associationType/{type}/provisioningKey
Check for expired or unused provisioning keys. Active keys that have not been used to enroll connectors may indicate stalled deployments.
Step 9: Identity and Posture Integration
Validate the IdP and posture configuration that underpins both ZIA and ZPA policy enforcement.
[ZPA] Retrieve IdP configuration:
GET /mgmtconfig/v1/admin/customers/{customerId}/idp
Verify:
- IdP status is active and SAML/OIDC metadata is current
- SCIM provisioning is enabled and last sync is recent (within 24 hours)
- SAML attribute mapping includes required attributes for policy conditions (department, group, email)
- Certificate expiration dates — expired IdP certificates break authentication
[ZPA] Retrieve posture profiles:
GET /mgmtconfig/v1/admin/customers/{customerId}/posture
Evaluate posture profiles for completeness:
- Device trust: Profiles should verify device management enrollment (MDM/UEM), domain join status, or certificate presence
- OS version requirements: Minimum OS version checks prevent access from outdated, vulnerable endpoints
- Disk encryption: Requiring disk encryption (BitLocker, FileVault) protects data on lost or stolen devices
- Firewall and antivirus: Verifying endpoint security tool status ensures defense-in-depth at the device level
Cross-reference posture profiles against access policies from Step 7. Identify access policies that do not require any posture profile — these allow unverified devices to access internal applications.
[ZIA] Retrieve location and user information:
GET /api/v1/locations
GET /api/v1/departments
GET /api/v1/users
Verify that location hierarchy matches the organizational structure and that department-scoped policies align with current HR department definitions. Check for orphaned locations (no users assigned) or departments with no associated policy rules.
Threshold Tables
URL Filtering Policy Coverage
| Metric | Normal | Warning | Critical |
|---|---|---|---|
| Categories with explicit action | >90% | 70-90% | <70% |
| Custom categories with stale entries (>180 days) | 0 | 1-5 | >5 |
| Allow rules for high-risk categories (Anonymizer, P2P) | 0 | 1-2 (justified) | >2 or unjustified |
| Rules with CAUTION action (click-through) | <5 | 5-10 | >10 |
| Rules scoped to Any/Any (location/department) | <3 | 3-5 | >5 |
SSL Inspection Coverage
| Metric | Normal | Warning | Critical |
|---|---|---|---|
| Traffic categories inspected | >85% | 60-85% | <60% |
| Do-not-inspect rules | <5 (justified) | 5-15 | >15 |
| Locations with inspection disabled | 0 | 1-2 | >2 |
| Categories both allowed and uninspected | 0 | 1-3 | >3 |
| Certificate deployment coverage | >95% | 80-95% | <80% |
Cloud Firewall Rule Health
| Metric | Normal | Warning | Critical |
|---|---|---|---|
| Total rule count | <100 | 100-250 | >250 |
| Any-any permit rules (non-default) | 0 | 1 | >1 |
| Shadowed (unreachable) rules | 0 | 1-5 | >5 |
| Rules without logging enabled | 0 | 1-10 | >10 |
| Disabled rules in rulebase | <5 | 5-15 | >15 |
| Network services with port range >1000 | 0 | 1-3 | >3 |
ZPA Connector Health
| Metric | Normal | Warning | Critical |
|---|---|---|---|
| Connector status | All enabled | 1 disabled | >1 disabled or error |
| Version drift (versions behind latest) | 0-1 | 2 | >2 |
| Connector groups with single connector | 0 | 1-2 | >2 |
| Connectors with uptime <24 hours | 0 | 1 | >1 |
| Unused provisioning keys (>90 days) | 0 | 1-3 | >3 |
Access Policy Posture Enforcement
| Metric | Normal | Warning | Critical |
|---|---|---|---|
| Access policies requiring posture profile | >90% | 60-90% | <60% |
| Policies with default-allow (no identity condition) | 0 | 1 | >1 |
| Application segments with wildcard domains | <10% | 10-30% | >30% |
| Segments with port range >100 ports | <10% | 10-25% | >25% |
| Access policies without SCIM group condition | <20% | 20-40% | >40% |
DLP Coverage
| Metric | Normal | Warning | Critical |
|---|---|---|---|
| DLP engines enabled | All required | 1 disabled | >1 disabled |
| Regulated data types with dictionaries | 100% | 80-99% | <80% |
| SSL bypass categories without DLP | 0 | 1-3 | >3 |
| Custom dictionaries last reviewed (days) | <90 | 90-180 | >180 |
| Notification templates with valid contacts | 100% | >80% | <80% |
Decision Trees
ZIA Policy Gap Prioritization
Identified ZIA policy finding
├── SSL inspection gap?
│ ├── Yes → HIGH PRIORITY
│ │ ├── Traffic category both allowed and uninspected?
│ │ │ ├── Yes → CRITICAL: content-blind egress path
│ │ │ │ └── Add to SSL inspection policy or block category
│ │ │ └── No → Evaluate justification for bypass
│ │ │ ├── Compliance-required (financial/health) → Document exception
│ │ │ └── No justification → Add SSL inspection rule
│ │ └── Location with inspection fully disabled?
│ │ └── CRITICAL: entire site uninspected
│ │ └── Deploy Zscaler root CA and enable inspection
│ └── No → Check next finding type
│
├── Cloud Firewall any-any rule?
│ ├── Yes → CRITICAL
│ │ ├── Is this the default deny at rulebase bottom?
│ │ │ ├── Yes → Expected, verify action is BLOCK_DROP
│ │ │ └── No → Identify actual traffic requirements
│ │ │ └── Replace with specific source/dest/app rules
│ │ └── Logging enabled on the rule?
│ │ ├── No → Enable logging immediately for visibility
│ │ └── Yes → Use logs to identify traffic for rule narrowing
│ └── No → Check next finding type
│
├── URL filtering overly permissive?
│ ├── Allowing high-risk categories (Anonymizer, P2P, Malware)?
│ │ ├── Yes → HIGH: block or restrict immediately
│ │ └── No → Review category-by-category against AUP
│ └── Broad CAUTION rules allowing click-through?
│ └── MEDIUM: convert to BLOCK for non-business categories
│
├── DLP coverage gap?
│ ├── Regulated data type without dictionary?
│ │ └── HIGH: add dictionary for compliance requirement
│ └── DLP engine disabled?
│ └── CRITICAL: enable engine, verify no performance impact
│
└── Shadowed or disabled rules?
└── LOW: cleanup for hygiene, schedule during maintenance window
ZPA Access Policy Remediation
Identified ZPA access policy finding
├── Default-allow policy (no identity condition)?
│ ├── Yes → CRITICAL: unrestricted application access
│ │ ├── Identify intended user population
│ │ │ └── Add explicit SCIM group or IdP attribute condition
│ │ └── Add posture profile requirement
│ │ └── Minimum: device trust + OS version + disk encryption
│ └── No → Check posture enforcement
│
├── Missing posture profile on access policy?
│ ├── Yes → HIGH: unverified devices accessing internal apps
│ │ ├── Application sensitivity?
│ │ │ ├── High (finance, HR, admin) → Require full posture (trust + OS + AV + encryption)
│ │ │ ├── Medium (general business) → Require device trust + OS version
│ │ │ └── Low (informational) → Require device trust minimum
│ │ └── Posture profile exists but not bound?
│ │ ├── Yes → Bind existing profile to access policy
│ │ └── No → Create profile, test with monitor-only, then enforce
│ └── No → Check application segment scope
│
├── Overly broad application segment?
│ ├── Wildcard domain (*.example.com)?
│ │ ├── Intentional for entire subdomain tree?
│ │ │ ├── Yes → Document justification, ensure access policy is restrictive
│ │ │ └── No → Narrow to specific FQDNs
│ │ └── Large port range (>100 ports)?
│ │ ├── Application ports known?
│ │ │ ├── Yes → Narrow to specific ports
│ │ │ └── No → Use connector logs to identify actual ports in use
│ │ └── Both TCP and UDP when only one needed?
│ │ └── Restrict to required protocol
│ └── No → Check connector health
│
└── Connector group issue?
├── Single connector in group?
│ └── HIGH: deploy second connector for redundancy
├── Connector version outdated?
│ └── MEDIUM: schedule upgrade during maintenance window
└── Connector in error state?
└── CRITICAL: troubleshoot immediately
├── Check provisioning key validity
├── Verify network connectivity to ZPA broker
└── Review connector resource utilization (CPU/memory/disk)
Report Template
ZSCALER ZIA + ZPA SASE POLICY AUDIT REPORT
=============================================
ZIA Tenant: [cloud name / tenant ID]
ZPA Tenant: [customer ID]
ZIA Cloud: [zscaler.net / zscalerone.net / zscloud.net]
Audit Date: [timestamp]
Performed By: [operator/agent]
Assessment Scope: [full tenant / specific locations / specific app segments]
ZIA TENANT STATUS:
- Policy activation status: [activated / pending changes]
- Last policy push: [timestamp]
- Locations configured: [count]
- Departments configured: [count]
ZPA TENANT STATUS:
- Connector groups: [count]
- Active connectors: [n] / [total]
- Application segments: [count]
- Access policies: [count]
ZIA FINDINGS — URL FILTERING:
- Total URL filtering rules: [count]
- Categories with explicit action: [n] / [total] ([%])
- High-risk categories allowed: [list]
- Rules with CAUTION action: [count]
- Custom categories with stale entries: [count]
1. [Severity] — [Description]
Rule: [rule name / ID]
Scope: [location] / [department]
Issue: [specific problem]
Recommendation: [specific remediation]
ZIA FINDINGS — CLOUD FIREWALL:
- Total firewall rules: [count]
- Any-any permit rules: [count]
- Shadowed rules: [count]
- Rules without logging: [count]
1. [Severity] — [Description]
Rule: [rule name / ID]
Issue: [specific problem]
Recommendation: [specific remediation]
ZIA FINDINGS — SSL INSPECTION:
- Traffic categories inspected: [n] / [total] ([%])
- Do-not-inspect rules: [count]
- Justified bypasses: [count] | Unjustified: [count]
- Locations without inspection: [list]
- Categories both allowed and uninspected: [list]
1. [Severity] — [Description]
Recommendation: [specific remediation]
ZIA FINDINGS — DLP:
- DLP engines active: [n] / [total]
- Regulated data types covered: [list]
- Regulated data types missing: [list]
- SSL bypass categories without DLP: [count]
1. [Severity] — [Description]
Recommendation: [specific remediation]
ZPA FINDINGS — APPLICATION SEGMENTS:
- Total application segments: [count]
- Segments with wildcard domains: [n] ([%])
- Segments with port ranges >100: [n] ([%])
- Segments without segment group: [count]
1. [Severity] — [Description]
Segment: [segment name]
Domain/IP: [target]
Ports: [port range]
Recommendation: [specific remediation]
ZPA FINDINGS — ACCESS POLICIES:
- Total access policies: [count]
- Policies requiring posture profile: [n] / [total] ([%])
- Policies with default-allow: [count]
- Policies without SCIM group condition: [count]
1. [Severity] — [Description]
Policy: [policy name]
Condition: [current condition]
Recommendation: [specific remediation]
ZPA FINDINGS — CONNECTORS:
- Total connectors: [count]
- Connectors enabled: [n] | Disabled: [n] | Error: [n]
- Connector groups with single connector: [count]
- Connectors with outdated version: [count]
1. [Severity] — [Description]
Connector: [connector name]
Group: [connector group]
Status: [current status]
Recommendation: [specific remediation]
IDENTITY AND POSTURE INTEGRATION:
- IdP status: [active / inactive]
- SCIM last sync: [timestamp]
- SAML certificate expiration: [date]
- Posture profiles configured: [count]
- Posture checks enforced: [device trust / OS / encryption / AV]
SEVERITY SUMMARY:
- Critical: [count]
- High: [count]
- Medium: [count]
- Low: [count]
REMEDIATION ROADMAP:
Phase 1 — Immediate (0-7 days):
- [Critical findings requiring immediate action]
Phase 2 — Short-term (7-30 days):
- [High findings — policy tightening, posture enforcement]
Phase 3 — Medium-term (30-90 days):
- [Medium findings — segment narrowing, connector upgrades]
Phase 4 — Ongoing:
- [Low findings — cleanup, documentation, process improvements]
NEXT AUDIT: [based on findings — Critical: 30d, High: 90d, clean: 180d]
Troubleshooting
API Rate Limiting
Zscaler APIs enforce rate limits that vary by endpoint and tenant tier.
ZIA API calls are typically limited to 40 requests per 10-second window.
ZPA API calls are limited per endpoint category. If you receive HTTP 429
responses, implement exponential backoff starting at 1 second. For large
tenants with many rules, batch retrieval endpoints and avoid polling in
tight loops. Use GET bulk endpoints (e.g., /urlFilteringRules returns
all rules in one call) rather than individual rule retrieval where possible.
Multi-Tenant Visibility
Organizations with multiple ZIA or ZPA tenants must audit each tenant independently — there is no cross-tenant API. Maintain separate API credentials for each tenant and document which tenant each finding belongs to. For Zscaler Cloud Connector or Branch Connector deployments, verify that the tenant ID in connector configuration matches the audited tenant.
Sub-Location vs Location Hierarchy
ZIA policies can be scoped to locations and sub-locations. Sub-locations inherit parent location settings unless explicitly overridden. When auditing URL filtering or firewall rules scoped to a location, verify whether sub-locations have overriding rules that change the effective policy. Retrieve sub-locations explicitly:
[ZIA] GET /api/v1/locations/{locationId}/sublocations
A common misconfiguration is applying a restrictive policy to a parent location while a sub-location override permits the same traffic category.
ZPA Connector Provisioning Key Issues
Connectors require a valid provisioning key for initial enrollment. Common issues include:
- Expired provisioning key: Keys have a configurable expiration. Expired keys prevent new connector enrollment but do not affect already-enrolled connectors.
- Max usage reached: Each key has a maximum usage count. If all uses are consumed, new connectors cannot enroll with that key.
- Wrong association type: Provisioning keys are scoped to connector groups or service edges. Using a key for the wrong association type fails silently.
Retrieve and validate provisioning keys:
[ZPA] GET /mgmtconfig/v1/admin/customers/{customerId}/associationType/CONNECTOR_GRP/provisioningKey
IdP and SCIM Sync Delays
SCIM provisioning syncs user and group data from the IdP to ZPA. Sync delays cause access policy conditions based on SCIM groups to evaluate against stale data. Check the last sync timestamp in the IdP configuration. If sync is delayed more than 24 hours:
- Verify SCIM bearer token has not expired
- Check IdP-side SCIM provisioning logs for errors
- Validate that the SCIM endpoint URL in the IdP matches the ZPA tenant
For ZIA, user and department synchronization depends on the configured authentication method (SAML, Kerberos, or hosted DB). Verify that the user database reflects current organizational structure — stale departments in ZIA cause policy scoping errors.
Cloud Firewall Rule Count Limits
ZIA tenants have a maximum number of Cloud Firewall rules that varies by subscription tier. Approaching the rule limit prevents new rule creation and may force rule consolidation. Check current rule count against the tenant limit and plan consolidation if utilization exceeds 80%. Consolidation strategies include merging rules with identical actions and overlapping criteria, replacing multiple IP-based rules with IP groups, and removing shadowed or disabled rules.