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 elleradl://
för Azure Data Lake Storage Gen1. Om säker överföring är aktiverat för Azure Blob Storage ärwasbs://
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:
Den förfallotid som anges i SAS har uppnåtts.
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.
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.
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
, STORAGEACCOUNT
och 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.
Ersätt
STORAGEACCOUNT
ochSTORAGECONTAINER
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
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
Ä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öraz 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_key
och 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#
Öppna lösningen i Visual Studio.
I Solution Explorer högerklickar du på SASExample-projektet och väljer Egenskaper.
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ärmyaccount
är namnet på ditt lagringskonto ochmykey
ä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. 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
, STORAGEACCOUNT
och 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:
Ö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.Gå till HDFS>Configs> AdvancedCustom core-site (Avancerad> anpassad kärnwebbplats).
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ättSTORAGEACCOUNTNAME
med namnet på lagringskontot som du använde.Välj Lägg till för att spara den här nyckeln och värdet
-
Nyckel:
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.
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.
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.
Anslut till klustret. Ersätt
CLUSTERNAME
med namnet på klustret och ange följande kommando:ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
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ättSASACCOUNTNAME
med namnet på lagringskontot som används för SAS.Listan innehåller filen som laddades upp när containern och SAS skapades.
Använd följande kommando för att kontrollera att du kan läsa innehållet i filen.
SASCONTAINER
Ersätt ochSASACCOUNTNAME
som i föregående steg. Ersättsample.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.
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.
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: