Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Implementing Zero Trust Network Access (ZTNA) in cloud environments by configuring identity-aware proxies, micro-segmentation, continuous verification with conditional access policies, and replacing traditional VPN-based access with BeyondCorp-style architectures across AWS, Azure, and GCP.
.claude/skills/implementing-zero-trust-network-access/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-18 | ✗→✓ | ▲ Improved | — | — |
| case-12 | ✗→✓ | ▲ Improved | — | — |
| case-19 | ✗→✓ | ▲ Improved | — | — |
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-14 | ✗→✓ | ▲ Improved | — | — |
Do not use as a complete replacement for network security controls (ZTNA complements but does not replace firewalls and network ACLs), for protecting internet-facing public applications (use WAF), or for IoT device access where identity-based authentication is not feasible.
Configure IAP to provide authenticated access to web applications without VPN.
bash# Enable IAP API gcloud services enable iap.googleapis.com # Configure OAuth consent screen gcloud iap oauth-brands create \ --application_title="Corporate Apps" \ --support_email=security@company.com # Enable IAP on an App Engine application gcloud iap web enable \ --resource-type=app-engine \ --oauth2-client-id=CLIENT_ID \ --oauth2-client-secret=CLIENT_SECRET # Enable IAP on a backend service (GCE/GKE) gcloud compute backend-services update BACKEND_SERVICE \ --iap=enabled,oauth2-client-id=CLIENT_ID,oauth2-client-secret=CLIENT_SECRET \ --global # Set IAP access policy (who can access) gcloud iap web add-iam-policy-binding \ --resource-type=app-engine \ --member="group:engineering@company.com" \ --role="roles/iap.httpsResourceAccessor" # Configure access levels based on device and context gcloud access-context-manager levels create corporate-device \ --title="Corporate Managed Device" \ --basic-level-spec=level-spec.yaml \ --policy=POLICY_ID
Deploy AWS Verified Access to provide identity-based access to internal applications.
bash# Create a Verified Access trust provider (OIDC) aws ec2 create-verified-access-trust-provider \ --trust-provider-type user \ --user-trust-provider-type oidc \ --oidc-options '{ "Issuer": "https://login.microsoftonline.com/TENANT_ID/v2.0", "AuthorizationEndpoint": "https://login.microsoftonline.com/TENANT_ID/oauth2/v2.0/authorize", "TokenEndpoint": "https://login.microsoftonline.com/TENANT_ID/oauth2/v2.0/token", "UserInfoEndpoint": "https://graph.microsoft.com/oidc/userinfo", "ClientId": "CLIENT_ID", "ClientSecret": "CLIENT_SECRET", "Scope": "openid profile email" }' # Create a Verified Access instance aws ec2 create-verified-access-instance \ --description "Zero Trust Access Instance" # Attach trust provider to instance aws ec2 attach-verified-access-trust-provider \ --verified-access-instance-id vai-INSTANCE_ID \ --verified-access-trust-provider-id vatp-PROVIDER_ID # Create a Verified Access group with policy aws ec2 create-verified-access-group \ --verified-access-instance-id vai-INSTANCE_ID \ --policy-document '{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": "*", "Action": "verified-access:AllowAccess", "Condition": { "StringEquals": { "verified-access:user/groups": "engineering" } } }] }' # Create endpoint for an internal application aws ec2 create-verified-access-endpoint \ --verified-access-group-id vag-GROUP_ID \ --endpoint-type load-balancer \ --attachment-type vpc \ --domain-certificate-arn arn:aws:acm:REGION:ACCOUNT:certificate/CERT_ID \ --application-domain app.internal.company.com \ --endpoint-domain-prefix app \ --load-balancer-options '{ "LoadBalancerArn": "arn:aws:elasticloadbalancing:REGION:ACCOUNT:loadbalancer/app/internal-app/xxx", "Port": 443, "Protocol": "https", "SubnetIds": ["subnet-xxx"] }'
Set up Azure Private Link for network isolation and conditional access for identity-based controls.
bash# Create Private Endpoint for an Azure service az network private-endpoint create \ --name app-private-endpoint \ --resource-group production-rg \ --vnet-name production-vnet \ --subnet private-endpoint-subnet \ --private-connection-resource-id /subscriptions/SUB_ID/resourceGroups/RG/providers/Microsoft.Web/sites/internal-app \ --group-ids sites \ --connection-name app-connection # Configure private DNS zone for the service az network private-dns zone create \ --resource-group production-rg \ --name privatelink.azurewebsites.net az network private-dns link vnet create \ --resource-group production-rg \ --zone-name privatelink.azurewebsites.net \ --name production-link \ --virtual-network production-vnet \ --registration-enabled false
powershell# Create Conditional Access policy requiring compliant device + MFA Connect-MgGraph -Scopes "Policy.ReadWrite.ConditionalAccess" $params = @{ DisplayName = "Zero Trust - Require MFA and Compliant Device" State = "enabled" Conditions = @{ Applications = @{ IncludeApplications = @("All") } Users = @{ IncludeUsers = @("All") ExcludeGroups = @("BreakGlass-Group-ID") } Locations = @{ IncludeLocations = @("All") ExcludeLocations = @("AllTrusted") } } GrantControls = @{ Operator = "AND" BuiltInControls = @("mfa", "compliantDevice") } SessionControls = @{ SignInFrequency = @{ Value = 4 Type = "hours" IsEnabled = $true } } } New-MgIdentityConditionalAccessPolicy -BodyParameter $params
Deploy network-level micro-segmentation to complement identity-based access controls.
bash# AWS: Create security groups for micro-segmentation aws ec2 create-security-group \ --group-name web-tier-sg \ --description "Web tier - only HTTPS from ALB" \ --vpc-id vpc-PROD aws ec2 authorize-security-group-ingress \ --group-id sg-WEB \ --protocol tcp --port 443 \ --source-group sg-ALB aws ec2 create-security-group \ --group-name app-tier-sg \ --description "App tier - only from web tier" aws ec2 authorize-security-group-ingress \ --group-id sg-APP \ --protocol tcp --port 8080 \ --source-group sg-WEB # Kubernetes NetworkPolicy for pod-level segmentation cat << 'EOF' | kubectl apply -f - apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: api-allow-web-only namespace: production spec: podSelector: matchLabels: app: api-server policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: web-frontend ports: - protocol: TCP port: 8080 EOF
Implement continuous trust verification rather than one-time authentication.
bash# Configure CloudWatch to monitor access decisions aws logs create-log-group --log-group-name /verified-access/access-logs # Enable Verified Access logging aws ec2 modify-verified-access-instance-logging-configuration \ --verified-access-instance-id vai-INSTANCE_ID \ --access-logs '{ "CloudWatchLogs": { "Enabled": true, "LogGroup": "/verified-access/access-logs" } }' # Query access logs for denied requests aws logs start-query \ --log-group-name /verified-access/access-logs \ --start-time $(date -d "24 hours ago" +%s) \ --end-time $(date +%s) \ --query-string ' fields @timestamp, identity.user, http_request.url, decision | filter decision = "deny" | sort @timestamp desc | limit 50 '
| Term | Definition | |------|------------| | Zero Trust | Security model that requires strict identity verification for every person and device accessing resources, regardless of network location | | ZTNA | Zero Trust Network Access, the technology that implements zero trust principles by providing identity-aware, context-based access to applications | | Identity-Aware Proxy | Proxy service that verifies user identity and device context before allowing access to backend applications, replacing VPN-based access | | Micro-Segmentation | Network security technique that creates fine-grained security zones around individual workloads or applications to limit lateral movement | | BeyondCorp | Google's implementation of zero trust architecture that shifts access controls from the network perimeter to individual users and devices | | Continuous Verification | Ongoing assessment of user identity, device health, and access context throughout a session rather than only at authentication time |
Context: An organization with 2,000 employees accesses 30+ internal cloud applications through a traditional VPN concentrator. VPN performance issues and security concerns drive the decision to implement ZTNA.
Approach:
Pitfalls: Not all applications support identity-aware proxy integration. Legacy thick-client applications may require agent-based ZTNA solutions instead of proxy-based approaches. Device posture assessment requires an endpoint management solution deployed to all corporate devices. Break-glass access procedures must be documented for scenarios where the identity provider is unavailable.
Zero Trust Network Access Implementation Report
==================================================
Organization: Acme Corp
Implementation Date: 2026-02-23
Applications Migrated: 24 / 30
ZTNA ARCHITECTURE:
Identity Provider: Microsoft Entra ID
Access Proxy: AWS Verified Access + GCP IAP
Device Management: Microsoft Intune
MFA: FIDO2 + Authenticator App
ACCESS POLICY COVERAGE:
Applications requiring MFA: 30 / 30 (100%)
Applications requiring compliant device: 24 / 30 (80%)
Applications with continuous verification: 18 / 30 (60%)
Applications with location restrictions: 12 / 30 (40%)
SECURITY IMPROVEMENTS:
VPN-related incidents (before): 12/month
ZTNA-related incidents (after): 2/month
Mean time to detect unauthorized access: 4 min (was 2 hours)
Lateral movement paths eliminated: 85%
MIGRATION STATUS:
Phase 1 (low-risk apps): 12/12 complete
Phase 2 (medium-risk apps): 12/12 complete
Phase 3 (high-risk apps): 0/6 in progress
VPN decommission: Scheduled after Phase 3| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +27 percentage points is the difference between those two pass rates over the 22 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.