Azure Key Vault – Complete Guide
Azure Key Vault is a managed cloud service for securely storing and managing cryptographic keys, secrets, and certificates. This field guide covers SKUs, RBAC roles, Private Endpoints, secret rotation, Managed Identity access, KQL queries, and a production-ready checklist.
Azure Key Vault – Complete Guide
Azure Key Vault is a managed cloud service for securely storing and managing cryptographic keys, secrets (connection strings, API keys, passwords), and certificates. It eliminates the need to hardcode secrets in application code.
📋 Overview & SKUs
| Feature | Standard | Premium | Managed HSM |
|---|---|---|---|
| Key storage | Software-protected | HSM-protected | Dedicated HSM |
| FIPS level | 140-2 Level 1 | 140-2 Level 2 | 140-2 Level 3 |
| RSA 4096 keys | ✅ | ✅ | ✅ |
| Dedicated HSM tenant | ❌ | ❌ | ✅ |
| Multi-region replication | Automatic | Automatic | Configurable |
| Use case | Dev/Test, standard apps | Regulated workloads (PCI, HIPAA) | Highest compliance requirement |
🔐 Key Types
| Type | Algorithm | Use Case |
|---|---|---|
| RSA | RSA 2048/3072/4096 | Encryption, TLS certificates, code signing |
| EC (Elliptic Curve) | P-256, P-384, P-521 | JWT signing, ECDSA, faster operations |
| oct-HSM (Symmetric) | AES 128/192/256 | Data encryption (Managed HSM only) |
🎭 RBAC Roles
| Principal | Role | Scope |
|---|---|---|
| WebApp-MI | Key Vault Secrets User | This vault |
| DevOps-SP | Key Vault Reader | This vault |
| Role | Can Read Secrets? | Can Manage? | Use Case |
|---|---|---|---|
| Key Vault Administrator | ✅ | ✅ | Full management (use with PIM) |
| Key Vault Reader | ❌ (metadata only) | ❌ | View vault properties |
| Key Vault Secrets Officer | ✅ | ✅ | Manage secrets lifecycle |
| Key Vault Secrets User | ✅ | ❌ | App access to secrets |
| Key Vault Crypto Officer | — | ✅ | Manage keys |
| Key Vault Crypto User | — | ❌ | Use keys for crypto operations |
| Key Vault Certificate Officer | — | ✅ | Manage certificate lifecycle |
🌐 Network Security
Key Vault should never be publicly accessible. Use Private Endpoint to restrict access to your VNet only.
# PowerShell – Create Private Endpoint for Key Vault
$vault = Get-AzKeyVault -VaultName "prod-kv" -ResourceGroupName "rg-security"
$pe = New-AzPrivateEndpoint `
-Name "pe-keyvault" `
-ResourceGroupName "rg-security" `
-Location "eastus" `
-Subnet $subnet `
-PrivateLinkServiceConnection (New-AzPrivateLinkServiceConnection `
-Name "conn-keyvault" `
-PrivateLinkServiceId $vault.ResourceId `
-GroupId "vault")
🔄 Secret Rotation
Automatic rotation uses Event Grid → Azure Function to rotate secrets before expiry.
- Secret approaches expiry → Key Vault emits Event Grid event
- Event Grid triggers Azure Function (rotation function)
- Function generates new secret value in the backend service
- Function creates new secret version in Key Vault
- Application reads the latest version automatically (no code change)
🤖 Managed Identity Access
Use Managed Identity for app access to Key Vault — no secrets in code or config files.
# Python – Access Key Vault with Managed Identity
from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient
credential = DefaultAzureCredential() # Uses Managed Identity in Azure
client = SecretClient(
vault_url="https://prod-kv.vault.azure.net/",
credential=credential
)
secret = client.get_secret("db-connection-string")
print(secret.value)
💾 Backup & Recovery
- Soft Delete: Deleted keys/secrets are retained for 7–90 days. Enable soft delete + purge protection on all vaults.
- Purge Protection: When enabled, even admins cannot permanently delete objects during the retention period.
- Key Vault Backup: Back up individual secrets/keys/certs. Restore only to same tenant (cross-tenant restore not supported).
🔎 KQL Queries
All Key Vault Access Events
AzureDiagnostics
| where ResourceType == "VAULTS"
| where OperationName in ("SecretGet","KeyGet","CertificateGet")
| project TimeGenerated, identity_claim_appid_g,
CallerIPAddress, OperationName, ResultType
| order by TimeGenerated desc
Failed Access Attempts
AzureDiagnostics
| where ResourceType == "VAULTS"
| where ResultType == "Unauthorized" or ResultType == "Forbidden"
| summarize FailCount = count() by CallerIPAddress, identity_claim_appid_g, bin(TimeGenerated, 1h)
| where FailCount > 5
| order by FailCount desc
Secrets Nearing Expiry
AzureActivity
| where OperationNameValue contains "secrets" and OperationNameValue contains "write"
| extend SecretName = tostring(Properties.resource)
| project TimeGenerated, Caller, SecretName, OperationNameValue
✅ Checklist – Azure Key Vault
- Create separate Key Vaults per environment (Dev/Stage/Prod)
- Enable RBAC authorization mode (not legacy Access Policies)
- Enable Soft Delete with 90-day retention
- Enable Purge Protection on production vaults
- Create Private Endpoint for each production vault
- Disable public network access after Private Endpoint is created
- Enable Trusted Microsoft Services exception
- Set expiry dates on all secrets (maximum 1 year)
- Configure automatic rotation via Event Grid + Azure Function
- Use Managed Identity for all app access (no hardcoded secrets)
- Enable Diagnostic Settings → Send to Log Analytics
- Create Defender for Key Vault alert policies
- Alert on unauthorized access attempts