Share via


Utilizar Assinaturas de Acesso Partilhado do Armazenamento de Blobs do Azure para restringir o acesso aos dados no HDInsight

O HDInsight tem acesso total aos dados nas contas de armazenamento de Blobs do Azure associadas ao cluster. Pode utilizar Assinaturas de Acesso Partilhado no contentor de blobs para restringir o acesso aos dados. As Assinaturas de Acesso Partilhado (SAS) são uma funcionalidade das contas de armazenamento de Blobs do Azure que lhe permite limitar o acesso aos dados. Por exemplo, fornecer acesso só de leitura aos dados.

Importante

Para obter uma solução com o Apache Ranger, considere utilizar o HDInsight associado a um domínio. Para obter mais informações, veja o documento Configurar o HDInsight associado a um domínio .

Aviso

O HDInsight tem de ter acesso total ao armazenamento predefinido para o cluster.

Pré-requisitos

  • Um cliente SSH. Para obter mais informações, veja Ligar ao HDInsight (Apache Hadoop) através de SSH.

  • Um contentor de armazenamento existente.

  • Se utilizar o PowerShell, precisará do Módulo Az.

  • Se quiser utilizar a CLI do Azure e ainda não a tiver instalado, consulte Instalar a CLI do Azure.

  • Se estiver a utilizar o Python, versão 2.7 ou superior.

  • Se utilizar C#, o Visual Studio tem de ser a versão 2013 ou superior.

  • O esquema URI da sua conta de armazenamento. Este esquema seria wasb:// para o armazenamento de Blobs do Azure, abfs:// para Azure Data Lake Storage Gen2 ou adl:// para Azure Data Lake Storage Gen1. Se a transferência segura estiver ativada para o armazenamento de Blobs do Azure, o URI será wasbs://.

  • Um cluster do HDInsight existente para adicionar uma Assinatura de Acesso Partilhado. Caso contrário, pode utilizar Azure PowerShell para criar um cluster e adicionar uma Assinatura de Acesso Partilhado durante a criação do cluster.

  • Os ficheiros de exemplo de https://github.com/Azure-Samples/hdinsight-dotnet-python-azure-storage-shared-access-signature. Este repositório contém os seguintes itens:

    • Um projeto do Visual Studio que pode criar um contentor de armazenamento, uma política armazenada e uma SAS para utilização com o HDInsight
    • Um script python que pode criar um contentor de armazenamento, uma política armazenada e uma SAS para utilização com o HDInsight
    • Um script do PowerShell que pode criar um cluster do HDInsight e configurá-lo para utilizar a SAS. Uma versão atualizada é utilizada mais abaixo.
    • Um ficheiro de exemplo: hdinsight-dotnet-python-azure-storage-shared-access-signature-master\sampledata\sample.log

Assinaturas de Acesso Partilhado

Existem duas formas de Assinaturas de Acesso Partilhado:

  • Ad hoc: a hora de início, a hora de expiração e as permissões para a SAS são todas especificadas no URI de SAS.

  • Stored access policy: uma política de acesso armazenada é definida num contentor de recursos, como um contentor de blobs. Uma política pode ser utilizada para gerir restrições para uma ou mais assinaturas de acesso partilhado. Quando associa uma SAS a uma política de acesso armazenada, o SAS herda as restrições - a hora de início, a hora de expiração e as permissões - definidas para a política de acesso armazenado.

A diferença entre os dois formulários é importante para um cenário chave: a revogação. Uma SAS é um URL, pelo que qualquer pessoa que obtenha a SAS pode utilizá-la. Não importa quem pediu para começar. Se uma SAS for publicada publicamente, pode ser utilizada por qualquer pessoa no mundo. Uma SAS distribuída é válida até que uma das quatro coisas aconteça:

  1. É atingido o tempo de expiração especificado no SAS.

  2. É atingido o tempo de expiração especificado na política de acesso armazenado referenciada pela SAS. Os cenários seguintes fazem com que seja atingido o tempo de expiração:

    • O intervalo de tempo decorrido.
    • A política de acesso armazenado é modificada para ter um tempo de expiração no passado. Alterar o tempo de expiração é uma forma de revogar a SAS.
  3. A política de acesso armazenado referenciada pela SAS é eliminada, que é outra forma de revogar a SAS. Se recriar a política de acesso armazenado com o mesmo nome, todos os tokens DE SAS para a política anterior são válidos (se o tempo de expiração no SAS não tiver passado). Se pretender revogar a SAS, certifique-se de que utiliza um nome diferente se recriar a política de acesso com um tempo de expiração no futuro.

  4. A chave de conta utilizada para criar o SAS é regenerada. Regenerar a chave faz com que todas as aplicações que utilizam a chave anterior falhem na autenticação. Atualize todos os componentes para a nova chave.

Importante

Um URI de assinatura de acesso partilhado está associado à chave de conta utilizada para criar a assinatura e à política de acesso armazenado associada (se existir). Se não for especificada nenhuma política de acesso armazenado, a única forma de revogar uma assinatura de acesso partilhado é alterar a chave de conta.

Recomendamos que utilize sempre políticas de acesso armazenado. Ao utilizar políticas armazenadas, pode revogar assinaturas ou prolongar a data de expiração conforme necessário. Os passos neste documento utilizam políticas de acesso armazenado para gerar SAS.

Para obter mais informações sobre Assinaturas de Acesso Partilhado, veja Compreender o modelo SAS.

Criar uma política armazenada e SAS

Guarde o token de SAS produzido no final de cada método. O token terá um aspeto semelhante ao seguinte resultado:

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

Com o PowerShell

Substitua RESOURCEGROUP, STORAGEACCOUNTe STORAGECONTAINER pelos valores adequados para o contentor de armazenamento existente. Altere o diretório para hdinsight-dotnet-python-azure-storage-shared-access-signature-master ou reveja o -File parâmetro para conter o caminho absoluto para Set-AzStorageblobcontent. Introduza o seguinte comando do PowerShell:

$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

Utilizar a CLI do Azure

A utilização de variáveis nesta secção baseia-se num ambiente do Windows. Serão necessárias ligeiras variações para o bash ou outros ambientes.

  1. Substitua STORAGEACCOUNTe STORAGECONTAINER pelos valores adequados para o contentor de armazenamento existente.

    # 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. Defina a chave primária obtida para uma variável para utilização posterior. Substitua PRIMARYKEY pelo valor obtido no passo anterior e, em seguida, introduza o comando abaixo:

    #set variable for primary key
    set AZURE_STORAGE_KEY=PRIMARYKEY
    
  3. Altere o diretório para hdinsight-dotnet-python-azure-storage-shared-access-signature-master ou reveja o --file parâmetro para conter o caminho absoluto para az storage blob upload. Execute os restantes comandos:

    # 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"
    

Utilizar o Python

Abra o SASToken.py ficheiro e substitua storage_account_name, storage_account_keye storage_container_name pelos valores adequados para o contentor de armazenamento existente e, em seguida, execute o script.

Poderá ter de executar pip install --upgrade azure-storage se receber a mensagem ImportError: No module named azure.storagede erro .

Utilizar C#

  1. Abra a solução no Visual Studio.

  2. Em Explorador de Soluções, clique com o botão direito do rato no projeto SASExample e selecione Propriedades.

  3. Selecione Definições e adicione valores para as seguintes entradas:

    Item Descrição
    StorageConnectionString A cadeia de ligação da conta de armazenamento para a qual pretende criar uma política armazenada e SAS. O formato deve ser DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=mykey o myaccount nome da sua conta de armazenamento e mykey é a chave para a conta de armazenamento.
    ContainerName O contentor na conta de armazenamento à qual pretende restringir o acesso.
    SASPolicyName O nome a utilizar para a política armazenada a criar.
    FileToUpload O caminho para um ficheiro que é carregado para o contentor.
  4. Execute o projeto. Guarde o token de política de SAS, o nome da conta de armazenamento e o nome do contentor. Estes valores são utilizados ao associar a conta de armazenamento ao cluster do HDInsight.

Utilizar o SAS com o HDInsight

Ao criar um cluster do HDInsight, tem de especificar uma conta de armazenamento primária. Também pode especificar contas de armazenamento adicionais. Ambos os métodos de adição de armazenamento requerem acesso total às contas de armazenamento e aos contentores utilizados.

Utilize uma Assinatura de Acesso Partilhado para limitar o acesso ao contentor. Adicione uma entrada personalizada à configuração do site principal para o cluster. Pode adicionar a entrada durante a criação do cluster com o PowerShell ou após a criação do cluster com o Ambari.

Criar um cluster que utiliza o SAS

Substitua CLUSTERNAME, RESOURCEGROUP, DEFAULTSTORAGEACCOUNT, STORAGECONTAINER, STORAGEACCOUNTe TOKEN pelos valores adequados. Introduza os comandos do 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 lhe for pedido o nome de utilizador e a palavra-passe http/s ou SSH, tem de fornecer uma palavra-passe que cumpra os seguintes critérios:

  • Tem de ter, pelo menos, 10 carateres de comprimento.
  • Tem de conter, pelo menos, um dígito.
  • Tem de conter, pelo menos, um caráter não alfanumérico.
  • Tem de conter, pelo menos, uma letra maiúscula ou minúscula.

Este script demora algum tempo, normalmente cerca de 15 minutos. Quando o script é concluído sem erros, o cluster é criado.

Utilizar a SAS com um cluster existente

Se tiver um cluster existente, pode adicionar o SAS à configuração do site principal com os seguintes passos:

  1. Abra a IU da Web do Ambari para o cluster. O endereço desta página é https://YOURCLUSTERNAME.azurehdinsight.net. Quando lhe for pedido, autentique-se no cluster com o nome de administrador (administrador) e a palavra-passe que utilizou ao criar o cluster.

  2. Navegue paraConfigurações>HDFS>Advanced>Custom core-site.

  3. Expanda a secção Personalizar site principal , desloque-se até ao fim e, em seguida, selecione Adicionar propriedade.... Utilize os seguintes valores para Chave e Valor:

    • Chave: fs.azure.sas.CONTAINERNAME.STORAGEACCOUNTNAME.blob.core.windows.net
    • Valor: a SAS devolvida por um dos métodos executados anteriormente.

    Substitua CONTAINERNAME pelo nome do contentor que utilizou pela aplicação C# ou SAS. Substitua STORAGEACCOUNTNAME pelo nome da conta de armazenamento que utilizou.

    Selecione Adicionar para guardar esta chave e valor

  4. Selecione o botão Guardar para guardar as alterações de configuração. Quando lhe for pedido, adicione uma descrição da alteração ("adicionar acesso ao armazenamento SAS" por exemplo) e, em seguida, selecione Guardar.

    Selecione OK quando as alterações tiverem sido concluídas.

    Importante

    Tem de reiniciar vários serviços antes que a alteração entre em vigor.

  5. Será apresentada uma lista pendente Reiniciar . Selecione Reiniciar Tudo Afetado na lista pendente e, em seguida, Confirmar Reiniciar Tudo.

    Repita este processo para MapReduce2 e YARN.

  6. Depois de os serviços serem reiniciados, selecione cada um deles e desative o modo de manutenção no menu pendente Ações de Serviço .

Testar o acesso restrito

Utilize os seguintes passos para verificar se só consegue ler e listar itens na conta de armazenamento SAS.

  1. Ligue-se ao cluster. Substitua CLUSTERNAME pelo nome do cluster e introduza o seguinte comando:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. Para listar o conteúdo do contentor, utilize o seguinte comando na linha de comandos:

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

    Substitua SASCONTAINER pelo nome do contentor criado para a conta de armazenamento SAS. Substitua SASACCOUNTNAME pelo nome da conta de armazenamento utilizada para a SAS.

    A lista inclui o ficheiro carregado quando o contentor e a SAS foram criados.

  3. Utilize o seguinte comando para verificar se consegue ler o conteúdo do ficheiro. Substitua e SASCONTAINERSASACCOUNTNAME como no passo anterior. Substitua sample.log pelo nome do ficheiro apresentado no comando anterior:

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

    Este comando lista os conteúdos do ficheiro.

  4. Utilize o seguinte comando para transferir o ficheiro para o sistema de ficheiros local:

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

    Este comando transfere o ficheiro para um ficheiro local com o nome testfile.txt.

  5. Utilize o seguinte comando para carregar o ficheiro local para um novo ficheiro com o nome testupload.txt no armazenamento SAS:

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

    Recebe uma mensagem semelhante ao seguinte texto:

    put: java.io.IOException
    

    Este erro ocorre porque a localização de armazenamento é só de leitura+lista. Utilize o seguinte comando para colocar os dados no armazenamento predefinido para o cluster, que é gravável:

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

    Desta vez, a operação deverá ser concluída com êxito.

Passos seguintes

Agora que aprendeu a adicionar armazenamento de acesso limitado ao cluster do HDInsight, saiba outras formas de trabalhar com dados no cluster: