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 ofadl://
voor Azure Data Lake Storage Gen1. Als beveiligde overdracht is ingeschakeld voor Azure Blob Storage, iswasbs://
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:
De verlooptijd die op de SAS is opgegeven, is bereikt.
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.
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.
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
, STORAGEACCOUNT
en 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-AzStorageblobcontent
bevat. 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.
Vervang
STORAGEACCOUNT
, enSTORAGECONTAINER
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
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
Wijzig de map in
hdinsight-dotnet-python-azure-storage-shared-access-signature-master
of wijzig de--file
parameter zodat deze het absolute pad vooraz storage blob upload
bevat. 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_key
en 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.storage
ontvangt.
C# gebruiken
Open de oplossing in Visual Studio.
Klik in Solution Explorer met de rechtermuisknop op het project SASExample en selecteer Eigenschappen.
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=mykey
myaccount
enmykey
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. 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
, STORAGEACCOUNT
en 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:
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.Navigeer naar HDFS>Configs>Advanced>Custom core-site.
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 doorSTORAGEACCOUNTNAME
de naam van het opslagaccount dat u hebt gebruikt.Selecteer Toevoegen om deze sleutel en waarde op te slaan
-
Sleutel:
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.
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.
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.
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
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 doorSASACCOUNTNAME
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.
Gebruik de volgende opdracht om te controleren of u de inhoud van het bestand kunt lezen. Vervang de
SASCONTAINER
enSASACCOUNTNAME
zoals in de vorige stap. Vervang doorsample.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.
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.
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: