Skip to content
Back to skills

Azure Landing Zone

ASecurity

Reviews enterprise-scale subscription/management-group topology — one level above azure-caf-naming's resource-name-string scope. Flags no management-group hierarchy separating platform from landing-zone subscriptions, a single subscription hosting both production and non-production workloads with no isolation boundary, no Azure Policy initiative assigned at the management-group level for tenant-wide guardrails, and no documented subscription-vending process for onboarding new workload teams. ...

  • 2 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 6, 2026
developmentgorailsazureapisecuritydocumentation

Works with

  • api

Security analysis

A100/100

Scanned September 6, 2026

npx -y skills add AgenticPawan/FullStack-Pilot --skill azure-landing-zone --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Azure Landing Zone?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Azure Landing Zone
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/agenticpawan-azure-landing-zone/badge)](https://www.skillsdirectory.com/skills/agenticpawan-azure-landing-zone)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: azure-landing-zone
description: Reviews enterprise-scale subscription/management-group topology — one level above azure-caf-naming's resource-name-string scope. Flags no management-group hierarchy separating platform from landing-zone subscriptions, a single subscription hosting both production and non-production workloads with no isolation boundary, no Azure Policy initiative assigned at the management-group level for tenant-wide guardrails, and no documented subscription-vending process for onboarding new workload teams. Outputs findings with pilot-azure landing-zone standard IDs.
when_to_use: management group, subscription vending, landing zone, enterprise-scale, subscription topology, Azure Policy initiative, platform subscription, connectivity subscription, tenant-wide guardrail
---

## Standard IDs

| ID | Severity | What it checks |
|----|----------|-----------------|
| LZ-001 | P1 | No management-group hierarchy separating platform from landing-zone subscriptions |
| LZ-002 | P0 | Single subscription hosts both production and non-production workloads |
| LZ-003 | P1 | No Azure Policy initiative assigned at the management-group level for tenant-wide guardrails |
| LZ-004 | P2 | No documented subscription-vending process for onboarding new workload teams |

`azure-caf-naming` governs how an individual resource is *named*; this skill governs the
subscription/management-group *topology* those resources live inside — a shop with
pristine resource naming can still have zero isolation between prod and dev subscriptions.

---

## Check A — No management-group hierarchy (LZ-001)

### Detection

Check the tenant's management-group structure for a hierarchy separating platform
concerns (connectivity, identity, management) from landing-zone (workload) subscriptions
— the Cloud Adoption Framework's enterprise-scale reference architecture. A flat
structure with every subscription directly under the tenant root means there's no natural
place to apply a policy/RBAC boundary that differs between "platform" and "workload"
subscriptions.

### BAD — flat structure, every subscription under the tenant root with no grouping

```
Tenant Root
├── sub-orders-prod
├── sub-orders-dev
├── sub-invoicing-prod
├── sub-shared-connectivity
<!-- No management groups — no natural place to apply differentiated policy by function. -->
```

### GOOD — a management-group hierarchy separating platform from landing zones

```
Tenant Root
├── mg-platform
│   ├── mg-connectivity (sub-hub-network)
│   ├── mg-identity (sub-identity)
│   └── mg-management (sub-log-analytics, sub-automation)
└── mg-landing-zones
    ├── mg-corp (sub-orders-prod, sub-invoicing-prod)
    └── mg-online (sub-public-api-prod)
```

---

## Check B — Single subscription hosts prod and non-prod (LZ-002)

### Detection

Check whether production and non-production (dev/test/staging) resources for a workload
share one Azure subscription. A subscription is the strongest RBAC/policy/quota boundary
Azure offers — sharing one across environments means a developer with Contributor access
to iterate quickly in dev also has Contributor access to production by construction, and
a runaway dev-environment cost or quota exhaustion directly threatens production capacity.

### BAD — one subscription for both prod and dev

```
sub-orders (single subscription)
├── rg-orders-prod
└── rg-orders-dev
<!-- Same subscription-level RBAC and quotas apply to both — a dev-environment mistake
     can exhaust the shared subscription's quota that production also depends on. -->
```

### GOOD — separate subscriptions per environment tier, matching CAF's landing-zone pattern

```
sub-orders-prod   (production RBAC — tightly scoped, matches dotnet-authorization's
                    permissions-only model applied at the infrastructure layer)
sub-orders-nonprod (dev/test/staging — broader Contributor access for the team,
                     isolated blast radius from production)
```

---

## Check C — No Azure Policy initiative at management-group scope (LZ-003)

### Detection

Check whether tenant-wide guardrails (require CAF naming conventions per
`azure-caf-naming`, require Defender for Cloud enablement per `azure-security-baseline`
ASB-LT-1, deny public storage per ASB-NS-1) are enforced via an Azure Policy initiative
assigned at a management-group scope, or only documented as conventions each team is
expected to follow voluntarily. A convention with no enforcement mechanism is only as
strong as the least careful team's Bicep review.

### BAD — guardrails exist only as documentation, no policy enforcement

```markdown
<!-- docs/AZURE-CONVENTIONS.md says "don't allow public blob access" — but nothing
     technically prevents a new subscription's Bicep template from doing it anyway. -->
```

### GOOD — a policy initiative assigned once at the management-group level, inherited by every subscription underneath

```bicep
resource guardrailInitiative 'Microsoft.Authorization/policySetDefinitions@2023-04-01' = {
  name: 'platform-guardrails'
  properties: {
    policyDefinitions: [
      { policyDefinitionId: denyPublicBlobPolicyId }
      { policyDefinitionId: requireDefenderPolicyId }
      { policyDefinitionId: requireCafTagsPolicyId }
    ]
  }
}

resource assignment 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
  name: 'platform-guardrails-assignment'
  scope: managementGroup('mg-landing-zones') // inherited by every subscription underneath
  properties: { policyDefinitionId: guardrailInitiative.id }
}
```

---

## Check D — No subscription-vending process (LZ-004)

### Detection

Check for a documented, repeatable process for onboarding a new workload team's
subscription (naming, initial RBAC, budget per `azure-cost-finops`, policy assignment
inheritance) versus an ad-hoc manual process that produces a slightly different setup
each time depending on who provisioned it.

### BAD — every new subscription is manually provisioned, slightly differently each time

```
# No template/checklist — subscription #14 is missing the budget alert that
# subscription #13 has, because whoever set it up forgot that step this time.
```

### GOOD — a subscription-vending Bicep/deployment-stack template, applied consistently

```bicep
// subscription-vending.bicep — deployed once per new workload onboarding
module budget 'modules/budget.bicep' = { params: { amount: defaultMonthlyBudget } } // azure-cost-finops FIN-001
module rbac 'modules/rbac.bicep' = { params: { teamGroupId: teamGroupId } }
// Policy inheritance from Check C's management-group assignment applies automatically —
// no manual step required for the new subscription to inherit tenant-wide guardrails.
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…