Använda Signaturer för delad åtkomst i Azure Blob Storage för att begränsa åtkomsten till data i HDInsight

HDInsight har fullständig åtkomst till data i De Azure Blob Storage-konton som är associerade med klustret. Du kan använda signaturer för delad åtkomst i blobcontainern för att begränsa åtkomsten till data. Signaturer för delad åtkomst (SAS) är en funktion i Azure Blob Storage-konton som gör att du kan begränsa åtkomsten till data. Till exempel att ge skrivskyddad åtkomst till data.

Viktigt

Överväg att använda domänanslutna HDInsight för en lösning som använder Apache Ranger. Mer information finns i dokumentet Konfigurera domänansluten HDInsight .

Varning

HDInsight måste ha fullständig åtkomst till standardlagringen för klustret.

Förutsättningar

  • En SSH-klient. Mer information finns i Ansluta till HDInsight (Apache Hadoop) med hjälp av SSH.

  • En befintlig lagringscontainer.

  • Om du använder PowerShell behöver du Az-modulen.

  • Om du vill använda Azure CLI och du ännu inte har installerat det kan du läsa Installera Azure CLI.

  • Om du använder Python version 2.7 eller senare.

  • Om du använder C# måste Visual Studio vara version 2013 eller senare.

  • URI-schemat för ditt lagringskonto. Det här schemat skulle vara wasb:// för Azure Blob Storage, abfs:// för Azure Data Lake Storage Gen2 eller adl:// för Azure Data Lake Storage Gen1. Om säker överföring är aktiverat för Azure Blob Storage är wasbs://URI:n .

  • Ett befintligt HDInsight-kluster att lägga till en signatur för delad åtkomst till. Annars kan du använda Azure PowerShell för att skapa ett kluster och lägga till en signatur för delad åtkomst när klustret skapas.

  • Exempelfilerna från https://github.com/Azure-Samples/hdinsight-dotnet-python-azure-storage-shared-access-signature. Den här lagringsplatsen innehåller följande objekt:

    • Ett Visual Studio-projekt som kan skapa en lagringscontainer, lagrad princip och SAS för användning med HDInsight
    • Ett Python-skript som kan skapa en lagringscontainer, lagrad princip och SAS för användning med HDInsight
    • Ett PowerShell-skript som kan skapa ett HDInsight-kluster och konfigurera det att använda SAS. En uppdaterad version används nedan.
    • En exempelfil: hdinsight-dotnet-python-azure-storage-shared-access-signature-master\sampledata\sample.log

Signaturer för delad åtkomst

Det finns två former av signaturer för delad åtkomst:

  • Ad hoc: Starttid, förfallotid och behörigheter för SAS anges alla på SAS-URI:n.

  • Stored access policy: En lagrad åtkomstprincip definieras på en resurscontainer, till exempel en blobcontainer. En princip kan användas för att hantera begränsningar för en eller flera signaturer för delad åtkomst. När du associerar en SAS med en lagrad åtkomstprincip ärver SAS de begränsningar – starttid, förfallotid och behörigheter – som definierats för den lagrade åtkomstprincipen.

Skillnaden mellan de två formulären är viktig för ett nyckelscenario: återkallande. En SAS är en URL, så alla som hämtar SAS kan använda den. Det spelar ingen roll vem som begärde det till att börja med. Om en SAS publiceras offentligt kan den användas av vem som helst i världen. En SAS som distribueras är giltig tills en av fyra saker händer:

  1. Den förfallotid som anges i SAS har uppnåtts.

  2. Den förfallotid som anges för den lagrade åtkomstprincipen som refereras av SAS nås. Följande scenarier gör att förfallotiden nås:

    • Tidsintervallet har förflutit.
    • Den lagrade åtkomstprincipen ändras så att den har en förfallotid tidigare. Att ändra förfallotiden är ett sätt att återkalla SAS.
  3. Den lagrade åtkomstprincipen som refereras av SAS tas bort, vilket är ett annat sätt att återkalla SAS. Om du återskapar den lagrade åtkomstprincipen med samma namn är alla SAS-token för den tidigare principen giltiga (om förfallotiden för SAS inte har passerat). Om du tänker återkalla SAS ska du använda ett annat namn om du återskapar åtkomstprincipen med en förfallotid i framtiden.

  4. Kontonyckeln som användes för att skapa SAS återskapas. Om du återskapar nyckeln misslyckas autentiseringen av alla program som använder den tidigare nyckeln. Uppdatera alla komponenter till den nya nyckeln.

Viktigt

En signatur-URI för delad åtkomst är associerad med den kontonyckel som används för att skapa signaturen och den associerade lagrade åtkomstprincipen (om någon). Om ingen lagrad åtkomstprincip har angetts är det enda sättet att återkalla en signatur för delad åtkomst att ändra kontonyckeln.

Vi rekommenderar att du alltid använder lagrade åtkomstprinciper. När du använder lagrade principer kan du antingen återkalla signaturer eller förlänga förfallodatumet efter behov. Stegen i det här dokumentet använder lagrade åtkomstprinciper för att generera SAS.

Mer information om signaturer för delad åtkomst finns i Förstå SAS-modellen.

Skapa en lagrad princip och SAS

Spara SAS-token som skapas i slutet av varje metod. Token ser ut ungefär så här:

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

Använda PowerShell

Ersätt RESOURCEGROUP, STORAGEACCOUNToch STORAGECONTAINER med lämpliga värden för din befintliga lagringscontainer. Ändra katalog till hdinsight-dotnet-python-azure-storage-shared-access-signature-master eller ändra parametern -File så att den innehåller den absoluta sökvägen för Set-AzStorageblobcontent. Ange följande PowerShell-kommando:

$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

Använda Azure CLI

Användningen av variabler i det här avsnittet baseras på en Windows-miljö. Det behövs små variationer för bash eller andra miljöer.

  1. Ersätt STORAGEACCOUNToch STORAGECONTAINER med lämpliga värden för din befintliga lagringscontainer.

    # 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. Ange den hämtade primärnyckeln till en variabel för senare användning. Ersätt PRIMARYKEY med det hämtade värdet i föregående steg och ange sedan kommandot nedan:

    #set variable for primary key
    set AZURE_STORAGE_KEY=PRIMARYKEY
    
  3. Ändra katalog till hdinsight-dotnet-python-azure-storage-shared-access-signature-master eller ändra parametern --file så att den innehåller den absoluta sökvägen för az storage blob upload. Kör de återstående kommandona:

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

Använda Python

SASToken.py Öppna filen och ersätt storage_account_name, storage_account_keyoch storage_container_name med lämpliga värden för din befintliga lagringscontainer och kör sedan skriptet.

Du kan behöva köra pip install --upgrade azure-storage om du får felmeddelandet ImportError: No module named azure.storage.

Använda C#

  1. Öppna lösningen i Visual Studio.

  2. I Solution Explorer högerklickar du på SASExample-projektet och väljer Egenskaper.

  3. Välj Inställningar och lägg till värden för följande poster:

    Objekt Beskrivning
    StorageConnectionString Anslutningssträngen för lagringskontot som du vill skapa en lagrad princip och SAS för. Formatet ska vara DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=mykey där myaccount är namnet på ditt lagringskonto och mykey är nyckeln för lagringskontot.
    ContainerName Containern i lagringskontot som du vill begränsa åtkomsten till.
    SASPolicyName Namnet som ska användas för den lagrade principen som ska skapas.
    FileToUpload Sökvägen till en fil som laddas upp till containern.
  4. Kör projektet. Spara SAS-principtoken, lagringskontots namn och containernamnet. Dessa värden används när du associerar lagringskontot med ditt HDInsight-kluster.

Använda SAS med HDInsight

När du skapar ett HDInsight-kluster måste du ange ett primärt lagringskonto. Du kan också ange ytterligare lagringskonton. Båda dessa metoder för att lägga till lagring kräver fullständig åtkomst till de lagringskonton och containrar som används.

Använd en signatur för delad åtkomst för att begränsa containeråtkomsten. Lägg till en anpassad post i kärnplatskonfigurationen för klustret. Du kan lägga till posten när klustret skapas med hjälp av PowerShell eller när klustret har skapats med hjälp av Ambari.

Skapa ett kluster som använder SAS

Ersätt CLUSTERNAME, RESOURCEGROUP, DEFAULTSTORAGEACCOUNT, STORAGECONTAINER, STORAGEACCOUNToch TOKEN med lämpliga värden. Ange PowerShell-kommandona:

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

Viktigt

När du uppmanas att ange HTTP/s- eller SSH-användarnamn och lösenord måste du ange ett lösenord som uppfyller följande kriterier:

  • Måste vara minst 10 tecken långt.
  • Måste innehålla minst en siffra.
  • Måste innehålla minst ett icke-alfanumeriskt tecken.
  • Måste innehålla minst en versal eller gemen.

Det tar en stund för skriptet att slutföras, vanligtvis cirka 15 minuter. När skriptet har slutförts utan fel har klustret skapats.

Använda SAS med ett befintligt kluster

Om du har ett befintligt kluster kan du lägga till SAS i kärnplatskonfigurationen med hjälp av följande steg:

  1. Öppna Ambari-webbgränssnittet för klustret. Adressen för den här sidan är https://YOURCLUSTERNAME.azurehdinsight.net. När du uppmanas till det autentiserar du till klustret med hjälp av administratörsnamnet (administratören) och lösenordet som du använde när du skapade klustret.

  2. Gå till HDFS>Configs> AdvancedCustom core-site (Avancerad> anpassad kärnwebbplats).

  3. Expandera avsnittet Anpassad kärnwebbplats , rulla till slutet och välj sedan Lägg till egenskap.... Använd följande värden för Nyckel och Värde:

    • Nyckel: fs.azure.sas.CONTAINERNAME.STORAGEACCOUNTNAME.blob.core.windows.net
    • Värde: DEN SAS som returnerades av någon av metoderna som kördes tidigare.

    Ersätt CONTAINERNAME med det containernamn som du använde med C# eller SAS-programmet. Ersätt STORAGEACCOUNTNAME med namnet på lagringskontot som du använde.

    Välj Lägg till för att spara den här nyckeln och värdet

  4. Välj knappen Spara för att spara konfigurationsändringarna. När du uppmanas till det lägger du till en beskrivning av ändringen (till exempel "lägger till SAS-lagringsåtkomst" och väljer sedan Spara.

    Välj OK när ändringarna har slutförts.

    Viktigt

    Du måste starta om flera tjänster innan ändringen börjar gälla.

  5. Listrutan Starta om visas. Välj Starta om alla som påverkas i listrutan och bekräfta sedan Starta om alla.

    Upprepa den här processen för MapReduce2 och YARN.

  6. När tjänsterna har startats om väljer du var och en och inaktiverar underhållsläget i listrutan Tjänståtgärder .

Testa begränsad åtkomst

Använd följande steg för att kontrollera att du bara kan läsa och visa objekt på SAS-lagringskontot.

  1. Anslut till klustret. Ersätt CLUSTERNAME med namnet på klustret och ange följande kommando:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. Om du vill visa innehållet i containern använder du följande kommando från prompten:

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

    Ersätt SASCONTAINER med namnet på containern som skapades för SAS-lagringskontot. Ersätt SASACCOUNTNAME med namnet på lagringskontot som används för SAS.

    Listan innehåller filen som laddades upp när containern och SAS skapades.

  3. Använd följande kommando för att kontrollera att du kan läsa innehållet i filen. SASCONTAINER Ersätt och SASACCOUNTNAME som i föregående steg. Ersätt sample.log med namnet på filen som visades i föregående kommando:

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

    Det här kommandot visar innehållet i filen.

  4. Använd följande kommando för att ladda ned filen till det lokala filsystemet:

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

    Det här kommandot laddar ned filen till en lokal fil med namnet testfile.txt.

  5. Använd följande kommando för att ladda upp den lokala filen till en ny fil med namnet testupload.txt på SAS-lagringen:

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

    Du får ett meddelande som liknar följande text:

    put: java.io.IOException
    

    Det här felet beror på att lagringsplatsen endast är skrivskyddad. Använd följande kommando för att placera data på standardlagringen för klustret, vilket är skrivbart:

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

    Den här gången bör åtgärden slutföras.

Nästa steg

Nu när du har lärt dig hur du lägger till lagring med begränsad åtkomst till ditt HDInsight-kluster kan du lära dig andra sätt att arbeta med data i klustret: