Shared Access Signatures van Azure Blob Storage gebruiken om de toegang tot gegevens in HDInsight te beperken

HDInsight heeft volledige toegang tot gegevens in de Azure Blob Storage-accounts die zijn gekoppeld aan het cluster. U kunt Shared Access Signatures in de blobcontainer gebruiken om de toegang tot de gegevens te beperken. Shared Access Signatures (SAS) is een functie van Azure Blob Storage-accounts waarmee u de toegang tot gegevens kunt beperken. Bijvoorbeeld het bieden van alleen-lezentoegang tot gegevens.

Belangrijk

Voor een oplossing met Apache Ranger kunt u hdinsight gebruiken die lid is van een domein. Zie het document HdInsight configureren dat lid is van een domein voor meer informatie.

Waarschuwing

HDInsight moet volledige toegang hebben tot de standaardopslag voor het cluster.

Vereisten

  • Een SSH-client. Zie voor meer informatie Verbinding maken met HDInsight (Apache Hadoop) via SSH.

  • Een bestaande opslagcontainer.

  • Als u PowerShell gebruikt, hebt u de Az-module nodig.

  • Als u Azure CLI wilt gebruiken en u deze nog niet hebt geïnstalleerd, raadpleegt u De Azure CLI installeren.

  • Als u Python gebruikt, versie 2.7 of hoger.

  • Als u C# gebruikt, moet Visual Studio versie 2013 of hoger zijn.

  • Het URI-schema voor uw opslagaccount. Dit schema is wasb:// voor Azure Blob Storage, abfs:// voor Azure Data Lake Storage Gen2 of adl:// voor Azure Data Lake Storage Gen1. Als beveiligde overdracht is ingeschakeld voor Azure Blob Storage, is wasbs://de URI .

  • Een bestaand HDInsight-cluster waaraan u een Shared Access Signature wilt toevoegen. Zo niet, dan kunt u Azure PowerShell gebruiken om een cluster te maken en een Shared Access Signature toe te voegen tijdens het maken van het cluster.

  • De voorbeeldbestanden van https://github.com/Azure-Samples/hdinsight-dotnet-python-azure-storage-shared-access-signature. Deze opslagplaats bevat de volgende items:

    • Een Visual Studio-project dat een opslagcontainer, opgeslagen beleid en SAS kan maken voor gebruik met HDInsight
    • Een Python-script dat een opslagcontainer, opgeslagen beleid en SAS kan maken voor gebruik met HDInsight
    • Een PowerShell-script waarmee een HDInsight-cluster kan worden gemaakt en geconfigureerd voor het gebruik van de SAS. Hieronder wordt een bijgewerkte versie gebruikt.
    • Een voorbeeldbestand: hdinsight-dotnet-python-azure-storage-shared-access-signature-master\sampledata\sample.log

Shared Access Signatures

Er zijn twee vormen van Shared Access Signatures:

  • Ad hoc: de begintijd, verlooptijd en machtigingen voor de SAS zijn allemaal opgegeven in de SAS-URI.

  • Stored access policy: Er wordt een opgeslagen toegangsbeleid gedefinieerd voor een resourcecontainer, zoals een blobcontainer. Een beleid kan worden gebruikt voor het beheren van beperkingen voor een of meer handtekeningen voor gedeelde toegang. Wanneer u een SAS koppelt aan een opgeslagen toegangsbeleid, neemt de SAS de beperkingen over (de begintijd, verlooptijd en machtigingen) die zijn gedefinieerd voor het opgeslagen toegangsbeleid.

Het verschil tussen de twee formulieren is belangrijk voor één belangrijk scenario: intrekking. Een SAS is een URL, zodat iedereen die de SAS verkrijgt, deze kan gebruiken. Het maakt niet uit wie het om te beginnen heeft gevraagd. Als een SAS openbaar wordt gepubliceerd, kan deze door iedereen ter wereld worden gebruikt. Een sas die wordt gedistribueerd, is geldig totdat een van de vier dingen gebeurt:

  1. De verlooptijd die op de SAS is opgegeven, is bereikt.

  2. De verlooptijd die is opgegeven in het opgeslagen toegangsbeleid waarnaar wordt verwezen door de SAS, is bereikt. De volgende scenario's zorgen ervoor dat de verlooptijd wordt bereikt:

    • Het tijdsinterval is verstreken.
    • Het opgeslagen toegangsbeleid wordt gewijzigd om een verlooptijd in het verleden te hebben. Het wijzigen van de verlooptijd is een manier om de SAS in te trekken.
  3. Het opgeslagen toegangsbeleid waarnaar wordt verwezen door de SAS, wordt verwijderd. Dit is een andere manier om de SAS in te trekken. Als u het opgeslagen toegangsbeleid opnieuw maakt met dezelfde naam, zijn alle SAS-tokens voor het vorige beleid geldig (als de verlooptijd op de SAS niet is verstreken). Als u van plan bent om de SAS in te trekken, moet u een andere naam gebruiken als u het toegangsbeleid opnieuw maakt met een verlooptijd in de toekomst.

  4. De accountsleutel die is gebruikt om de SAS te maken, wordt opnieuw gegenereerd. Het opnieuw genereren van de sleutel zorgt ervoor dat alle toepassingen die de vorige sleutel gebruiken, mislukken de verificatie. Werk alle onderdelen bij naar de nieuwe sleutel.

Belangrijk

Een Shared Access Signature-URI is gekoppeld aan de accountsleutel die wordt gebruikt om de handtekening te maken en het bijbehorende opgeslagen toegangsbeleid (indien aanwezig). Als er geen opgeslagen toegangsbeleid is opgegeven, kunt u een handtekening voor gedeelde toegang alleen intrekken door de accountsleutel te wijzigen.

U wordt aangeraden altijd opgeslagen toegangsbeleid te gebruiken. Wanneer u opgeslagen beleidsregels gebruikt, kunt u handtekeningen intrekken of de vervaldatum naar behoefte verlengen. In de stappen in dit document wordt gebruikgemaakt van opgeslagen toegangsbeleid om SAS te genereren.

Zie Inzicht in het SAS-model voor meer informatie over Shared Access Signatures.

Een opgeslagen beleid en SAS maken

Sla het SAS-token op dat aan het einde van elke methode wordt geproduceerd. Het token ziet er ongeveer als volgt uit:

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

PowerShell gebruiken

Vervang RESOURCEGROUP, STORAGEACCOUNTen STORAGECONTAINER door de juiste waarden voor uw bestaande opslagcontainer. Wijzig de map in hdinsight-dotnet-python-azure-storage-shared-access-signature-master of wijzig de -File parameter zodat deze het absolute pad voor Set-AzStorageblobcontentbevat. Voer de volgende PowerShell-opdracht in:

$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

Azure CLI gebruiken

Het gebruik van variabelen in deze sectie is gebaseerd op een Windows-omgeving. Er zijn kleine variaties nodig voor bash of andere omgevingen.

  1. Vervang STORAGEACCOUNT, en STORAGECONTAINER door de juiste waarden voor uw bestaande opslagcontainer.

    # 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. Stel de opgehaalde primaire sleutel in op een variabele voor later gebruik. Vervang door PRIMARYKEY de opgehaalde waarde in de vorige stap en voer de onderstaande opdracht in:

    #set variable for primary key
    set AZURE_STORAGE_KEY=PRIMARYKEY
    
  3. Wijzig de map in hdinsight-dotnet-python-azure-storage-shared-access-signature-master of wijzig de --file parameter zodat deze het absolute pad voor az storage blob uploadbevat. Voer de overige opdrachten uit:

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

Python gebruiken

Open het SASToken.py bestand en vervang storage_account_name, storage_account_keyen storage_container_name door de juiste waarden voor uw bestaande opslagcontainer en voer het script uit.

Mogelijk moet u uitvoeren pip install --upgrade azure-storage als u het foutbericht ImportError: No module named azure.storageontvangt.

C# gebruiken

  1. Open de oplossing in Visual Studio.

  2. Klik in Solution Explorer met de rechtermuisknop op het project SASExample en selecteer Eigenschappen.

  3. Selecteer Instellingen en voeg waarden toe voor de volgende vermeldingen:

    Item Beschrijving
    StorageConnectionString De connection string voor het opslagaccount waarvoor u een opgeslagen beleid en SAS wilt maken. De indeling moet de naam van uw opslagaccount zijn DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=mykeymyaccount en mykey de sleutel voor het opslagaccount.
    ContainerName De container in het opslagaccount waartoe u de toegang wilt beperken.
    SASPolicyName De naam die moet worden gebruikt om het opgeslagen beleid te maken.
    FileToUpload Het pad naar een bestand dat is geüpload naar de container.
  4. Voer het project uit. Sla het SAS-beleidstoken, de naam van het opslagaccount en de containernaam op. Deze waarden worden gebruikt bij het koppelen van het opslagaccount aan uw HDInsight-cluster.

De SAS gebruiken met HDInsight

Wanneer u een HDInsight-cluster maakt, moet u een primair opslagaccount opgeven. U kunt ook extra opslagaccounts opgeven. Beide methoden voor het toevoegen van opslag vereisen volledige toegang tot de opslagaccounts en containers die worden gebruikt.

Gebruik een Shared Access Signature om de toegang tot containers te beperken. Voeg een aangepaste vermelding toe aan de configuratie van de kernsite voor het cluster. U kunt de vermelding toevoegen tijdens het maken van het cluster met behulp van PowerShell of na het maken van het cluster met behulp van Ambari.

Een cluster maken dat gebruikmaakt van de SAS

Vervang CLUSTERNAME, RESOURCEGROUP, DEFAULTSTORAGEACCOUNT, STORAGECONTAINER, STORAGEACCOUNTen TOKEN door de juiste waarden. Voer de PowerShell-opdrachten in:

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

Belangrijk

Wanneer u om de HTTP/s of SSH-gebruikersnaam en het wachtwoord wordt gevraagd, moet u een wachtwoord opgeven dat voldoet aan de volgende criteria:

  • Moet ten minste 10 tekens lang zijn.
  • Moet ten minste één cijfer bevatten.
  • Moet ten minste één niet-alfanumeriek teken bevatten.
  • Moet ten minste één hoofdletter of kleine letter bevatten.

Het duurt even voordat dit script is voltooid, meestal ongeveer 15 minuten. Wanneer het script zonder fouten is voltooid, is het cluster gemaakt.

De SAS gebruiken met een bestaand cluster

Als u een bestaand cluster hebt, kunt u de SAS toevoegen aan de configuratie van de kernsite met behulp van de volgende stappen:

  1. Open de Ambari-webgebruikersinterface voor uw cluster. Het adres voor deze pagina is https://YOURCLUSTERNAME.azurehdinsight.net. Wanneer hierom wordt gevraagd, verifieert u zich bij het cluster met behulp van de beheerdersnaam (beheerder) en het wachtwoord dat u hebt gebruikt bij het maken van het cluster.

  2. Navigeer naar HDFS>Configs>Advanced>Custom core-site.

  3. Vouw de sectie Aangepaste kernsite uit, schuif naar het einde en selecteer vervolgens Eigenschap toevoegen.... Gebruik de volgende waarden voor Sleutel en Waarde:

    • Sleutel: fs.azure.sas.CONTAINERNAME.STORAGEACCOUNTNAME.blob.core.windows.net
    • Waarde: de SAS die is geretourneerd door een van de methoden die eerder zijn uitgevoerd.

    Vervang door CONTAINERNAME de containernaam die u hebt gebruikt voor de C#- of SAS-toepassing. Vervang door STORAGEACCOUNTNAME de naam van het opslagaccount dat u hebt gebruikt.

    Selecteer Toevoegen om deze sleutel en waarde op te slaan

  4. Selecteer de knop Opslaan om de configuratiewijzigingen op te slaan. Wanneer u hierom wordt gevraagd, voegt u een beschrijving van de wijziging toe (bijvoorbeeld sas-opslagtoegang toevoegen) en selecteert u opslaan.

    Selecteer OK wanneer de wijzigingen zijn voltooid.

    Belangrijk

    U moet verschillende services opnieuw starten voordat de wijziging van kracht wordt.

  5. Er wordt een vervolgkeuzelijst Opnieuw opstarten weergegeven. Selecteer Opnieuw opstarten in de vervolgkeuzelijst en vervolgens Alles opnieuw opstarten bevestigen.

    Herhaal dit proces voor MapReduce2 en YARN.

  6. Zodra de services opnieuw zijn opgestart, selecteert u elke service en schakelt u de onderhoudsmodus uit in de vervolgkeuzelijst Serviceacties .

Beperkte toegang testen

Gebruik de volgende stappen om te controleren of u alleen items in het SAS-opslagaccount kunt lezen en vermelden.

  1. Maak verbinding met het cluster. Vervang door CLUSTERNAME de naam van uw cluster en voer de volgende opdracht in:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. Gebruik de volgende opdracht vanaf de prompt om de inhoud van de container weer te geven:

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

    Vervang door SASCONTAINER de naam van de container die is gemaakt voor het SAS-opslagaccount. Vervang door SASACCOUNTNAME de naam van het opslagaccount dat wordt gebruikt voor de SAS.

    De lijst bevat het bestand dat is geüpload toen de container en SAS werden gemaakt.

  3. Gebruik de volgende opdracht om te controleren of u de inhoud van het bestand kunt lezen. Vervang de SASCONTAINER en SASACCOUNTNAME zoals in de vorige stap. Vervang door sample.log de naam van het bestand dat wordt weergegeven in de vorige opdracht:

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

    Met deze opdracht wordt de inhoud van het bestand weergegeven.

  4. Gebruik de volgende opdracht om het bestand te downloaden naar het lokale bestandssysteem:

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

    Met deze opdracht wordt het bestand gedownload naar een lokaal bestand met de naam testfile.txt.

  5. Gebruik de volgende opdracht om het lokale bestand te uploaden naar een nieuw bestand met de naam testupload.txt in de SAS-opslag:

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

    U ontvangt een bericht dat lijkt op de volgende tekst:

    put: java.io.IOException
    

    Deze fout treedt op omdat de opslaglocatie alleen read+list is. Gebruik de volgende opdracht om de gegevens in de standaardopslag voor het cluster te plaatsen, die beschrijfbaar is:

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

    Deze keer moet de bewerking zijn voltooid.

Volgende stappen

Nu u hebt geleerd hoe u opslag met beperkte toegang toevoegt aan uw HDInsight-cluster, leert u andere manieren om met gegevens in uw cluster te werken: