Skip to content
Back to skills

Azure Caf Naming

ASecurity

Enforces Azure Cloud Adoption Framework naming and tagging conventions: validates resource names match the CAF pattern <type>-<workload>-<env>-<region>-<instance> using the official abbreviation list, checks required tags (env, costCenter, owner, managedBy), detects missing or wrong type prefixes, and emits a regex pattern set consumable by the dangerous-patterns hook for live enforcement. Uses microsoft-learn MCP server when available for the current abbreviation reference.

  • 2 stars
  • 0 votes
  • 1 copy
  • 6 views
  • Added September 6, 2026
developmentgosqlazureterraformdatabase

Works with

  • cli
  • mcp

Security analysis

A100/100

Scanned September 6, 2026

npx -y skills add AgenticPawan/FullStack-Pilot --skill azure-caf-naming --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Azure Caf Naming?

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

Security grade badge for Azure Caf Naming
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/agenticpawan-azure-caf-naming/badge)](https://www.skillsdirectory.com/skills/agenticpawan-azure-caf-naming)

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-caf-naming
description: "Enforces Azure Cloud Adoption Framework naming and tagging conventions: validates resource names match the CAF pattern <type>-<workload>-<env>-<region>-<instance> using the official abbreviation list, checks required tags (env, costCenter, owner, managedBy), detects missing or wrong type prefixes, and emits a regex pattern set consumable by the dangerous-patterns hook for live enforcement. Uses microsoft-learn MCP server when available for the current abbreviation reference."
when_to_use: CAF naming, Cloud Adoption Framework, resource naming, Azure naming convention, CAF abbreviation, resource tags, tagging policy, naming enforcement, Bicep naming, dangerous-patterns, naming regex
---

## CAF resource-name pattern

```
<type>-<workload>-<env>-<region>-<instance>
```

Examples:
| Resource | CAF abbreviation | Example name |
|----------|-----------------|--------------|
| Storage account | `st` | `stmyappdeveus001` (no hyphens — storage limits to 24 chars, alphanumeric) |
| App Service | `app` | `app-myapp-dev-eus-001` |
| Container App | `ca` | `ca-myapp-dev-eus-001` |
| Container App Environment | `cae` | `cae-myapp-dev-eus-001` |
| Key Vault | `kv` | `kv-myapp-dev-eus-001` |
| SQL Server | `sql` | `sql-myapp-dev-eus-001` |
| SQL Database | `sqldb` | `sqldb-myapp-dev-eus-001` |
| Log Analytics Workspace | `log` | `log-myapp-dev-eus-001` |
| Application Insights | `appi` | `appi-myapp-dev-eus-001` |
| Container Registry | `cr` | `crmyappdeveus001` (no hyphens — ACR has restrictions) |

If microsoft-learn MCP is available, call `microsoft_docs_search` with
"Azure Cloud Adoption Framework abbreviations" to retrieve the full current list before
running checks.

---

## Step 1 — Extract resource names

For each resource declaration in `.bicep` files, extract:
- `type` (e.g., `Microsoft.Storage/storageAccounts`)
- `name` value (may be a parameter reference — record as unknown if so)
- `tags` property

---

## Step 2 — Validate naming pattern

For each resource with a literal string name:

1. Look up the CAF abbreviation for the resource type.
2. Check that the name starts with the abbreviation followed by `-` (or is concatenated
   correctly for no-hyphen types like storage accounts and container registries).
3. Check that the name contains environment segment (`dev`, `test`, `staging`, `prod`, `uat`).
4. Check that the name ends with a numeric instance segment (`001`, `01`, etc.).

```bicep
// BAD: no CAF structure
resource sa 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: 'mystoragedev'    // no type prefix, no region, no instance
}

// GOOD: storage uses concatenation (no hyphens allowed)
param workload string = 'myapp'
param env string = 'dev'
param region string = 'eus'
param instance string = '001'

resource sa 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: 'st${workload}${env}${region}${instance}'
}
```

---

## Step 3 — Validate required tags

Every resource must have at minimum:

| Tag | Values |
|-----|--------|
| `env` | `dev`, `test`, `staging`, `prod`, `uat` |
| `costCenter` | any non-empty string |
| `owner` | team or person identifier |
| `managedBy` | `bicep`, `terraform`, `manual` |

Flag missing tags as WAF-COST-001 (P2).

---

## Step 4 — Emit dangerous-pattern regex set

After the review, output the following JSON block **and** tell the user to add it to
`plugins/pilot-core/hooks/config/dangerous-patterns.json` so the hook enforces it live:

```json
[
  {
    "id": "no-public-blob-access",
    "name": "AZURE_PUBLIC_BLOB_ACCESS",
    "description": "Public blob access exposes storage data without authentication — ASB-NS-1 P0",
    "fileExtensions": [".bicep"],
    "pattern": "allowBlobPublicAccess\\s*:\\s*true",
    "message": "Set allowBlobPublicAccess: false. Use managed identity or SAS tokens for client access."
  },
  {
    "id": "no-public-container-access",
    "name": "AZURE_PUBLIC_CONTAINER_ACCESS",
    "description": "Container-level public access allows anonymous blob read — ASB-NS-1 P0",
    "fileExtensions": [".bicep"],
    "pattern": "publicAccess\\s*:\\s*'(?:Blob|Container)'",
    "message": "Set publicAccess: 'None'. Use RBAC or SAS tokens instead of anonymous access."
  },
  {
    "id": "no-storage-key-output",
    "name": "AZURE_STORAGE_KEY_IN_OUTPUT",
    "description": "Exporting storage account key in outputs leaks credentials — ASB-IM-1 P0",
    "fileExtensions": [".bicep"],
    "pattern": "\\.listKeys\\(\\)",
    "message": "Use managed identity instead of account keys. Remove listKeys() from outputs."
  }
]
```

---

## Finding output format

```json
{
  "source": "semantic",
  "severity": "P2",
  "cwe": null,
  "owasp": "A05:2021",
  "file": "infra/main.bicep",
  "line": 5,
  "title": "CAF-NAME-001: Storage account name 'mystoragedev' does not follow CAF convention",
  "evidence": "name: 'mystoragedev'",
  "proposedFix": "Rename to 'st<workload><env><region><instance>' e.g. 'stmyappdeveus001'",
  "batchable": true,
  "confidence": "high"
}
```

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…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.