Použití sdílených přístupových podpisů služby Azure Blob Storage k omezení přístupu k datům ve službě HDInsight

HDInsight má úplný přístup k datům v účtech azure Blob Storage přidružených ke clusteru. Přístup k datům můžete omezit pomocí sdílených přístupových podpisů v kontejneru objektů blob. Sdílené přístupové podpisy (SAS) jsou funkcí účtů Azure Blob Storage, která umožňuje omezit přístup k datům. Například poskytnutí přístupu jen pro čtení k datům.

Důležité

V případě řešení využívajícího Apache Ranger zvažte použití hdInsightu připojeného k doméně. Další informace najdete v dokumentu Konfigurace HDInsightu připojeného k doméně .

Upozornění

HDInsight musí mít úplný přístup k výchozímu úložišti clusteru.

Požadavky

  • Klient SSH. Další informace najdete v tématu Připojení ke službě HDInsight (Apache Hadoop) pomocí SSH.

  • Existující kontejner úložiště.

  • Pokud používáte PowerShell, budete potřebovat modul Az.

  • Pokud chcete použít Azure CLI a ještě jste ho nenainstalovali, přečtěte si téma Instalace Azure CLI.

  • Pokud používáte Python verze 2.7 nebo vyšší.

  • Pokud používáte C#, visual Studio musí mít verzi 2013 nebo vyšší.

  • Schéma identifikátoru URI pro váš účet úložiště Toto schéma bude wasb:// pro Azure Blob Storage, abfs:// pro Azure Data Lake Storage Gen2 nebo adl:// pro Azure Data Lake Storage Gen1. Pokud je pro Azure Blob Storage povolený zabezpečený přenos, identifikátor URI bude wasbs://.

  • Existující cluster HDInsight, do který chcete přidat sdílený přístupový podpis. Pokud ne, můžete použít Azure PowerShell k vytvoření clusteru a přidání sdíleného přístupového podpisu během vytváření clusteru.

  • Ukázkové soubory z https://github.com/Azure-Samples/hdinsight-dotnet-python-azure-storage-shared-access-signature. Toto úložiště obsahuje následující položky:

    • Projekt sady Visual Studio, který může vytvořit kontejner úložiště, uložené zásady a SAS pro použití se službou HDInsight
    • Skript Pythonu, který může vytvořit kontejner úložiště, uložené zásady a SAS pro použití se službou HDInsight
    • Skript PowerShellu, který může vytvořit cluster HDInsight a nakonfigurovat ho tak, aby používal SAS. Aktualizovaná verze se používá níže.
    • Ukázkový soubor: hdinsight-dotnet-python-azure-storage-shared-access-signature-master\sampledata\sample.log

Sdílené přístupové podpisy

Existují dvě formy sdílených přístupových podpisů:

  • Ad hoc: Počáteční čas, čas vypršení platnosti a oprávnění sas jsou zadané v identifikátoru URI SAS.

  • Stored access policy: Uložené zásady přístupu jsou definované pro kontejner prostředků, jako je kontejner objektů blob. Zásady se dají použít ke správě omezení pro jeden nebo více sdílených přístupových podpisů. Když přidružíte SAS k uloženým zásadám přístupu, zdědí sas omezení – čas zahájení, čas vypršení platnosti a oprávnění – definovaná pro uložené zásady přístupu.

Rozdíl mezi těmito dvěma formuláři je důležitý pro jeden klíčový scénář: odvolání. SAS je adresa URL, takže ho může použít každý, kdo ho získá. Nezáleží na tom, kdo o to požádal. Pokud je sdílený přístupový podpis publikovaný veřejně, může ho používat kdokoli na světě. Distribuovaný sdílený přístupový podpis je platný, dokud se nestane jedna ze čtyř věcí:

  1. Dosáhne se doby vypršení platnosti zadané u SAS.

  2. Dosáhne se doby vypršení platnosti zadané u uložených zásad přístupu, na které odkazuje SAS. Následující scénáře způsobí dosažení doby vypršení platnosti:

    • Časový interval uplynul.
    • Uložené zásady přístupu se upraví tak, aby měly v minulosti čas vypršení platnosti. Změna doby vypršení platnosti je jedním ze způsobů, jak sdílený přístupový podpis odvolat.
  3. Uložené zásady přístupu, na které sas odkazuje, se odstraní, což je další způsob odvolání SAS. Pokud znovu vytvoříte uložené zásady přístupu se stejným názvem, budou všechny tokeny SAS pro předchozí zásadu platné (pokud u sas neuplynula doba vypršení platnosti). Pokud chcete sdílený přístupový podpis odvolat, nezapomeňte použít jiný název, pokud znovu vytvoříte zásadu přístupu s časem vypršení platnosti v budoucnu.

  4. Klíč účtu, který byl použit k vytvoření SAS, se vygeneruje. Opětovné vygenerování klíče způsobí selhání ověřování u všech aplikací, které používají předchozí klíč. Aktualizujte všechny komponenty na nový klíč.

Důležité

Identifikátor URI sdíleného přístupového podpisu je přidružený ke klíči účtu použitému k vytvoření podpisu a přidruženým uloženým zásadám přístupu (pokud existují). Pokud nejsou zadané žádné uložené zásady přístupu, jediným způsobem, jak odvolat sdílený přístupový podpis, je změnit klíč účtu.

Doporučujeme vždy používat uložené zásady přístupu. Při použití uložených zásad můžete podpisy odvolat nebo podle potřeby prodloužit datum vypršení platnosti. Kroky v tomto dokumentu používají k vygenerování SAS uložené zásady přístupu.

Další informace o sdílených přístupových podpisech najdete v tématu Principy modelu SAS.

Vytvoření uložené zásady a SAS

Uložte token SAS, který se vytvoří na konci každé metody. Token bude vypadat podobně jako následující výstup:

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

Pomocí prostředí PowerShell

Nahraďte RESOURCEGROUP, STORAGEACCOUNTa STORAGECONTAINER odpovídajícími hodnotami pro stávající kontejner úložiště. Změňte adresář na hdinsight-dotnet-python-azure-storage-shared-access-signature-master nebo upravte -File parametr tak, aby obsahoval absolutní cestu pro Set-AzStorageblobcontent. Zadejte následující příkaz PowerShellu:

$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

Použití Azure CLI

Použití proměnných v této části je založeno na prostředí Systému Windows. Pro Bash nebo jiná prostředí budou potřeba mírné odchylky.

  1. Nahraďte STORAGEACCOUNTa STORAGECONTAINER odpovídajícími hodnotami pro stávající kontejner úložiště.

    # 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. Nastavte načtený primární klíč na proměnnou pro pozdější použití. Nahraďte PRIMARYKEY hodnotou načtenou v předchozím kroku a pak zadejte následující příkaz:

    #set variable for primary key
    set AZURE_STORAGE_KEY=PRIMARYKEY
    
  3. Změňte adresář na hdinsight-dotnet-python-azure-storage-shared-access-signature-master nebo upravte --file parametr tak, aby obsahoval absolutní cestu pro az storage blob upload. Spusťte zbývající příkazy:

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

Pomocí Pythonu

SASToken.py Otevřete soubor, nahraďte storage_account_name, storage_account_keya storage_container_name příslušnými hodnotami pro stávající kontejner úložiště a spusťte skript.

Pokud se zobrazí chybová zprávaImportError: No module named azure.storage, může být nutné provést pip install --upgrade azure-storage příkaz .

Použití jazyka C#

  1. Otevřete řešení v sadě Visual Studio.

  2. V Průzkumník řešení klikněte pravým tlačítkem na projekt SASExample a vyberte Vlastnosti.

  3. Vyberte Nastavení a přidejte hodnoty pro následující položky:

    Položka Popis
    StorageConnectionString Připojovací řetězec pro účet úložiště, pro který chcete vytvořit uložené zásady a SAS. Formát by měl být DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=mykey , kde myaccount je název vašeho účtu úložiště, a mykey je to klíč pro účet úložiště.
    ContainerName Kontejner v účtu úložiště, ke kterému chcete omezit přístup.
    SASPolicyName Název, který se má použít k vytvoření uložené zásady.
    FileToUpload Cesta k souboru, který se nahraje do kontejneru.
  4. Spustit projekt. Uložte token zásad SAS, název účtu úložiště a název kontejneru. Tyto hodnoty se používají při přidružení účtu úložiště ke clusteru HDInsight.

Použití SAS se službou HDInsight

Při vytváření clusteru HDInsight musíte zadat primární účet úložiště. Můžete také zadat další účty úložiště. Obě tyto metody přidání úložiště vyžadují úplný přístup k účtům úložiště a kontejnerům, které se používají.

Pomocí sdíleného přístupového podpisu omezte přístup ke kontejneru. Přidejte vlastní položku do konfigurace core-site pro cluster. Položku můžete přidat během vytváření clusteru pomocí PowerShellu nebo po vytvoření clusteru pomocí Ambari.

Vytvoření clusteru, který používá SAS

Nahraďte CLUSTERNAME, RESOURCEGROUP, STORAGECONTAINERDEFAULTSTORAGEACCOUNT, STORAGEACCOUNTa TOKEN příslušnými hodnotami. Zadejte příkazy PowerShellu:

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

Důležité

Po zobrazení výzvy k zadání uživatelského jména a hesla HTTP/s nebo SSH musíte zadat heslo, které splňuje následující kritéria:

  • Musí obsahovat alespoň 10 znaků.
  • Musí obsahovat alespoň jednu číslici.
  • Musí obsahovat alespoň jeden jiný než alfanumerický znak.
  • Musí obsahovat aspoň jedno velké nebo malé písmeno.

Dokončení tohoto skriptu chvíli trvá, obvykle přibližně 15 minut. Po dokončení skriptu bez chyb se cluster vytvoří.

Použití SAS s existujícím clusterem

Pokud máte existující cluster, můžete ho přidat do konfigurace základní lokality pomocí následujících kroků:

  1. Otevřete webové uživatelské rozhraní Ambari pro váš cluster. Adresa této stránky je https://YOURCLUSTERNAME.azurehdinsight.net. Po zobrazení výzvy ověřte cluster pomocí jména správce (správce) a hesla, které jste použili při vytváření clusteru.

  2. Přejděte na hdfs>configs>Advanced>Custom Core-site.

  3. Rozbalte část Vlastní základní web , posuňte se na konec a pak vyberte Přidat vlastnost.... Pro klíč a hodnotu použijte následující hodnoty:

    • Klíč: fs.azure.sas.CONTAINERNAME.STORAGEACCOUNTNAME.blob.core.windows.net
    • Hodnota: Sas vrácený některou z dříve spuštěných metod.

    Nahraďte CONTAINERNAME názvem kontejneru, který jste použili s aplikací C# nebo SAS. Nahraďte STORAGEACCOUNTNAME názvem účtu úložiště, který jste použili.

    Vyberte Přidat a uložte tento klíč a hodnotu.

  4. Výběrem tlačítka Uložit uložte změny konfigurace. Po zobrazení výzvy přidejte popis změny (například přidání přístupu k úložišti SAS) a pak vyberte Uložit.

    Po dokončení změn vyberte OK .

    Důležité

    Než se změna projeví, musíte restartovat několik služeb.

  5. Zobrazí se rozevírací seznam Restartovat . V rozevíracím seznamu vyberte Restartovat vše ovlivněné a pak Potvrďte restartovat vše.

    Tento postup opakujte pro MapReduce2 a YARN.

  6. Jakmile se služby restartují, vyberte každou z nich a v rozevíracím seznamu Akce služby zakažte režim údržby.

Test omezeného přístupu

Pomocí následujícího postupu ověřte, že v účtu úložiště SAS můžete jenom číst a vypisovat položky.

  1. Připojte se ke clusteru. Nahraďte CLUSTERNAME názvem clusteru a zadejte následující příkaz:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. Pokud chcete zobrazit seznam obsahu kontejneru, použijte následující příkaz z příkazového řádku:

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

    Nahraďte SASCONTAINER názvem kontejneru vytvořeného pro účet úložiště SAS. Nahraďte SASACCOUNTNAME názvem účtu úložiště, který se používá pro SAS.

    Seznam obsahuje soubor nahraný při vytvoření kontejneru a SAS.

  3. Pomocí následujícího příkazu ověřte, že můžete číst obsah souboru. SASCONTAINER Nahraďte a SASACCOUNTNAME jako v předchozím kroku. Nahraďte sample.log názvem souboru zobrazeným v předchozím příkazu:

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

    Tento příkaz vypíše obsah souboru.

  4. Pomocí následujícího příkazu stáhněte soubor do místního systému souborů:

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

    Tento příkaz stáhne soubor do místního souboru s názvemtestfile.txt.

  5. Pomocí následujícího příkazu nahrajte místní soubor do nového souboru s názvemtestupload.txt v úložišti SAS:

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

    Zobrazí se zpráva podobná následujícímu textu:

    put: java.io.IOException
    

    K této chybě dochází, protože umístění úložiště je jen pro čtení a seznam. Pomocí následujícího příkazu umístěte data do výchozího úložiště clusteru, které je zapisovatelné:

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

    Tentokrát by se operace měla úspěšně dokončit.

Další kroky

Teď, když jste se dozvěděli, jak do clusteru HDInsight přidat úložiště s omezeným přístupem, se dozvíte další způsoby práce s daty v clusteru: