Condividi tramite


Usare le firme di accesso condiviso di Archiviazione BLOB di Azure per limitare l'accesso ai dati in HDInsight

HDInsight ha accesso completo ai dati negli account di archiviazione BLOB di Azure associati al cluster. È possibile usare le firme di accesso condiviso nel contenitore BLOB per limitare l'accesso ai dati, Le firme di accesso condiviso sono una funzionalità degli account di archiviazione BLOB di Azure che consentono di limitare l'accesso ai dati. Ad esempio, concedendo l'accesso in sola lettura ai dati.

Importante

Per una soluzione che usi Apache Ranger, considerare la possibilità di usare HDInsight aggiunto al dominio. Per altre informazioni, vedere il documento Configurare i cluster HDInsight aggiunti al dominio.

Avviso

HDInsight deve avere accesso completo alla risorsa di archiviazione predefinita per il cluster.

Prerequisiti

  • Un client SSH. Per altre informazioni, vedere Connettersi a HDInsight (Apache Hadoop) con SSH.

  • Contenitore di archiviazione esistente.

  • Se si usa PowerShell, è necessario il modulo Az.

  • Se si vuole usare l'interfaccia della riga di comando di Azure e non è ancora stata installata, vedere Installare l'interfaccia della riga di comando di Azure.

  • Se si usa Python, versione 2.7 o successiva.

  • Se si usa C#, Visual Studio deve essere versione 2013 o successiva.

  • Schema URI per l'account di archiviazione. Questo schema è wasb:// per l'archiviazione BLOB di Azure, abfs:// per Azure Data Lake Storage Gen2 o adl:// per Azure Data Lake Storage Gen1. Se il trasferimento sicuro è abilitato per l'archiviazione BLOB di Azure, l'URI sarà wasbs://.

  • Un cluster HDInsight esistente a cui aggiungere una firma di accesso condiviso. In caso contrario, è possibile usare Azure PowerShell per creare un cluster e aggiungere una firma di accesso condiviso durante la creazione del cluster.

  • I file di esempio da https://github.com/Azure-Samples/hdinsight-dotnet-python-azure-storage-shared-access-signature. Il repository contiene gli elementi seguenti:

    • Un progetto di Visual Studio che può creare un contenitore di archiviazione, i criteri archiviati e la firma di accesso condiviso da usare con HDInsight.
    • Uno script di Python che può creare un contenitore di archiviazione, i criteri archiviati e la firma di accesso condiviso da usare con HDInsight.
    • Uno script di PowerShell in grado di creare un cluster HDInsight e configurarlo per l'uso della firma di accesso condiviso. Di seguito viene usata una versione aggiornata.
    • Un file di esempio: hdinsight-dotnet-python-azure-storage-shared-access-signature-master\sampledata\sample.log

Firme di accesso condiviso

Esistono due tipi di firme di accesso condiviso:

  • Ad hoc: l'ora di inizio, l'ora di scadenza e le autorizzazioni per la firma di accesso condiviso sono tutte specificate nell'URI di firma di accesso condiviso.

  • Stored access policy: i criteri di accesso archiviati vengono definiti in un contenitore di risorse, ad esempio un contenitore BLOB. I criteri di accesso archiviati possono essere usati per gestire i vincoli per una o più firme di accesso condiviso. Quando si associa una firma di accesso condiviso a criteri di accesso archiviati, la firma eredita i vincoli, ovvero ora di inizio, scadenza e autorizzazioni, definiti per i criteri di accesso archiviati.

La differenza tra le due forme è importante un unico scenario chiave, la revoca. Una firma di accesso condiviso è un URL, quindi chiunque ottenga la firma di accesso condiviso può usarla. Non importa chi l'ha richiesto per iniziare. Se la firma di accesso condiviso è stata pubblicata e resa pubblica, può essere usata da chiunque in tutto il mondo. Una forma di accesso condiviso rimane valida finché non si verifica una delle quattro condizioni seguenti:

  1. Viene raggiunta la scadenza specificata nella firma.

  2. Viene raggiunta la scadenza specificata nei criteri di accesso archiviati a cui fa riferimento la firma di accesso condiviso. Gli scenari seguenti portano a raggiungere la scadenza:

    • L'intervallo di tempo è trascorso.
    • Per i criteri di accesso archiviati è stata impostata una scadenza nel passato. Modificando la scadenza è possibile revocare la firma di accesso condiviso.
  3. I criteri di accesso archiviati cui viene fatto riferimento nella firma di accesso condiviso vengono eliminati e ciò corrisponde a un altro modo per revocare la firma. Se si ricreano i criteri di accesso archiviati con lo stesso nome, tutti i token di firma di accesso condiviso per i criteri precedenti sono validi (se la scadenza della firma di accesso condiviso non è passata). Se si intende revocare la firma di accesso condiviso, verificare di usare un nome diverso per ricreare i criteri di accesso archiviati con scadenza nel futuro.

  4. La chiave dell'account utilizzata per creare la firma di accesso condiviso viene rigenerata. Se si rigenera la chiave, l'autenticazione di tutte le applicazioni che usano la chiave precedente avrà esito negativo. Aggiornare tutti i componenti con la nuova chiave.

Importante

L'URI di una firma di accesso condiviso è associato alla chiave dell'account usata per creare la firma e ai relativi criteri di accesso archiviati (se presenti). Se non sono specificati criteri di accesso archiviati, l'unico modo per revocare una firma di accesso condiviso consiste nel modificare la chiave dell'account.

È consigliabile usare sempre i criteri di accesso archiviati. Con i criteri archiviati, è possibile revocare le firme o estendere la scadenza in base alle esigenze. I passaggi illustrati in questo documento permettono di usare i criteri di accesso archiviati per generare firme di accesso condiviso.

Per altre informazioni sulle firme di accesso condiviso, vedere Informazioni sul modello di firma di accesso condiviso.

Creare un criterio archiviato e una firma di accesso condiviso

Salvare il token di firma di accesso condiviso generato alla fine di ogni metodo. Il token sarà simile all'output seguente:

?sv=2018-03-28&sr=c&si=myPolicyPS&sig=NAxefF%2BrR2ubjZtyUtuAvLQgt%2FJIN5aHJMj6OsDwyy4%3D

Utilizzo di PowerShell

Sostituire RESOURCEGROUP, STORAGEACCOUNTe STORAGECONTAINER con i valori appropriati per il contenitore di archiviazione esistente. Modificare la directory hdinsight-dotnet-python-azure-storage-shared-access-signature-master in o modificare il -File parametro in modo che contenga il percorso assoluto per Set-AzStorageblobcontent. Immettere il comando di PowerShell seguente:

$resourceGroupName = "RESOURCEGROUP"
$storageAccountName = "STORAGEACCOUNT"
$containerName = "STORAGECONTAINER"
$policy = "myPolicyPS"

# Login to your Azure subscription
$sub = Get-AzSubscription -ErrorAction SilentlyContinue
if(-not($sub))
{
    Connect-AzAccount
}

# If you have multiple subscriptions, set the one to use
# Select-AzSubscription -SubscriptionId "<SUBSCRIPTIONID>"

# Get the access key for the Azure Storage account
$storageAccountKey = (Get-AzStorageAccountKey `
                                -ResourceGroupName $resourceGroupName `
                                -Name $storageAccountName)[0].Value

# Create an Azure Storage context
$storageContext = New-AzStorageContext `
                                -StorageAccountName $storageAccountName `
                                -StorageAccountKey $storageAccountKey

# Create a stored access policy for the Azure storage container
New-AzStorageContainerStoredAccessPolicy `
   -Container $containerName `
   -Policy $policy `
   -Permission "rl" `
   -ExpiryTime "12/31/2025 08:00:00" `
   -Context $storageContext

# Get the stored access policy or policies for the Azure storage container
Get-AzStorageContainerStoredAccessPolicy `
    -Container $containerName `
    -Context $storageContext

# Generates an SAS token for the Azure storage container
New-AzStorageContainerSASToken `
    -Name $containerName `
    -Policy $policy `
    -Context $storageContext

<# Removes a stored access policy from the Azure storage container
Remove-AzStorageContainerStoredAccessPolicy `
    -Container $containerName `
    -Policy $policy `
    -Context $storageContext
#>

# upload a file for a later example
Set-AzStorageblobcontent `
    -File "./sampledata/sample.log" `
    -Container $containerName `
    -Blob "samplePS.log" `
    -Context $storageContext

Utilizzare l'interfaccia della riga di comando di Azure

L'uso delle variabili in questa sezione si basa su un ambiente Windows. Per bash o altri ambienti sarà necessaria una leggera variazione.

  1. Sostituire STORAGEACCOUNTe STORAGECONTAINER con i valori appropriati per il contenitore di archiviazione esistente.

    # set variables
    set AZURE_STORAGE_ACCOUNT=STORAGEACCOUNT
    set AZURE_STORAGE_CONTAINER=STORAGECONTAINER
    
    #Login
    az login
    
    # If you have multiple subscriptions, set the one to use
    # az account set --subscription SUBSCRIPTION
    
    # Retrieve the primary key for the storage account
    az storage account keys list --account-name %AZURE_STORAGE_ACCOUNT% --query "[0].{PrimaryKey:value}" --output table
    
  2. Impostare la chiave primaria recuperata su una variabile per usarla in un secondo momento. Sostituire PRIMARYKEY con il valore recuperato nel passaggio precedente e quindi immettere il comando seguente:

    #set variable for primary key
    set AZURE_STORAGE_KEY=PRIMARYKEY
    
  3. Modificare la directory hdinsight-dotnet-python-azure-storage-shared-access-signature-master in o modificare il --file parametro in modo che contenga il percorso assoluto per az storage blob upload. Eseguire i comandi rimanenti:

    # Create stored access policy on the containing object
    az storage container policy create --container-name %AZURE_STORAGE_CONTAINER% --name myPolicyCLI --account-key %AZURE_STORAGE_KEY% --account-name %AZURE_STORAGE_ACCOUNT% --expiry 2025-12-31 --permissions rl
    
    # List stored access policies on a containing object
    az storage container policy list --container-name %AZURE_STORAGE_CONTAINER% --account-key %AZURE_STORAGE_KEY% --account-name %AZURE_STORAGE_ACCOUNT%
    
    # Generate a shared access signature for the container
    az storage container generate-sas --name %AZURE_STORAGE_CONTAINER% --policy-name myPolicyCLI --account-key %AZURE_STORAGE_KEY% --account-name %AZURE_STORAGE_ACCOUNT%
    
    # Reversal
    # az storage container policy delete --container-name %AZURE_STORAGE_CONTAINER% --name myPolicyCLI --account-key %AZURE_STORAGE_KEY% --account-name %AZURE_STORAGE_ACCOUNT%
    
    # upload a file for a later example
    az storage blob upload --container-name %AZURE_STORAGE_CONTAINER% --account-key %AZURE_STORAGE_KEY% --account-name %AZURE_STORAGE_ACCOUNT% --name sampleCLI.log --file "./sampledata/sample.log"
    

Uso di Python

Aprire il SASToken.py file e sostituire storage_account_name, storage_account_keye storage_container_name con i valori appropriati per il contenitore di archiviazione esistente e quindi eseguire lo script.

Potrebbe essere necessario eseguire pip install --upgrade azure-storage se viene visualizzato il messaggio di ImportError: No module named azure.storageerrore .

Uso di C#

  1. Aprire la soluzione in Visual Studio.

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto SASExample e scegliere Proprietà.

  3. Selezionare Impostazioni e aggiungere i valori per le voci seguenti:

    Elemento Descrizione
    StorageConnectionString stringa di connessione per l'account di archiviazione per cui si vogliono creare criteri archiviati e una firma di accesso condiviso. Il formato deve essere DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=mykey, dove myaccount è il nome dell'account di archiviazione e mykey è la chiave dell'account di archiviazione.
    ContainerName contenitore nell'account di archiviazione a cui si vuole limitare l'accesso.
    SASPolicyName nome da usare per i criteri archiviati da creare.
    FileToUpload percorso di un file caricato nel contenitore.
  4. Eseguire il progetto. Salvare il token dei criteri di firma di accesso condiviso, il nome dell'account di archiviazione e il nome del contenitore. Questi valori vengono usati quando si associa l'account di archiviazione al cluster HDInsight.

Usare la firma di accesso condiviso con HDInsight

Quando si crea un cluster HDInsight, è necessario specificare un account di archiviazione primario. È anche possibile specificare account di archiviazione aggiuntivi. Entrambi i metodi di aggiunta di risorse di archiviazione richiedono l'accesso completo agli account di archiviazione e ai contenitori usati.

Usare una firma di accesso condiviso per limitare l'accesso al contenitore. Aggiungere una voce personalizzata alla configurazione del sito principale per il cluster. È possibile aggiungere la voce durante la creazione del cluster usando PowerShell o dopo la creazione del cluster usando Ambari.

Creare un cluster che usa la firma di accesso condiviso

Sostituire CLUSTERNAME, RESOURCEGROUP, DEFAULTSTORAGEACCOUNT, STORAGECONTAINER, STORAGEACCOUNTe TOKEN con i valori appropriati. Immettere i comandi di PowerShell:

$clusterName = 'CLUSTERNAME'
$resourceGroupName = 'RESOURCEGROUP'

# Replace with the Azure data center you want to the cluster to live in
$location = 'eastus'

# Replace with the name of the default storage account TO BE CREATED
$defaultStorageAccountName = 'DEFAULTSTORAGEACCOUNT'

# Replace with the name of the SAS container CREATED EARLIER
$SASContainerName = 'STORAGECONTAINER'

# Replace with the name of the SAS storage account CREATED EARLIER
$SASStorageAccountName = 'STORAGEACCOUNT'

# Replace with the SAS token generated earlier
$SASToken = 'TOKEN'

# Default cluster size (# of worker nodes), version, and type
$clusterSizeInNodes = "4"
$clusterVersion = "3.6"
$clusterType = "Hadoop"

# Login to your Azure subscription
$sub = Get-AzSubscription -ErrorAction SilentlyContinue
if(-not($sub))
{
    Connect-AzAccount
}

# If you have multiple subscriptions, set the one to use
# Select-AzSubscription -SubscriptionId "<SUBSCRIPTIONID>"

# Create an Azure Storage account and container
New-AzStorageAccount `
    -ResourceGroupName $resourceGroupName `
    -Name $defaultStorageAccountName `
    -Location $location `
    -SkuName Standard_LRS `
    -Kind StorageV2 `
    -EnableHttpsTrafficOnly 1

$defaultStorageAccountKey = (Get-AzStorageAccountKey `
                                -ResourceGroupName $resourceGroupName `
                                -Name $defaultStorageAccountName)[0].Value

$defaultStorageContext = New-AzStorageContext `
                                -StorageAccountName $defaultStorageAccountName `
                                -StorageAccountKey $defaultStorageAccountKey

# Create a blob container. This holds the default data store for the cluster.
New-AzStorageContainer `
    -Name $clusterName `
    -Context $defaultStorageContext

# Cluster login is used to secure HTTPS services hosted on the cluster
$httpCredential = Get-Credential `
    -Message "Enter Cluster login credentials" `
    -UserName "admin"

# SSH user is used to remotely connect to the cluster using SSH clients
$sshCredential = Get-Credential `
    -Message "Enter SSH user credentials" `
    -UserName "sshuser"

# Create the configuration for the cluster
$config = New-AzHDInsightClusterConfig

$config = $config | Add-AzHDInsightConfigValue `
    -Spark2Defaults @{} `
    -Core @{"fs.azure.sas.$SASContainerName.$SASStorageAccountName.blob.core.windows.net"=$SASToken}

# Create the HDInsight cluster
New-AzHDInsightCluster `
    -Config $config `
    -ResourceGroupName $resourceGroupName `
    -ClusterName $clusterName `
    -Location $location `
    -ClusterSizeInNodes $clusterSizeInNodes `
    -ClusterType $clusterType `
    -OSType Linux `
    -Version $clusterVersion `
    -HttpCredential $httpCredential `
    -SshCredential $sshCredential `
    -DefaultStorageAccountName "$defaultStorageAccountName.blob.core.windows.net" `
    -DefaultStorageAccountKey $defaultStorageAccountKey `
    -DefaultStorageContainer $clusterName

<# REVERSAL
Remove-AzHDInsightCluster `
    -ResourceGroupName $resourceGroupName `
    -ClusterName $clusterName

Remove-AzStorageContainer `
    -Name $clusterName `
    -Context $defaultStorageContext

Remove-AzStorageAccount `
    -ResourceGroupName $resourceGroupName `
    -Name $defaultStorageAccountName

Remove-AzResourceGroup `
    -Name $resourceGroupName
#>

Importante

Quando vengono richiesti un nome e una password per HTTP/S o SSH, è necessario fornire una password che soddisfi i criteri seguenti:

  • Deve avere una lunghezza di almeno 10 caratteri.
  • Deve contenere almeno una cifra.
  • Deve contenere almeno un carattere non alfanumerico.
  • Deve contenere almeno una lettera maiuscola o minuscola.

Il completamento dello script richiede in genere circa 15 minuti. Se lo script viene completato senza errori, il cluster è stato creato.

Usare la firma di accesso condiviso con un cluster esistente

Se si dispone di un cluster esistente, è possibile aggiungere la firma di accesso condiviso alla configurazione core-site seguendo questa procedura:

  1. Aprire l'interfaccia utente Web di Ambari per il cluster. L'indirizzo di questa pagina è https://YOURCLUSTERNAME.azurehdinsight.net. Quando richiesto, eseguire l'autenticazione al cluster con il nome amministratore (admin) e la password usati durante la creazione del cluster.

  2. Passare aHdFS ConfigsAdvanced Custom core-site (Configurazioni >HDFS>Avanzate>core-site).

  3. Espandere la sezione Core-site personalizzato , scorrere fino alla fine e quindi selezionare Aggiungi proprietà.... Usare i valori seguenti per Key e Value:

    • Chiave: fs.azure.sas.CONTAINERNAME.STORAGEACCOUNTNAME.blob.core.windows.net
    • Valore: la firma di accesso condiviso restituita da uno dei metodi eseguiti in precedenza.

    Sostituire CONTAINERNAME con il nome del contenitore usato con l'applicazione C# o SAS. Sostituire STORAGEACCOUNTNAME con il nome dell'account di archiviazione usato.

    Selezionare Aggiungi per salvare la chiave e il valore

  4. Selezionare il pulsante Salva per salvare le modifiche di configurazione. Quando richiesto, aggiungere una descrizione della modifica ("aggiunta dell'accesso all'archiviazione sas", ad esempio) e quindi selezionare Salva.

    Al termine delle modifiche, selezionare OK .

    Importante

    Perché le modifiche siano effettive, è necessario riavviare diversi servizi.

  5. Verrà visualizzato un elenco a discesa Riavvia . Selezionare Riavvia tutto interessato dall'elenco a discesa e quindi Conferma riavvia tutto.

    Ripetere questo processo per MapReduce2 e YARN.

  6. Dopo il riavvio di questi servizi, selezionarli uno alla volta e disabilitare la modalità di manutenzione dall'elenco a discesa Service Actions (Azioni servizio).

Testare l'accesso limitato

Usare la procedura seguente per verificare che sia possibile leggere ed elencare solo gli elementi nell'account di archiviazione sas.

  1. Connettersi al cluster. Sostituire CLUSTERNAME con il nome del cluster e immettere il comando seguente:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. Per elencare il contenuto del contenitore, usare il comando seguente dal prompt:

    hdfs dfs -ls wasbs://SASCONTAINER@SASACCOUNTNAME.blob.core.windows.net/
    

    Sostituire SASCONTAINER con il nome del contenitore creato per l'account di archiviazione sas. Sostituire SASACCOUNTNAME con il nome dell'account di archiviazione usato per la firma di accesso condiviso.

    L'elenco include il file caricato quando sono stati creati il contenitore e la firma di accesso condiviso.

  3. Usare il comando seguente per verificare che sia possibile leggere il contenuto del file. Sostituire e SASCONTAINERSASACCOUNTNAME come nel passaggio precedente. Sostituire sample.log con il nome del file visualizzato nel comando precedente:

    hdfs dfs -text wasbs://SASCONTAINER@SASACCOUNTNAME.blob.core.windows.net/sample.log
    

    Verrà visualizzato il contenuto del file.

  4. Usare il comando seguente per scaricare il file nel file system locale:

    hdfs dfs -get wasbs://SASCONTAINER@SASACCOUNTNAME.blob.core.windows.net/sample.log testfile.txt
    

    Il file verrà scaricato in un file locale denominato testfile.txt.

  5. Usare il comando seguente per caricare il file locale in un nuovo file denominato testupload.txt nella risorsa di archiviazione della firma di accesso condiviso:

    hdfs dfs -put testfile.txt wasbs://SASCONTAINER@SASACCOUNTNAME.blob.core.windows.net/testupload.txt
    

    Verrà visualizzato un messaggio simile al testo seguente:

    put: java.io.IOException
    

    Questo errore si verifica perché il percorso di archiviazione è di sola lettura+elenco. Usare il comando seguente per inserire i dati nella risorsa di archiviazione predefinita per il cluster, accessibile in scrittura:

    hdfs dfs -put testfile.txt wasbs:///testupload.txt
    

    Questa volta l'operazione avrà esito positivo.

Passaggi successivi

Dopo aver appreso come aggiungere spazio di archiviazione ad accesso limitato al cluster HDInsight, è possibile apprendere altri modi per usare i dati nel cluster: