Azure Storage Accounts sono servizi fondamentali in Microsoft Azure che forniscono cloud storage scalabile, sicuro e altamente disponibile per vari tipi di dati, inclusi blobs (binary large objects), files, queues e tables. Servono come contenitori che raggruppono questi diversi servizi di storage sotto un unico namespace per una gestione semplice.
Principali opzioni di configurazione:
Ogni storage account deve avere un nome univoco in tutto Azure.
Ogni storage account è distribuito in una regione o in una Azure extended zone
Ă possibile selezionare la versione premium dello storage account per migliori prestazioni
Ă possibile selezionare tra 4 tipi di ridondanza per proteggere contro guasti di rack, drive e datacenter.
Opzioni di configurazione della sicurezza:
Require secure transfer for REST API operations: Richiede TLS in qualsiasi comunicazione con lo storage
Allows enabling anonymous access on individual containers: Se disabilitato, non sarĂ possibile abilitare lâaccesso anonimo in futuro
Enable storage account key access: Se disabilitato, lâaccesso con Shared Keys sarĂ proibito
Minimum TLS version
Permitted scope for copy operations: Consenti da qualsiasi storage account, da qualsiasi storage account dello stesso Entra tenant o da storage account con private endpoints nella stessa virtual network.
Opzioni di Blob Storage:
Allow cross-tenant replication
Access tier: Hot (dati ad accesso frequente), Cool e Cold (dati raramente accessi)
Opzioni di rete:
Network access:
Consenti da tutte le reti
Consenti da virtual networks selezionate e indirizzi IP
Disabilita lâaccesso pubblico e usa accesso privato
Private endpoints: Permettono una connessione privata allo storage account da una virtual network
Opzioni di protezione dei dati:
Point-in-time restore for containers: Permette di ripristinare i container a uno stato precedente
Richiede che siano abilitati versioning, change feed e blob soft delete.
Enable soft delete for blobs: Attiva un periodo di retention in giorni per i blob cancellati (anche sovrascritti)
Enable soft delete for containers: Attiva un periodo di retention in giorni per i container cancellati
Enable soft delete for file shares: Attiva un periodo di retention in giorni per i file share cancellati
Enable versioning for blobs: Mantiene versioni precedenti dei blob
Enable blob change feed: Tiene traccia delle operazioni di create, modification e delete sui blob
Enable version-level immutability support: Permette di impostare una policy di retention basata sul tempo a livello di account che si applicherĂ a tutte le versioni dei blob.
Version-level immutability support e point-in-time restore for containers non possono essere abilitati simultaneamente.
Opzioni di crittografia:
Encryption type: Ă possibile usare Microsoft-managed keys (MMK) o Customer-managed keys (CMK)
Enable infrastructure encryption: Permette di doppiare la cifratura dei dati âfor more securityâ
Le static websites sono servite dal contenitore speciale $web tramite un endpoint specifico per regione come https://<account>.z13.web.core.windows.net/.
Il container $web può riportare publicAccess: null tramite la blob API, ma i file sono comunque raggiungibili tramite lo static site endpoint, quindi lasciare artefatti di config/IaC lÏ può leak secrets.
Workflow di audit rapido:
# Identify storage accounts with static website hosting enabled
az storage blob service-properties show --account-name <acc-name> --auth-mode login
# Enumerate containers (including $web) and their public flags
az storage container list --account-name <acc-name> --auth-mode login
# List files served by the static site even when publicAccess is null
az storage blob list --container-name '$web' --account-name <acc-name> --auth-mode login
# Pull suspicious files directly (e.g., IaC tfvars containing secrets/SAS)
az storage blob download -c '$web' --name iac/terraform.tfvars --file /dev/stdout --account-name <acc-name> --auth-mode login
Individua gli storage account che possono esporre dati: az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'. Se allowBlobPublicAccess è false non puoi rendere i container pubblici.
Ispeziona gli account a rischio per confermare il flag e altre impostazioni deboli: az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'.
Enumera lâesposizione a livello di container dove il flag è abilitato:
az storage container list --account-name <acc> \
--query '[].{name:name, access:properties.publicAccess}'
"Blob": letture anonime consentite solo quando il nome del blob è noto (nessuna enumerazione).
"Container": elenco + lettura anonimi di ogni blob.
null: privato; autenticazione richiesta.
Dimostrare lâaccesso senza credenziali:
Se publicAccess è Container, la lista anonima funziona: curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list".
Per entrambi Blob e Container, il download anonimo del blob funziona quando il nome è noto:
az storage blob download -c <container> -n <blob> --account-name <acc> --file /dev/stdout
# or via raw HTTP
curl "https://<acc>.blob.core.windows.net/<container>/<blob>"
Ă possibile generare Shared Keys firmate con le access keys per autorizzare lâaccesso a determinate risorse tramite un URL firmato.
Note
Nota che la parte CanonicalizedResource rappresenta la risorsa del servizio di storage (URI). E se qualsiasi parte nellâURL è codificata, dovrebbe essere codificata anche allâinterno del CanonicalizedResource.
Note
Questo è usato per default dalla az cli per autenticare le richieste. Per farla usare le credenziali del principal Entra ID indica il parametro --auth-mode login.
Ă possibile generare una shared key per i servizi blob, queue e file firmando le seguenti informazioni:
Le Shared Access Signatures (SAS) sono URL sicuri e temporanei che concedono permessi specifici per accedere a risorse in un account Azure Storage senza esporre le chiavi di accesso dellâaccount. Mentre le chiavi di accesso forniscono lâaccesso amministrativo completo a tutte le risorse, le SAS permettono un controllo granulare specificando i permessi (come read o write) e definendo un tempo di scadenza.
User delegation SAS: Questo viene creato da un Entra ID principal che firmerĂ la SAS e delegherĂ i permessi dallâutente alla SAS. Può essere usato solo con blob and data lake storage (docs). Ă possibile revocare tutte le user delegated SAS generate.
Ă possibile generare una delegation SAS con permessi âmaggioriâ rispetto a quelli dellâutente. Tuttavia, se il principal non li possiede, non funzionerĂ (no privesc).
Service SAS: Questo è firmato usando una delle access keys dellâaccount storage. Può essere usato per concedere accesso a risorse specifiche in un singolo servizio di storage. Se la chiave viene rinnovata, la SAS smetterĂ di funzionare.
Account SAS: Ă anchâessa firmata con una delle access keys dellâaccount storage. Concede accesso a risorse attraverso i servizi di un account di storage (Blob, Queue, Table, File) e può includere operazioni a livello di servizio.
Una URL SAS firmata da una access key assomiglia a questa:
Quando si genera una SAS è necessario indicare i permessi che deve concedere. A seconda dellâoggetto su cui la SAS viene generata, possono essere inclusi permessi diversi. Per esempio:
Azure Blob Storage ora supporta lo SSH File Transfer Protocol (SFTP), permettendo il trasferimento sicuro di file e la gestione direttamente su Blob Storage senza richiedere soluzioni custom o prodotti di terze parti.
Supporto del protocollo: SFTP funziona con account Blob Storage configurati con hierarchical namespace (HNS). Questo organizza i blob in directory e sottodirectory per una navigazione piĂš semplice.
Sicurezza: SFTP utilizza identitĂ utente locali per lâautenticazione e non si integra con RBAC o ABAC. Ogni utente locale può autenticarsi tramite:
Azure-generated passwords
Coppie di chiavi SSH pubblica/privata
Permessi granulari: Permessi come Read, Write, Delete e List possono essere assegnati agli utenti locali fino a 100 container.
Considerazioni di rete: le connessioni SFTP avvengono tramite la porta 22. Azure supporta configurazioni di rete come firewall, private endpoints o virtual networks per proteggere il traffico SFTP.
Hierarchical Namespace: HNS deve essere abilitato al momento della creazione dellâaccount di storage.
Crittografia supportata: Richiede algoritmi crittografici approvati dal Microsoft Security Development Lifecycle (SDL) (es. rsa-sha2-256, ecdsa-sha2-nistp256).
Configurazione SFTP:
Abilitare SFTP sullâaccount di storage.
Creare identitĂ utente locali con permessi appropriati.
Configurare directory home per gli utenti per definire la loro posizione iniziale allâinterno del container.
az storage blob show âaccount-name âcontainer-name âsas-token âse=2024-12-31T23%3A59%3A00Z&sp=racwdxyltfmei&sv=2022-11-02&sr=c&sig=ym%2Bu%2BQp5qqrPotIK5/rrm7EMMxZRwF/hMWLfK1VWy6E%3Dâ âname âasd.txtâ