Creare una firma di accesso condiviso (SAS) di delega utente per un contenitore o un blob con Python

Una firma di accesso condiviso (SAS) permette all'utente di concedere l'accesso limitato a contenitori e BLOB nell'account di archiviazione. Quando si crea una firma di accesso condiviso, si specificano i relativi vincoli, incluse le risorse di Archiviazione di Azure alle quali un client è autorizzato ad accedere, le autorizzazioni di cui dispone per tali risorse e la durata della validità della firma di accesso condiviso.

Ogni SAS è firmata con una chiave. È possibile firmare un SAS in uno di questi due modi:

  • Con una chiave creata utilizzando le credenziali di Microsoft Entra. Una firma di accesso condiviso (SAS) firmata con le credenziali di Microsoft Entra è una SAS di delega utente. A un client che crea una SAS di delega utente deve essere assegnato un ruolo RBAC di Azure che includa l'azione Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey. Per saperne di più, vedere Creare una firma di accesso condiviso delegata dall'utente.
  • Con la chiave dell'account di archiviazione. Una chiave di accesso condiviso del servizio e una chiave di accesso condiviso dell'account sono entrambe firmate con la chiave dell'account condivisa. Il client che crea una SAS del servizio deve avere accesso diretto alla chiave dell'account oppure deve essere assegnata l'autorizzazione Microsoft.Storage/storageAccounts/listkeys/action. Per altre informazioni, vedere Creare una firma di accesso condiviso del servizio oppure Creare una firma di accesso condiviso dell'account.

Nota

Una SAS di delega utente offre una sicurezza superiore rispetto a una SAS firmata con la chiave dell'account di archiviazione. Quando possibile, Microsoft consiglia di usare una firma di accesso condiviso con delega utente. Per altre informazioni, vedere Concedere accesso limitato ai dati con firme di accesso condiviso.

Questo articolo illustra come utilizzare le credenziali di Microsoft Entra per creare una SAS di delega utente per un contenitore o un blob utilizzando la libreria client di Archiviazione di Azure per Python.

Informazioni sulla firma di accesso condiviso (SAS) delegata all'utente

Un token SAS per accedere a un contenitore o a un BLOB può essere protetto usando le credenziali di Microsoft Entra oppure una chiave dell'account. Una firma di accesso condiviso (SAS) protetta con credenziali Microsoft Entra è chiamata SAS di delega utente, perché il token OAuth 2.0 usato per firmare la SAS viene richiesto per conto dell'utente.

Microsoft raccomanda di usare le credenziali di Microsoft Entra, quando è possibile, come procedura consigliata per la sicurezza, invece di usare la chiave dell'account, che può essere compromessa più facilmente. Se la progettazione dell'applicazione richiede firme di accesso condiviso (SAS), usa le credenziali di Microsoft Entra per creare un SAS di delega utente per una maggiore sicurezza. Per altre informazioni sulla firma di accesso condiviso (SAS) delegata dall'utente, vedi Creare una firma di accesso condiviso (SAS) delegata dall'utente.

Attenzione

Qualsiasi client che dispone di una SAS valida può accedere ai dati nel tuo account di archiviazione, come consentito da tale SAS. È importante proteggere una firma di accesso condiviso (SAS) da usi impropri o non intenzionali. Agisci con prudenza nel distribuire un SAS e predisponi un piano per revocare un SAS compromesso. Per evitare utilizzi non previsti, usa un SAS delegato dall'utente e associato a uno specifico utente, che associa il token SAS all'utente finale designato e non può essere usato da nessun altro.

Per altre informazioni sulle firme di accesso condiviso, vedere Concedere accesso limitato alle risorse di archiviazione di Azure tramite firme di accesso condiviso.

Assegnare ruoli di Azure per l'accesso ai dati

Quando un'entità di sicurezza di Microsoft Entra tenta di accedere ai dati, tale entità deve avere le autorizzazioni per la risorsa. Se l'entità di sicurezza è un'identità gestita in Azure o un account utente Microsoft Entra che esegue codice nell'ambiente di sviluppo, all'entità di sicurezza deve essere assegnato un ruolo di Azure che concede l'accesso ai dati. Per informazioni su come assegnare le autorizzazioni tramite Azure RBAC, vedere Assegnare un ruolo di Azure per accedere ai dati BLOB.

Impostare il progetto

Per usare gli esempi di codice in questo articolo, seguire questa procedura per configurare il progetto.

Installare i pacchetti

Installare i pacchetti seguenti tramite pip install:

pip install azure-storage-blob azure-identity

Configurare il codice dell'app

Aggiungere le direttive import seguenti:

from azure.identity import DefaultAzureCredential
from azure.storage.blob import (
    BlobServiceClient,
    ContainerClient,
    BlobClient,
    BlobSasPermissions,
    ContainerSasPermissions,
    UserDelegationKey,
    generate_container_sas,
    generate_blob_sas
)

Ottenere una credenziale del token autenticato

Per ottenere le credenziali del token che il codice può usare per autorizzare le richieste all'Archivio BLOB, creare un'istanza della classe DefaultAzureCredential. Per altre informazioni sull'uso della classe DefaultAzureCredential per autorizzare un'identità gestita ad accedere all'Archivio BLOB, vedere Libreria client di Identità di Azure per Python.

Il frammento di codice seguente illustra come ottenere le credenziali del token autenticato e usarlo per creare un client del servizio per l'Archivio BLOB:

# Construct the blob endpoint from the account name
account_url = "https://<storage-account-name>.blob.core.windows.net"

#Create a BlobServiceClient object using DefaultAzureCredential
blob_service_client = BlobServiceClient(account_url, credential=DefaultAzureCredential())

Per altre informazioni sull'autorizzazione dell'accesso all'Archivio BLOB dalle applicazioni con Python SDK, vedere Autenticare le app Python nei servizi di Azure.

Ottenere la chiave di delega utente

Ogni SAS è firmata con una chiave. Per creare una firma di accesso condiviso (SAS) con delega utente, è necessario prima richiedere una chiave di delega utente, che viene quindi utilizzata per apporre la firma SAS. La chiave di delega utente è analoga alla chiave dell'account usata per firmare una SAS di servizio o una SAS dell'account, con la differenza che si basa sulle credenziali di Microsoft Entra. Quando un client richiede una chiave di delega utente utilizzando un token OAuth 2.0, l'Archivio BLOB restituisce la chiave di delega utente per conto dell'utente.

Dopo aver ottenuto la chiave di delega utente, è possibile utilizzarla per creare un numero qualsiasi di firme di accesso condiviso di delega utente, per l'intera durata della chiave. La chiave di delega utente è indipendente dal token OAuth 2.0 utilizzato per acquisirla, quindi non è necessario rinnovare il token se la chiave è ancora valida. È possibile specificare l'intervallo di tempo di validità della chiave, fino a un massimo di sette giorni.

Usare uno dei metodi seguenti per richiedere la chiave di delega utente:

Nell'esempio di codice seguente viene illustrato come richiedere la chiave di delega utente:

def request_user_delegation_key(self, blob_service_client: BlobServiceClient) -> UserDelegationKey:
    # Get a user delegation key that's valid for 1 day
    delegation_key_start_time = datetime.datetime.now(datetime.timezone.utc)
    delegation_key_expiry_time = delegation_key_start_time + datetime.timedelta(days=1)

    user_delegation_key = blob_service_client.get_user_delegation_key(
        key_start_time=delegation_key_start_time,
        key_expiry_time=delegation_key_expiry_time
    )

    return user_delegation_key

Creare una SAS di delega utente

È possibile creare una SAS di delega utente per un contenitore o un blob, in base alle esigenze dell'app.

Dopo aver ottenuto la chiave di delega utente, è possibile creare una SAS di delega utente. È possibile creare una SAS di delega utente per delegare un accesso limitato a una risorsa container utilizzando il metodo seguente:

La chiave di delega utente per firmare il SAS viene passata al metodo come argomento user_delegation_key. Le autorizzazioni consentite vengono passate al metodo come argomento permission e vengono definite nella classe ContainerSasPermissions.

L'esempio di codice seguente mostra come creare una SAS di delega utente per un contenitore:

def create_user_delegation_sas_container(self, container_client: ContainerClient, user_delegation_key: UserDelegationKey):
    # Create a SAS token that's valid for one day, as an example
    start_time = datetime.datetime.now(datetime.timezone.utc)
    expiry_time = start_time + datetime.timedelta(days=1)

    sas_token = generate_container_sas(
        account_name=container_client.account_name,
        container_name=container_client.container_name,
        user_delegation_key=user_delegation_key,
        permission=ContainerSasPermissions(read=True),
        expiry=expiry_time,
        start=start_time
    )

    return sas_token

Usare una SAS di delega utente per autorizzare un oggetto client

È possibile usare una firma di accesso condiviso con delega utente per autorizzare un oggetto client a eseguire operazioni su un contenitore o un BLOB in base alle autorizzazioni concesse dalla SAS.

L'esempio di codice seguente mostra come usare la SAS di delega utente creata nell'esempio precedente per autorizzare un oggetto ContainerClient. Questo oggetto client può essere utilizzato per eseguire operazioni sulla risorsa del contenitore in base alle autorizzazioni concesse dalla firma di accesso condiviso (SAS).

# The SAS token string can be appended to the resource URL with a ? delimiter
# or passed as the credential argument to the client constructor
sas_url = f"{container_client.url}?{sas_token}"

# Create a ContainerClient object with SAS authorization
container_client_sas = ContainerClient.from_container_url(container_url=sas_url)

Risorse

Per altre informazioni su come creare una SAS di delega utente con la libreria client di Archiviazione BLOB di Azure per Python, vedere le risorse seguenti.

Esempi di codice

Operazioni dell'API REST

Azure SDK per Python contiene librerie basate sull'API REST di Azure, che consentono di interagire con le operazioni dell'API REST tramite paradigmi Python noti. Il metodo della libreria client per ottenere una chiave di delega utente usa le operazioni API REST seguenti:

Risorse della libreria client

Vedi anche

  • Questo articolo fa parte della Guida per sviluppatori di Archiviazione BLOB per Python. Per altre informazioni, vedere l’elenco completo degli articoli della Guida per sviluppatori in Creare la propria app Python.