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 lub adl:// Azure Data Lake Storage Gen1. Jeśli bezpieczny transfer jest włączony dla usługi Azure Blob Storage, identyfikator URI to wasbs://.

  • 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:

  1. Osiągnięto czas wygaśnięcia określony dla sygnatury dostępu współdzielonego.

  2. 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.
  3. 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.

  4. 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 RESOURCEGROUPwartości , STORAGEACCOUNTi 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-AzStorageblobcontentelementu . 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.

  1. Zastąp STORAGEACCOUNTwartości , i STORAGECONTAINER 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
    
  2. 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
    
  3. Zmień katalog na hdinsight-dotnet-python-azure-storage-shared-access-signature-master lub popraw parametr , --file aby zawierał ścieżkę bezwzględną dla az storage blob uploadelementu . 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_namewartości , storage_account_keyi 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.storageo błędzie, może być konieczne wykonanie pip install --upgrade azure-storage polecenia .

Przy użyciu języka C#

  1. Otwórz rozwiązanie w programie Visual Studio.

  2. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt SASExample i wybierz pozycję Właściwości.

  3. 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órym myaccount jest nazwa konta magazynu i mykey 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.
  4. 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 CLUSTERNAMEwartości , , RESOURCEGROUPSTORAGECONTAINERDEFAULTSTORAGEACCOUNT, 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:

  1. 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.

  2. Przejdź do pozycji HDFSConfigs> AdvancedCustom Core-site (Konfiguracja systemu plików HDFS>— niestandardowa> lokacja podstawowa).

  3. 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ąp STORAGEACCOUNTNAME element nazwą użytego konta magazynu.

    Wybierz pozycję Dodaj , aby zapisać ten klucz i wartość

  4. 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.

  5. 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.

  6. 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.

  1. Połącz się z klastrem. Zastąp CLUSTERNAME ciąg nazwą klastra i wprowadź następujące polecenie:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. 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ąp SASACCOUNTNAME 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.

  3. Użyj następującego polecenia, aby sprawdzić, czy można odczytać zawartość pliku. Zastąp elementy SASCONTAINER i SASACCOUNTNAME tak jak w poprzednim kroku. Zastąp sample.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.

  4. 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.

  5. 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: