Używanie sygnatur dostępu współdzielonego usługi Azure Blob Storage w celu ograniczenia dostępu do danych w usłudze HDInsight
Usługa HDInsight ma pełny dostęp do danych na kontach usługi Azure Blob Storage skojarzonych z klastrem. Możesz użyć sygnatur dostępu współdzielonego w kontenerze obiektów blob, aby ograniczyć dostęp do danych. Sygnatury dostępu współdzielonego to funkcja kont usługi Azure Blob Storage, która umożliwia ograniczenie dostępu do danych. Na przykład zapewnienie dostępu tylko do odczytu do danych.
Ważne
W przypadku rozwiązania korzystającego z platformy Apache Ranger rozważ użycie usługi HDInsight przyłączonej do domeny. Aby uzyskać więcej informacji, zobacz dokument Configure domain-joined HDInsight (Konfigurowanie przyłączonego do domeny usługi HDInsight ).
Ostrzeżenie
Usługa HDInsight musi mieć pełny dostęp do domyślnego magazynu klastra.
Wymagania wstępne
Klient SSH. Aby uzyskać więcej informacji, zobacz Łączenie się z usługą HDInsight (Apache Hadoop) przy użyciu protokołu SSH.
Istniejący kontener magazynu.
Jeśli używasz programu PowerShell, potrzebujesz modułu Az.
Jeśli chcesz używać interfejsu wiersza polecenia platformy Azure i jeszcze go nie zainstalowano, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.
W przypadku korzystania z języka Python w wersji 2.7 lub nowszej.
Jeśli używasz języka C#, program Visual Studio musi być w wersji 2013 lub nowszej.
Schemat identyfikatora URI dla konta magazynu. Ten schemat dotyczy
wasb://
usługi Azure Blob Storage,abfs://
Azure Data Lake Storage Gen2 lubadl://
Azure Data Lake Storage Gen1. Jeśli bezpieczny transfer jest włączony dla usługi Azure Blob Storage, identyfikator URI towasbs://
.Istniejący klaster usługi HDInsight do dodawania sygnatury dostępu współdzielonego. Jeśli nie, możesz użyć Azure PowerShell do utworzenia klastra i dodania sygnatury dostępu współdzielonego podczas tworzenia klastra.
Przykładowe pliki z pliku https://github.com/Azure-Samples/hdinsight-dotnet-python-azure-storage-shared-access-signature. To repozytorium zawiera następujące elementy:
- Projekt programu Visual Studio, który może utworzyć kontener magazynu, przechowywane zasady i sygnaturę dostępu współdzielonego do użycia z usługą HDInsight
- Skrypt języka Python, który może utworzyć kontener magazynu, przechowywane zasady i sygnaturę dostępu współdzielonego do użycia z usługą HDInsight
- Skrypt programu PowerShell, który może utworzyć klaster usługi HDInsight i skonfigurować go do używania sygnatury dostępu współdzielonego. Zaktualizowana wersja jest używana poniżej.
- Przykładowy plik:
hdinsight-dotnet-python-azure-storage-shared-access-signature-master\sampledata\sample.log
Sygnatury dostępu współdzielonego
Istnieją dwie formy sygnatur dostępu współdzielonego:
Ad hoc
: Czas rozpoczęcia, czas wygaśnięcia i uprawnienia dla sygnatury dostępu współdzielonego są określone w identyfikatorze URI sygnatury dostępu współdzielonego.Stored access policy
: Przechowywane zasady dostępu są definiowane w kontenerze zasobów, takim jak kontener obiektów blob. Zasady mogą służyć do zarządzania ograniczeniami dla co najmniej jednego sygnatury dostępu współdzielonego. Po skojarzeniu sygnatury dostępu współdzielonego z zapisanymi zasadami dostępu sygnatura dostępu współdzielonego dziedziczy ograniczenia — czas rozpoczęcia, czas wygaśnięcia i uprawnienia — zdefiniowane dla przechowywanych zasad dostępu.
Różnica między dwoma formularzami jest ważna dla jednego kluczowego scenariusza: odwoływanie. Sygnatura dostępu współdzielonego jest adresem URL, więc każdy, kto uzyskuje sygnaturę dostępu współdzielonego, może go używać. To nie ma znaczenia, kto zażądał go na początek. Jeśli sygnatura dostępu współdzielonego jest publikowana publicznie, może być używana przez każdą osobę na świecie. Rozproszona sygnatura dostępu współdzielonego jest prawidłowa do momentu wystąpienia jednej z czterech rzeczy:
Osiągnięto czas wygaśnięcia określony dla sygnatury dostępu współdzielonego.
Osiągnięto czas wygaśnięcia określony w przechowywanych zasadach dostępu, do których odwołuje się sygnatura dostępu współdzielonego. Następujące scenariusze powodują osiągnięcie czasu wygaśnięcia:
- Interwał czasu upłynął.
- Zapisane zasady dostępu są modyfikowane w celu upływu czasu wygaśnięcia w przeszłości. Zmiana czasu wygaśnięcia jest jednym ze sposobów odwołania sygnatury dostępu współdzielonego.
Przechowywane zasady dostępu, do których odwołuje się sygnatura dostępu współdzielonego, są usuwane, co jest innym sposobem odwołania sygnatury dostępu współdzielonego. Jeśli ponownie utworzysz przechowywane zasady dostępu o tej samej nazwie, wszystkie tokeny SAS dla poprzednich zasad są prawidłowe (jeśli czas wygaśnięcia sygnatury dostępu współdzielonego nie został przekazany). Jeśli zamierzasz odwołać sygnaturę dostępu współdzielonego, pamiętaj, aby użyć innej nazwy, jeśli ponownie utworzysz zasady dostępu z upływem czasu wygaśnięcia w przyszłości.
Klucz konta, który został użyty do utworzenia sygnatury dostępu współdzielonego, jest ponownie wygenerowany. Ponowne generowanie klucza powoduje, że wszystkie aplikacje, które używają poprzedniego klucza do niepowodzenia uwierzytelniania. Zaktualizuj wszystkie składniki do nowego klucza.
Ważne
Identyfikator URI sygnatury dostępu współdzielonego jest skojarzony z kluczem konta używanym do tworzenia podpisu oraz skojarzonymi zapisanymi zasadami dostępu (jeśli istnieją). Jeśli nie określono żadnych przechowywanych zasad dostępu, jedynym sposobem odwołania sygnatury dostępu współdzielonego jest zmiana klucza konta.
Zalecamy, aby zawsze używać przechowywanych zasad dostępu. W przypadku korzystania z przechowywanych zasad można odwołać podpisy lub przedłużyć datę wygaśnięcia zgodnie z potrzebami. Kroki opisane w tym dokumencie używają zapisanych zasad dostępu do generowania sygnatury dostępu współdzielonego.
Aby uzyskać więcej informacji na temat sygnatur dostępu współdzielonego, zobacz Opis modelu sygnatur dostępu współdzielonego.
Tworzenie przechowywanych zasad i sygnatur dostępu współdzielonego
Zapisz token SAS, który jest generowany na końcu każdej metody. Token będzie wyglądać podobnie do następujących danych wyjściowych:
?sv=2018-03-28&sr=c&si=myPolicyPS&sig=NAxefF%2BrR2ubjZtyUtuAvLQgt%2FJIN5aHJMj6OsDwyy4%3D
Korzystanie z programu PowerShell
Zastąp RESOURCEGROUP
wartości , STORAGEACCOUNT
i STORAGECONTAINER
odpowiednimi wartościami dla istniejącego kontenera magazynu. Zmień katalog na hdinsight-dotnet-python-azure-storage-shared-access-signature-master
lub popraw parametr , -File
aby zawierał ścieżkę bezwzględną dla Set-AzStorageblobcontent
elementu . Wprowadź następujące polecenie programu 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
Korzystanie z interfejsu wiersza polecenia platformy Azure
Użycie zmiennych w tej sekcji jest oparte na środowisku systemu Windows. Niewielkie odmiany będą potrzebne w przypadku powłoki bash lub innych środowisk.
Zastąp
STORAGEACCOUNT
wartości , iSTORAGECONTAINER
odpowiednimi wartościami dla istniejącego kontenera magazynu.# 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
Ustaw pobrany klucz podstawowy na zmienną do późniejszego użycia. Zastąp
PRIMARYKEY
element wartością pobraną w poprzednim kroku, a następnie wprowadź poniższe polecenie:#set variable for primary key set AZURE_STORAGE_KEY=PRIMARYKEY
Zmień katalog na
hdinsight-dotnet-python-azure-storage-shared-access-signature-master
lub popraw parametr ,--file
aby zawierał ścieżkę bezwzględną dlaaz storage blob upload
elementu . Wykonaj pozostałe polecenia:# 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"
Korzystanie z języka Python
SASToken.py
Otwórz plik i zastąp storage_account_name
wartości , storage_account_key
i storage_container_name
odpowiednimi wartościami dla istniejącego kontenera magazynu, a następnie uruchom skrypt.
Jeśli zostanie wyświetlony komunikat ImportError: No module named azure.storage
o błędzie, może być konieczne wykonanie pip install --upgrade azure-storage
polecenia .
Przy użyciu języka C#
Otwórz rozwiązanie w programie Visual Studio.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt SASExample i wybierz pozycję Właściwości.
Wybierz pozycję Ustawienia i dodaj wartości dla następujących wpisów:
Element Opis StorageConnectionString Parametry połączenia dla konta magazynu, dla którego chcesz utworzyć przechowywane zasady i sygnaturę dostępu współdzielonego. Format powinien być DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=mykey
miejscem, w którymmyaccount
jest nazwa konta magazynu imykey
jest kluczem dla konta magazynu.NazwaKontenera Kontener na koncie magazynu, do którego chcesz ograniczyć dostęp. SASPolicyName Nazwa używana dla przechowywanych zasad do utworzenia. FileToUpload Ścieżka do pliku przekazanego do kontenera. Uruchamianie projektu. Zapisz token zasad sygnatury dostępu współdzielonego, nazwę konta magazynu i nazwę kontenera. Te wartości są używane podczas kojarzenia konta magazynu z klastrem usługi HDInsight.
Używanie sygnatury dostępu współdzielonego z usługą HDInsight
Podczas tworzenia klastra usługi HDInsight należy określić podstawowe konto magazynu. Można również określić dodatkowe konta magazynu. Obie te metody dodawania magazynu wymagają pełnego dostępu do używanych kont magazynu i kontenerów.
Użyj sygnatury dostępu współdzielonego, aby ograniczyć dostęp do kontenera. Dodaj wpis niestandardowy do konfiguracji podstawowej lokacji klastra. Wpis można dodać podczas tworzenia klastra przy użyciu programu PowerShell lub po utworzeniu klastra przy użyciu narzędzia Ambari.
Tworzenie klastra korzystającego z sygnatury dostępu współdzielonego
Zastąp CLUSTERNAME
wartości , , RESOURCEGROUP
STORAGECONTAINER
DEFAULTSTORAGEACCOUNT
, STORAGEACCOUNT
, i TOKEN
odpowiednimi wartościami. Wprowadź polecenia programu 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
#>
Ważne
Po wyświetleniu monitu o podanie nazwy i hasła użytkownika HTTP/s lub SSH należy podać hasło spełniające następujące kryteria:
- Musi mieć długość co najmniej 10 znaków.
- Musi zawierać co najmniej jedną cyfrę.
- Musi zawierać co najmniej jeden znak inny niż alfanumeryczny.
- Musi zawierać co najmniej jedną wyższą lub małą literę.
Ukończenie tego skryptu trwa około 15 minut. Po zakończeniu działania skryptu bez żadnych błędów klaster został utworzony.
Używanie sygnatury dostępu współdzielonego z istniejącym klastrem
Jeśli masz istniejący klaster, możesz dodać sygnaturę dostępu współdzielonego do konfiguracji podstawowej lokacji , wykonując następujące czynności:
Otwórz internetowy interfejs użytkownika systemu Ambari dla klastra. Adres tej strony to
https://YOURCLUSTERNAME.azurehdinsight.net
. Po wyświetleniu monitu uwierzytelnij się w klastrze przy użyciu nazwy administratora (administratora) i hasła użytego podczas tworzenia klastra.Przejdź do pozycji HDFSConfigs> AdvancedCustom Core-site (Konfiguracja systemu plików HDFS>— niestandardowa> lokacja podstawowa).
Rozwiń sekcję Niestandardowa podstawowa lokacja , przewiń do końca, a następnie wybierz pozycję Dodaj właściwość.... Użyj następujących wartości w polach Klucz i Wartość:
-
Klucz:
fs.azure.sas.CONTAINERNAME.STORAGEACCOUNTNAME.blob.core.windows.net
- Wartość: sygnatura dostępu współdzielonego zwrócona przez jedną z wcześniej wykonanych metod.
Zastąp
CONTAINERNAME
ciąg nazwą kontenera użytą w języku C# lub aplikacji SAS. ZastąpSTORAGEACCOUNTNAME
element nazwą użytego konta magazynu.Wybierz pozycję Dodaj , aby zapisać ten klucz i wartość
-
Klucz:
Wybierz przycisk Zapisz , aby zapisać zmiany konfiguracji. Po wyświetleniu monitu dodaj opis zmiany ("na przykład dodanie dostępu do magazynu SAS), a następnie wybierz pozycję Zapisz.
Wybierz przycisk OK po zakończeniu zmian.
Ważne
Aby zmiana weszła w życie, należy ponownie uruchomić kilka usług.
Zostanie wyświetlona lista rozwijana Ponowne uruchamianie . Z listy rozwijanej wybierz pozycję Uruchom ponownie wszystkie, których dotyczy problem , a następnie potwierdź ponowne uruchomienie wszystkich.
Powtórz ten proces dla technologii MapReduce2 i YARN.
Po ponownym uruchomieniu usług wybierz każdy z nich i wyłącz tryb konserwacji z listy rozwijanej Akcje usługi .
Testowanie ograniczonego dostępu
Wykonaj poniższe kroki, aby sprawdzić, czy można odczytywać tylko elementy i wyświetlać je na koncie magazynu SAS.
Połącz się z klastrem. Zastąp
CLUSTERNAME
ciąg nazwą klastra i wprowadź następujące polecenie:ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
Aby wyświetlić listę zawartości kontenera, użyj następującego polecenia w wierszu polecenia:
hdfs dfs -ls wasbs://SASCONTAINER@SASACCOUNTNAME.blob.core.windows.net/
Zastąp
SASCONTAINER
ciąg nazwą kontenera utworzonego dla konta magazynu SAS. ZastąpSASACCOUNTNAME
ciąg nazwą konta magazynu używanego dla sygnatury dostępu współdzielonego.Lista zawiera plik przekazany podczas tworzenia kontenera i sygnatury dostępu współdzielonego.
Użyj następującego polecenia, aby sprawdzić, czy można odczytać zawartość pliku. Zastąp elementy
SASCONTAINER
iSASACCOUNTNAME
tak jak w poprzednim kroku. Zastąpsample.log
ciąg nazwą pliku wyświetlaną w poprzednim poleceniu:hdfs dfs -text wasbs://SASCONTAINER@SASACCOUNTNAME.blob.core.windows.net/sample.log
To polecenie wyświetla zawartość pliku.
Użyj następującego polecenia, aby pobrać plik do lokalnego systemu plików:
hdfs dfs -get wasbs://SASCONTAINER@SASACCOUNTNAME.blob.core.windows.net/sample.log testfile.txt
To polecenie pobiera plik do pliku lokalnego o nazwie testfile.txt.
Użyj następującego polecenia, aby przekazać plik lokalny do nowego pliku o nazwie testupload.txt w magazynie SAS:
hdfs dfs -put testfile.txt wasbs://SASCONTAINER@SASACCOUNTNAME.blob.core.windows.net/testupload.txt
Zostanie wyświetlony komunikat podobny do następującego tekstu:
put: java.io.IOException
Ten błąd występuje, ponieważ lokalizacja magazynu jest tylko do odczytu i listy. Użyj następującego polecenia, aby umieścić dane w domyślnym magazynie klastra, który można zapisywać:
hdfs dfs -put testfile.txt wasbs:///testupload.txt
Tym razem operacja powinna zakończyć się pomyślnie.
Następne kroki
Teraz, gdy wiesz już, jak dodać magazyn o ograniczonym dostępie do klastra usługi HDInsight, dowiedz się więcej o innych sposobach pracy z danymi w klastrze: