Questa guida descrive come configurare l'autenticazione sicura per Azure Storage Queue usando Microsoft Entra ID (precedentemente Azure Active Directory).
| Metodo | Uso Consigliato | Sicurezza | Configurazione |
|---|---|---|---|
| DefaultAzureCredential ? | Sviluppo e produzione | ????? | Automatica |
| Managed Identity | Azure VMs, App Services | ????? | Semplice |
| Service Principal | On-premises, CI/CD | ???? | Moderata |
| Connection String ? | Solo sviluppo locale | ? | Semplice |
Quando usarlo: Sviluppo locale e produzione. Prova automaticamente più metodi nell'ordine.
{
"SecureBootWatcher": {
"Sinks": {
"EnableAzureQueue": true,
"AzureQueue": {
"QueueServiceUri": "https://yourstorageaccount.queue.core.windows.net",
"QueueName": "secureboot-reports",
"AuthenticationMethod": "DefaultAzureCredential"
}
}
}
}DefaultAzureCredential prova questi metodi nell'ordine:
- Environment Variables - Credenziali configurate tramite variabili d'ambiente
- Managed Identity - Se eseguito su Azure VM/App Service
- Visual Studio - Credenziali dell'account VS
- Azure CLI - Se sei autenticato con
az login - Azure PowerShell - Se sei autenticato con
Connect-AzAccount
# Opzione 1: Usa Azure CLI (raccomandato)
az login
# Opzione 2: Usa Visual Studio
# Accedi con il tuo account Azure in Visual StudioAssegna il ruolo "Storage Queue Data Contributor" all'utente/identità:
# Per il tuo utente (sviluppo)
az role assignment create \
--role "Storage Queue Data Contributor" \
--assignee "your-email@domain.com" \
--scope "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Storage/storageAccounts/{storage-account}"Quando usarlo: Quando il client è deployato su Azure VM, App Service, Container Instance, o AKS.
{
"SecureBootWatcher": {
"Sinks": {
"AzureQueue": {
"QueueServiceUri": "https://yourstorageaccount.queue.core.windows.net",
"QueueName": "secureboot-reports",
"AuthenticationMethod": "ManagedIdentity"
}
}
}
}# 1. Abilita System-Assigned Identity sulla VM
az vm identity assign \
--name my-vm \
--resource-group my-rg
# 2. Ottieni il Principal ID
PRINCIPAL_ID=$(az vm identity show --name my-vm --resource-group my-rg --query principalId -o tsv)
# 3. Assegna il ruolo Storage Queue Data Contributor
az role assignment create \
--role "Storage Queue Data Contributor" \
--assignee $PRINCIPAL_ID \
--scope "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Storage/storageAccounts/{storage-account}"Se hai più identità gestite:
{
"SecureBootWatcher": {
"Sinks": {
"AzureQueue": {
"QueueServiceUri": "https://yourstorageaccount.queue.core.windows.net",
"QueueName": "secureboot-reports",
"AuthenticationMethod": "ManagedIdentity",
"ClientId": "00000000-0000-0000-0000-000000000000"
}
}
}
}Setup:
# 1. Crea User-Assigned Identity
az identity create \
--name secureboot-identity \
--resource-group my-rg
# 2. Ottieni Client ID e Principal ID
CLIENT_ID=$(az identity show --name secureboot-identity --resource-group my-rg --query clientId -o tsv)
PRINCIPAL_ID=$(az identity show --name secureboot-identity --resource-group my-rg --query principalId -o tsv)
# 3. Assegna l'identità alla VM
az vm identity assign \
--name my-vm \
--resource-group my-rg \
--identities /subscriptions/{subscription-id}/resourceGroups/my-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/secureboot-identity
# 4. Assegna il ruolo Storage
az role assignment create \
--role "Storage Queue Data Contributor" \
--assignee $PRINCIPAL_ID \
--scope "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Storage/storageAccounts/{storage-account}"Quando usarlo: Dispositivi on-premises, server non-Azure, o pipeline CI/CD.
{
"SecureBootWatcher": {
"Sinks": {
"AzureQueue": {
"QueueServiceUri": "https://yourstorageaccount.queue.core.windows.net",
"QueueName": "secureboot-reports",
"AuthenticationMethod": "ServicePrincipal",
"TenantId": "00000000-0000-0000-0000-000000000000",
"ClientId": "11111111-1111-1111-1111-111111111111",
"ClientSecret": "your-secret-value"
}
}
}
}# 1. Crea Service Principal
az ad sp create-for-rbac \
--name "secureboot-watcher-sp" \
--role "Storage Queue Data Contributor" \
--scopes "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Storage/storageAccounts/{storage-account}"
# Output:
# {
# "appId": "11111111-1111-1111-1111-111111111111", <- ClientId
# "displayName": "secureboot-watcher-sp",
# "password": "secret-value", <- ClientSecret
# "tenant": "00000000-0000-0000-0000-000000000000" <- TenantId
# }MAI committare il Client Secret nel repository! Usa:
# Windows
$env:SECUREBOOT_Sinks__AzureQueue__ClientSecret = "your-secret-value"
# Linux/Mac
export SECUREBOOT_Sinks__AzureQueue__ClientSecret="your-secret-value"// In Program.cs
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddEnvironmentVariables(prefix: "SECUREBOOT_")
.AddAzureKeyVault(new Uri("https://your-keyvault.vault.azure.net/"), new DefaultAzureCredential())
.Build();Salva il secret in Key Vault:
az keyvault secret set \
--vault-name your-keyvault \
--name "SecureBootWatcher--Sinks--AzureQueue--ClientSecret" \
--value "your-secret-value"?? NON RACCOMANDATO per produzione!
{
"SecureBootWatcher": {
"Sinks": {
"AzureQueue": {
"AuthenticationMethod": "ConnectionString",
"ConnectionString": "DefaultEndpointsProtocol=https;AccountName=yourstorageaccount;AccountKey=...;EndpointSuffix=core.windows.net",
"QueueName": "secureboot-reports"
}
}
}
}Causa: Manca il ruolo "Storage Queue Data Contributor"
Soluzione:
# Verifica le assegnazioni di ruolo
az role assignment list \
--scope "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Storage/storageAccounts/{storage-account}" \
--output table
# Aggiungi il ruolo mancante
az role assignment create \
--role "Storage Queue Data Contributor" \
--assignee {principal-id-or-email} \
--scope "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Storage/storageAccounts/{storage-account}"Causa: Managed Identity non abilitata o non disponibile
Soluzione per VM:
az vm identity assign --name my-vm --resource-group my-rgSoluzione per App Service:
az webapp identity assign --name my-app --resource-group my-rgCausa: Nessuna credenziale valida trovata
Soluzione per sviluppo locale:
# Autenticati con Azure CLI
az login
# Oppure imposta variabili d'ambiente per Service Principal
$env:AZURE_TENANT_ID = "your-tenant-id"
$env:AZURE_CLIENT_ID = "your-client-id"
$env:AZURE_CLIENT_SECRET = "your-client-secret"# Test con Azure CLI (usa le stesse credenziali di DefaultAzureCredential)
az storage message put \
--queue-name secureboot-reports \
--content "test message" \
--account-name yourstorageaccount \
--auth-mode login- Autenticati con
az login - Assegna ruolo "Storage Queue Data Contributor" al tuo account
- Configura
AuthenticationMethod: "DefaultAzureCredential" - Testa il client localmente
- Abilita System-Assigned Managed Identity sulla VM
- Assegna ruolo "Storage Queue Data Contributor" all'identità
- Configura
AuthenticationMethod: "ManagedIdentity" - Deploy client sulla VM
- Verifica logs per conferma autenticazione
- Crea Service Principal
- Assegna ruolo "Storage Queue Data Contributor" al Service Principal
- Salva Client Secret in Azure Key Vault o variabili d'ambiente
- Configura
AuthenticationMethod: "ServicePrincipal" - Non committare credenziali nel repository
- Deploy con configurazione sicura
- ? Usa sempre DefaultAzureCredential o Managed Identity quando possibile
- ? Assegna i ruoli RBAC più restrittivi possibili (Storage Queue Data Contributor, non Owner)
- ? Ruota regolarmente i Client Secrets (se usi Service Principal)
- ? Usa Azure Key Vault per i secrets, non file di configurazione
- ? Abilita diagnostic logs sullo Storage Account per audit
- ? Usa User-Assigned Managed Identity se hai più identità
- ? MAI committare ConnectionString o Client Secret nel repository
- ? MAI usare ConnectionString in produzione