deploy-landing-zone — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited deploy-landing-zone (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
# Lint for best practices
az bicep lint --file infra/main.bicep
# Build to check compilation
az bicep build --file infra/main.bicep
# What-if (dry run — shows what will be created/modified)
az deployment sub what-if \
--location eastus2 \
--template-file infra/main.bicep \
--parameters infra/parameters.json# Create management group or subscription scope
az deployment sub create \
--location eastus2 \
--template-file infra/main.bicep \
--parameters infra/parameters.json \
--name deploy-landing-zone-$(date +%Y%m%d)| Resource | Purpose | AVM Module |
|---|---|---|
| Hub VNet | Central connectivity (firewall, gateway, bastion) | avm/res/network/virtual-network |
| Spoke VNet | AI workload isolation | avm/res/network/virtual-network |
| VNet Peering | Hub ↔ Spoke connectivity | (built into VNet module) |
| Azure Firewall | Egress filtering, FQDN rules | avm/res/network/azure-firewall |
| Key Vault | Secrets, certificates | avm/res/key-vault/vault |
| Log Analytics | Centralized logging | avm/res/operational-insights/workspace |
| NSGs | Subnet-level traffic control | avm/res/network/network-security-group |
For each AI service, create a private endpoint in the PrivateEndpointSubnet:
# Verify private endpoints are created
az network private-endpoint list \
--resource-group rg-ai-landing-zone \
--query "[].{Name:name, Status:privateLinkServiceConnections[0].privateLinkServiceConnectionState.status}" \
-o tableExpected: All endpoints show Approved status.
# List current role assignments
az role assignment list --resource-group rg-ai-landing-zone -o table
# Verify least-privilege: no Owner/Contributor on production resources
# Expected roles:
# Cognitive Services OpenAI User (for apps accessing OpenAI)
# Search Index Data Reader (for apps querying search)
# Storage Blob Data Reader (for apps reading documents)
# Key Vault Secrets User (for apps reading secrets)# Check VNet peering status
az network vnet peering list --resource-group rg-hub --vnet-name vnet-hub -o table
# Check NSG rules
az network nsg rule list --resource-group rg-ai-landing-zone --nsg-name nsg-private-endpoints -o table
# Check DNS resolution for private endpoints
nslookup oai-frootai.openai.azure.com # Should resolve to 10.1.1.x (private IP)# Verify diagnostic settings on all resources
az monitor diagnostic-settings list --resource /subscriptions/.../openai -o table
# Check Log Analytics workspace is receiving data
az monitor log-analytics query \
--workspace ws-ai-landing-zone \
--analytics-query "AzureDiagnostics | take 10" \
--timespan PT1H# Test private endpoint connectivity from within VNet
az containerapp exec --name app-test --resource-group rg-ai-landing-zone \
--command "curl -s https://oai-frootai.openai.azure.com/openai/models?api-version=2024-04-01-preview"
# Test Key Vault access
az keyvault secret list --vault-name kv-ai-landing-zone -o table| Issue | Cause | Fix |
|---|---|---|
| Private endpoint DNS not resolving | Private DNS zone not linked to VNet | Link DNS zone to spoke VNet |
| NSG blocking traffic | Missing allow rule for VNet | Add AllowVNetInbound rule |
| RBAC permission denied | Wrong role assigned | Verify role matches service needs |
| Firewall blocking egress | Missing FQDN rule | Add service FQDN to firewall rules |
| Peering not connected | Peering not in Connected state | Re-create peering in both directions |
| Bicep deployment failed | Missing parameter | Check parameters.json completeness |
| Quota exceeded | Region capacity full | Request quota increase or change region |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.