Usare firme di accesso condiviso per delegare l'accesso ad Archiviazione di Azure
Le firme di accesso condiviso consentono di delegare l'accesso alle risorse. I client non hanno accesso diretto alle credenziali dell'account di archiviazione e, a un livello granulare, è possibile controllare gli elementi a cui accedono.
Dopo aver esaminato tutte le opzioni di autorizzazione, si decide di esaminare in maggiore dettaglio le firme di accesso condiviso. Si desidera creare e utilizzare una firma di accesso condiviso in un'app Web C# .NET. Si vogliono anche seguire le procedure consigliate di Microsoft in merito a quando e come usare una firma di accesso condiviso.
In questa unità verranno esaminate le modalità di funzionamento tecnico di una firma di accesso condiviso e il codice C# da scrivere per usarlo.
Come funzionano le firme di accesso condiviso
Una firma di accesso condiviso ha due componenti: un URI che punta a una o più risorse di archiviazione e un token che indica come il client può accedere alle risorse.
In un singolo URI, ad esempio https://medicalrecords.blob.core.windows.net/patient-images/patient-116139-nq8z7f.jpg?sp=r&st=2020-01-20T11:42:32Z&se=2020-01-20T19:42:32Z&spr=https&sv=2019-02-02&sr=b&sig=SrW1HZ5Nb6MbRzTbXCaPm%2BJiSEn15tC91Y4umMPwVZs%3D
, è possibile separare l'URI dal token di firma di accesso condiviso come indicato di seguito:
URI | Token di firma di accesso condiviso |
---|---|
https://medicalrecords.blob.core.windows.net/patient-images/patient-116139-nq8z7f.jpg? |
sp=r&st=2020-01-20T11:42:32Z&se=2020-01-20T19:42:32Z&spr=https&sv=2019-02-02&sr=b&sig=SrW1HZ5Nb6MbRzTbXCaPm%2BJiSEn15tC91Y4umMPwVZs%3D |
Il token di firma di accesso condiviso contiene i componenti o i parametri di query seguenti.
Parametro query | Nome campo | Esempio | Descrizione |
---|---|---|---|
sp | autorizzazione firmata | sp=r | Indica che è possibile eseguire una o più operazioni che il client può eseguire. I valori possono essere composti: a (aggiungi), c (crea), d (elimina), l (elenca), r (leggi) e w (scrivi). sp=r è solo lettura, sp=acdlrw concede tutti i diritti disponibili. |
st | ora di inizio | st=2020-01-20T11:42:32Z | Data e ora di inizio dell'accesso. |
se | ora di scadenza | se=2020-01-20T19:42:32Z | Data e ora di fine dell'accesso. In base alla data di inizio, questo esempio concede otto ore di accesso. |
spr | protocollo firmato | spr=https | Protocollo autorizzato per una richiesta effettuata con la firma di accesso condiviso. Campo facoltativo con valori possibili sia HTTPS che HTTP (valore predefinito) o solo HTTPS. |
sv | versione firmata | sv=2019-02-02 | Versione del servizio dell'API di archiviazione da usare. |
sr | ambito della risorsa | sr=b | Tipo di archiviazione a cui si accede. I valori disponibili includono: b (BLOB), c (contenitore), d (directory), f (file), s (condivisione) |
sig | firma | sig=SrW1...wVZs%3D | Firma crittografica. |
La firma viene apposta con la chiave dell'account di archiviazione se si crea una firma di accesso condiviso del servizio o dell'account. Se si usa un'entità di sicurezza di Microsoft Entra con accesso all'archiviazione, si crea una firma di accesso condiviso di delega utente. Si concede anche l'azione Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey all'entità.
Creare una firma di accesso condiviso in .NET
Poiché la società offre l'accesso a terze parti, non è possibile usare Microsoft Entra ID per creare entità di servizio per ogni terza parte che richiede l'accesso alle immagini di diagnostica. L'app usa una chiave dell'account di archiviazione per ogni singolo file. La procedura seguente illustra come creare una firma di accesso condiviso usando il codice C#.
Creare un client contenitore BLOB per connettersi all'account di archiviazione in Azure
BlobContainerClient container = new BlobContainerClient( "ConnectionString", "Container" );
Recuperare il BLOB per cui si vuole creare un token di firma di accesso condiviso e creare un BlobClient
foreach (BlobItem blobItem in container.GetBlobs())
{
BlobClient blob = container.GetBlobClient(blobItem.Name);
}
Creare un oggetto BlobSasBuilder per il BLOB che verrà usato per generare il token di firma di accesso condiviso
BlobSasBuilder sas = new BlobSasBuilder
{
BlobContainerName = blob.BlobContainerName,
BlobName = blob.Name,
Resource = "b",
ExpiresOn = DateTimeOffset.UtcNow.AddMinutes(1)
};
// Allow read access
sas.SetPermissions(BlobSasPermissions.Read);
Autenticare una chiamata al metodo ToSasQueryParameters dell'oggetto BlobSasBuilder
StorageSharedKeyCredential storageSharedKeyCredential = new StorageSharedKeyCredential( "AccountName", "AccountKey");
sasToken = sas.ToSasQueryParameters(storageSharedKeyCredential).ToString();
Procedure consigliate
Per ridurre i potenziali rischi derivanti dall'uso delle firme di accesso condiviso, Microsoft raccomanda alcune procedure consigliate:
- Per distribuire in modo sicuro una firma di accesso condiviso e impedire attacchi man-in-the-middle, usare sempre HTTPS.
- La firma di accesso condiviso più sicura è una delega utente. Usarla laddove possibile, perché evita di dover archiviare la chiave dell'account di archiviazione nel codice. Microsoft Entra ID deve essere usato per gestire le credenziali. Questa opzione potrebbe non essere possibile per la soluzione.
- Provare a impostare la data di scadenza sul valore più piccolo utile. Se una chiave di firma di accesso condiviso viene compromessa, potrà così essere sfruttata solo per un breve periodo di tempo.
- Applicare la regola dei privilegi minimi richiesti. Concedere solo l'accesso necessario. Nell'app di questo modulo, ad esempio, è sufficiente l'accesso in sola lettura.
- Ci sono alcune situazioni in cui una firma di accesso condiviso non è una soluzione appropriata. Quando l'uso di una firma di accesso condiviso comporta rischi inaccettabili, creare un servizio di livello intermedio per gestire gli utenti e il loro accesso alle risorse di archiviazione.
Il modo più flessibile e sicuro per usare una firma di accesso condiviso del servizio o dell'account consiste nell'associare i token di firma di accesso condiviso a un criterio di accesso archiviato. Questi vantaggi e il relativo funzionamento verranno esaminati in un'unità successiva.