Azure security
Azure security assessment, from the edge and from inside.
Azure spreads a single tenant's attack surface across subscriptions, resource groups, Entra directories, and a dozen distinct URL patterns. Skydra treats that spread as a feature of the discovery, not a bug — probes find exposed resources regardless of which subscription hosts them.
- Blob and dfs storage access
- Function and Logic App URL probes
- Entra ID and RBAC audit
- Key Vault and APIM posture
Two complementary surfaces
URL probes and tenant audits.
Outside-in
What a public URL pattern reveals.
- Blob storage URLs (.blob.core.windows.net) — anonymous read, listing, SAS leak detection
- DFS URLs (.dfs.core.windows.net) — Data Lake Gen2 posture
- Function app URLs (.azurewebsites.net) and code deploy exposure
- Logic App callback URLs with embedded signatures
- Static Web App URLs — misconfigured auth and private previews
- Container Registry URLs (.azurecr.io) — anonymous image pull
- Automation Runbook webhook URLs
- API Management invocation posture
- SCM (Kudu) endpoints exposed on App Service
Inside-tenant
What an auditor-level read sees.
- Entra ID posture — guest invitations, admin roles, service principals
- Role assignments and inherited scope
- Blob storage access tier, firewall rules, lifecycle policies
- Key Vault access policies, soft-delete, purge protection
- Cosmos DB keys and firewall rules
- Azure Functions configuration and app settings
- App Service: ARR affinity, FTP deployment, HTTPS-only
- Service Bus authorization rules
- Container Registry replication, admin user, webhook subscriptions
- Azure OpenAI deployments and content filters
Named detectors
Each check is a real file in the action catalog.
Identity
azure.auditARM resource posture across the subscription
azure.audit_graphMicrosoft Graph: users, groups, applications, directory roles
azure.key_vaultKey Vault access policies, RBAC, soft-delete, purge protection
Storage
azure.blob_urlPattern-match Blob and SAS URLs; test anonymous read and listing
azure.blob_corsCORS misconfiguration on blob storage containers
azure.dfs_urlData Lake Gen2 URL patterns and access
azure.cosmosCosmos DB firewall rules, keys, read regions, replicas
Compute and functions
azure.app_serviceApp Service plan, FTP, SCM, HTTPS-only, auth integration
azure.functionsFunction app config, environment variables, host.json
azure.function_code_urlExposed .zip code deploy URLs
azure.scmSCM/Kudu endpoint exposure
azure.swa_urlStatic Web App preview URLs
APIs, events, DevOps
apim.invokeAPI Management invocation posture
azure.logic_app_sig_urlLogic App callback URL with signature leak
azure.automation_webhook_urlAutomation Account webhook token leak detection
azure.devopsAzure DevOps organization visibility and pipeline exposure
azure.searchAzure Cognitive Search index access and query key exposure
azure.openaiAzure OpenAI deployment configuration and content filter audit
A representative runbook
Azure posture across every subscription in the tenant.
inputs:
tenant: CloudAccount
steps:
subscriptions:
action: azure.list_subscriptions
with: { tenant: inputs.tenant }
audit:
action: azure.audit
forEach: subscriptions.output.items
with: { subscription: item.id }
maxConcurrency: 4
storage_exposure:
action: azure.blob_url
forEach: audit.output.findings.filter(item.kind == "Microsoft.Storage/storageAccounts")
with: { url: item.resource.primaryEndpoints.blob }
summarise:
action: slack.post
condition: storage_exposure.output.findings ne []
with:
channel: "#security-ops"
summary: templates.azure_posture.render(audit.output, storage_exposure.output)Azure's resource hierarchy — tenant / subscription / resource group / resource — maps to the engine's forEach directly. Nothing special was built for Azure; the engine's existing fan-out is what the runbook composes from.Known edges
What we are not pretending to do.
Azure's security surface is enormous, and no honest coverage claim leaves out the gaps.
- Microsoft Defender for Cloud integration is not shipped. Skydra audits configuration itself; Defender alerts live in their own channel.
- Entra Conditional Access policy evaluation is read-only — Skydra enumerates policy, but does not simulate token issuance against them.
- App Service traffic analysis (slot swap integrity, deployment slot leakage) is partial — audited at the configuration layer, not at the deployment-pipeline layer.
- Azure Policy evaluation is not an inside-channel. Skydra reads policy assignments and reports non-compliance at the resource layer, independent of Policy state.
- Azure RBAC path solver (what-if role assignments granting Owner across subscription boundaries) is on the roadmap, not the current build.
Point Skydra at your Azure tenant.
A least-privileged read-only service principal is all the inside audit needs. The outside probes refuse to run against hosts outside the workspace scope.