HDInsight'ta verilere erişimi kısıtlamak için Azure Blob depolama Paylaşılan Erişim İmzalarını kullanma

HDInsight, kümeyle ilişkili Azure Blob depolama hesaplarındaki verilere tam erişime sahiptir. Verilere erişimi kısıtlamak için blob kapsayıcısı üzerinde Paylaşılan Erişim İmzaları'nı kullanabilirsiniz. Paylaşılan Erişim İmzaları (SAS), Azure Blob depolama hesaplarının verilere erişimi sınırlamanıza olanak tanıyan bir özelliğidir. Örneğin, verilere salt okunur erişim sağlama.

Önemli

Apache Ranger kullanan bir çözüm için etki alanına katılmış HDInsight kullanmayı göz önünde bulundurun. Daha fazla bilgi için Etki alanına katılmış HDInsight'ı yapılandırma belgesine bakın.

Uyarı

HDInsight, küme için varsayılan depolama alanına tam erişime sahip olmalıdır.

Önkoşullar

  • Bir SSH istemcisi. Daha fazla bilgi için bkz. SSH kullanarak HDInsight'a (Apache Hadoop) bağlanma.

  • Mevcut bir depolama kapsayıcısı.

  • PowerShell kullanıyorsanız Az Modülü gerekir.

  • Azure CLI'yı kullanmak istiyorsanız ve henüz yüklemediyseniz bkz. Azure CLI'yi yükleme.

  • Python kullanıyorsanız, sürüm 2.7 veya üzeri.

  • C# kullanıyorsanız Visual Studio sürüm 2013 veya üzeri olmalıdır.

  • Depolama hesabınızın URI şeması. Bu şema Azure Blob depolama, abfs:// Azure Data Lake Storage 2. Nesil veya adl:// Azure Data Lake Storage 1. Nesil için olabilirwasb://. Azure Blob depolama için güvenli aktarım etkinleştirildiyse, URI olacaktır wasbs://.

  • Paylaşılan Erişim İmzası'nın ekleneceği mevcut bir HDInsight kümesi. Aksi takdirde, Azure PowerShell kullanarak küme oluşturabilir ve küme oluşturma sırasında Paylaşılan Erişim İmzası ekleyebilirsiniz.

  • 'den https://github.com/Azure-Samples/hdinsight-dotnet-python-azure-storage-shared-access-signatureörnek dosyalar. Bu depo aşağıdaki öğeleri içerir:

    • HDInsight ile kullanmak üzere depolama kapsayıcısı, depolanmış ilke ve SAS oluşturabilen bir Visual Studio projesi
    • HDInsight ile kullanmak üzere depolama kapsayıcısı, depolanmış ilke ve SAS oluşturabilen python betiği
    • HDInsight kümesi oluşturabilen ve SAS kullanacak şekilde yapılandırabilen bir PowerShell betiği. Aşağıda daha ayrıntılı olarak güncelleştirilmiş bir sürüm kullanılmıştır.
    • Örnek dosya: hdinsight-dotnet-python-azure-storage-shared-access-signature-master\sampledata\sample.log

Paylaşılan Erişim İmzaları

Paylaşılan Erişim İmzaları'nın iki biçimi vardır:

  • Ad hoc: SAS için başlangıç saati, süre sonu süresi ve izinlerin tümü SAS URI'sinde belirtilir.

  • Stored access policy: Depolanmış erişim ilkesi, blob kapsayıcısı gibi bir kaynak kapsayıcısı üzerinde tanımlanır. İlke, bir veya daha fazla paylaşılan erişim imzasının kısıtlamalarını yönetmek için kullanılabilir. Bir SAS'yi depolanmış erişim ilkesiyle ilişkilendirdiğinizde, SAS saklı erişim ilkesi için tanımlanan kısıtlamaları (başlangıç saati, süre sonu ve izinler) devralır.

İki form arasındaki fark, tek bir önemli senaryo için önemlidir: iptal. SAS bir URL olduğundan SAS'yi alan herkes bunu kullanabilir. İlk olarak kimin istediği önemli değil. Sas genel olarak yayımlanırsa, dünyadaki herkes tarafından kullanılabilir. Dağıtılan SAS, dört şeyden biri gerçekleşene kadar geçerlidir:

  1. SAS'de belirtilen süre sonu süresine ulaşılır.

  2. SAS tarafından başvurulan saklı erişim ilkesinde belirtilen süre sonu süresine ulaşılır. Aşağıdaki senaryolar süre sonu süresinin dolmasına neden olur:

    • Zaman aralığı doldu.
    • Depolanmış erişim ilkesi, geçmişte bir süre sonu süresine sahip olacak şekilde değiştirildi. Süre sonu süresini değiştirmek SAS'yi iptal etmenin bir yoludur.
  3. SAS tarafından başvurulan depolanmış erişim ilkesi silinir, bu da SAS'yi iptal etmenin başka bir yoludur. Depolanan erişim ilkesini aynı adla yeniden oluşturmanız durumunda, önceki ilkenin tüm SAS belirteçleri geçerlidir (SAS üzerindeki süre sonu süresi geçirilmemişse). SAS'yi iptal etmek istiyorsanız, gelecekte bir süre sonu ile erişim ilkesini yeniden oluşturursanız farklı bir ad kullandığınızdan emin olun.

  4. SAS'yi oluşturmak için kullanılan hesap anahtarı yeniden oluşturulur. Anahtarın yeniden yenilenmesi, kimlik doğrulamasının başarısız olması için önceki anahtarı kullanan tüm uygulamalara neden olur. Tüm bileşenleri yeni anahtara güncelleştirin.

Önemli

Paylaşılan erişim imzası URI'si, imzayı oluşturmak için kullanılan hesap anahtarıyla ve ilişkili depolanmış erişim ilkesiyle (varsa) ilişkilendirilir. Depolanmış erişim ilkesi belirtilmezse, paylaşılan erişim imzasını iptal etmenin tek yolu hesap anahtarını değiştirmektir.

Depolanmış erişim ilkelerini her zaman kullanmanızı öneririz. Depolanan ilkeleri kullanırken, imzaları iptal edebilir veya süre sonu tarihini gerektiği gibi uzatabilirsiniz. Bu belgedeki adımlarda SAS oluşturmak için depolanmış erişim ilkeleri kullanılır.

Paylaşılan Erişim İmzaları hakkında daha fazla bilgi için bkz. SAS modelini anlama.

Depolanan ilke ve SAS oluşturma

Her yöntemin sonunda üretilen SAS belirtecini kaydedin. Belirteç aşağıdaki çıkışa benzer olacaktır:

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

PowerShell’i kullanma

, STORAGEACCOUNTve STORAGECONTAINER değerlerini mevcut depolama kapsayıcınız için uygun değerlerle değiştirinRESOURCEGROUP. dizinini olarak hdinsight-dotnet-python-azure-storage-shared-access-signature-master değiştirin veya parametresini -File için Set-AzStorageblobcontentmutlak yolu içerecek şekilde düzeltin. Aşağıdaki PowerShell komutunu girin:

$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’yı kullanma

Bu bölümdeki değişkenlerin kullanımı bir Windows ortamını temel alır. Bash veya diğer ortamlar için hafif çeşitlemeler gerekecektir.

  1. ve STORAGECONTAINER değerlerini mevcut depolama kapsayıcınız için uygun değerlerle değiştirinSTORAGEACCOUNT.

    # 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. Alınan birincil anahtarı daha sonra kullanmak üzere bir değişken olarak ayarlayın. değerini önceki adımda alınan değerle değiştirin PRIMARYKEY ve aşağıdaki komutu girin:

    #set variable for primary key
    set AZURE_STORAGE_KEY=PRIMARYKEY
    
  3. dizinini olarak hdinsight-dotnet-python-azure-storage-shared-access-signature-master değiştirin veya parametresini --file için az storage blob uploadmutlak yolu içerecek şekilde düzeltin. Kalan komutları yürüt:

    # 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’u kullanma

SASToken.py dosyasını açın, , storage_account_keyve storage_container_name değerlerini mevcut depolama kapsayıcınız için uygun değerlerle değiştirin storage_account_nameve betiği çalıştırın.

hata iletisini ImportError: No module named azure.storagealırsanız yürütmeniz pip install --upgrade azure-storage gerekebilir.

C# kullanma

  1. Çözümü Visual Studio'da açın.

  2. Çözüm Gezgini sasexample projesine sağ tıklayın ve Özellikler'i seçin.

  3. Ayarlar'ı seçin ve aşağıdaki girişler için değer ekleyin:

    Öğe Açıklama
    StorageConnectionString Depolanmış ilke ve SAS oluşturmak istediğiniz depolama hesabının bağlantı dizesi. Biçim DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=mykey , myaccount depolama hesabınızın adı ve mykey depolama hesabının anahtarı olmalıdır.
    ContainerName Erişimi kısıtlamak istediğiniz depolama hesabındaki kapsayıcı.
    SASPolicyName Depolanmış ilkenin oluşturması için kullanılacak ad.
    FileToUpload Kapsayıcıya yüklenen dosyanın yolu.
  4. Projeyi çalıştırma. SAS ilke belirtecini, depolama hesabı adını ve kapsayıcı adını kaydedin. Bu değerler, depolama hesabı HDInsight kümenizle ilişkilendirilirken kullanılır.

HDInsight ile SAS kullanma

HDInsight kümesi oluştururken birincil depolama hesabı belirtmeniz gerekir. Ek depolama hesapları da belirtebilirsiniz. Bu depolama ekleme yöntemlerinin her ikisi de kullanılan depolama hesaplarına ve kapsayıcılara tam erişim gerektirir.

Kapsayıcı erişimini sınırlamak için Paylaşılan Erişim İmzası kullanın. Kümenin çekirdek site yapılandırmasına özel bir giriş ekleyin. Girdiyi PowerShell kullanarak küme oluşturma sırasında veya Ambari kullanarak küme oluşturulduktan sonra ekleyebilirsiniz.

SAS kullanan bir küme oluşturma

, , RESOURCEGROUP, DEFAULTSTORAGEACCOUNT, STORAGECONTAINER, STORAGEACCOUNTve TOKEN değerlerini uygun değerlerle değiştirinCLUSTERNAME. PowerShell komutlarını girin:

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

Önemli

HTTP/sn veya SSH kullanıcı adı ve parolası istendiğinde, aşağıdaki ölçütleri karşılayan bir parola sağlamanız gerekir:

  • En az 10 karakter uzunluğunda olmalıdır.
  • En az bir basamak içermelidir.
  • En az bir alfasayısal olmayan karakter içermelidir.
  • En az bir büyük veya küçük harf içermelidir.

Bu betiğin tamamlanması genellikle yaklaşık 15 dakika sürer. Betik hatasız tamamlandığında küme oluşturulur.

SAS'yi mevcut bir kümeyle kullanma

Mevcut bir kümeniz varsa, aşağıdaki adımları kullanarak SAS'yi çekirdek site yapılandırmasına ekleyebilirsiniz:

  1. Kümeniz için Ambari web kullanıcı arabirimini açın. Bu sayfanın adresi şeklindedir https://YOURCLUSTERNAME.azurehdinsight.net. İstendiğinde, kümeyi oluştururken kullandığınız yönetici adını (yönetici) ve parolayı kullanarak kümenin kimliğini doğrulayın.

  2. HDFS>Yapılandırmaları>Gelişmiş>Özel çekirdek-sitesi'ne gidin.

  3. Özel çekirdek-site bölümünü genişletin, sonuna kaydırın ve ardından Özellik ekle...'yi seçin. Anahtar ve Değer için aşağıdaki değerleri kullanın:

    • Anahtar: fs.azure.sas.CONTAINERNAME.STORAGEACCOUNTNAME.blob.core.windows.net
    • Değer: Daha önce yürütülen yöntemlerden biri tarafından döndürülen SAS.

    değerini C# veya SAS uygulamasıyla kullandığınız kapsayıcı adıyla değiştirin CONTAINERNAME . değerini kullandığınız depolama hesabı adıyla değiştirin STORAGEACCOUNTNAME .

    Bu anahtarı ve değeri kaydetmek için Ekle'yi seçin

  4. Yapılandırma değişikliklerini kaydetmek için Kaydet düğmesini seçin. İstendiğinde, değişikliğin açıklamasını ekleyin ("örneğin SAS depolama erişimi ekleme") ve kaydet'i seçin.

    Değişiklikler tamamlandığında Tamam'ı seçin.

    Önemli

    Değişiklik yürürlüğe girmeden önce birkaç hizmeti yeniden başlatmanız gerekir.

  5. Yeniden başlat açılan listesi görüntülenir. Açılan listeden EtkilenenLerin Tümünü Yeniden Başlat'ı ve ardından Tümünü Yeniden Başlat'ı Onayla'yı seçin.

    MapReduce2 ve YARN için bu işlemi yineleyin.

  6. Hizmetler yeniden başlatıldıktan sonra her birini seçin ve Hizmet Eylemleri açılan listesinden bakım modunu devre dışı bırakın.

Kısıtlı erişimi test edin

SAS depolama hesabındaki öğeleri yalnızca okuyup listeleyebileceğinizi doğrulamak için aşağıdaki adımları kullanın.

  1. Kümeye bağlanın. değerini kümenizin adıyla değiştirin CLUSTERNAME ve aşağıdaki komutu girin:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. Kapsayıcının içeriğini listelemek için isteminden aşağıdaki komutu kullanın:

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

    değerini SAS depolama hesabı için oluşturulan kapsayıcının adıyla değiştirin SASCONTAINER . değerini SAS için kullanılan depolama hesabının adıyla değiştirin SASACCOUNTNAME .

    Liste, kapsayıcı ve SAS oluşturulduğunda karşıya yüklenen dosyayı içerir.

  3. Dosyanın içeriğini okuyabildiğinizi doğrulamak için aşağıdaki komutu kullanın. ve değerini SASCONTAINERSASACCOUNTNAME önceki adımda olduğu gibi değiştirin. değerini önceki komutta görüntülenen dosyanın adıyla değiştirin sample.log :

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

    Bu komut dosyanın içeriğini listeler.

  4. Dosyayı yerel dosya sistemine indirmek için aşağıdaki komutu kullanın:

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

    Bu komut dosyayı testfile.txtadlı yerel bir dosyaya indirir.

  5. Yerel dosyayı SAS depolamadaki testupload.txt adlı yeni bir dosyaya yüklemek için aşağıdaki komutu kullanın:

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

    Aşağıdaki metne benzer bir ileti alırsınız:

    put: java.io.IOException
    

    Depolama konumu salt okunur+liste olduğundan bu hata oluşur. Verileri yazılabilir olan kümenin varsayılan depolama alanına yerleştirmek için aşağıdaki komutu kullanın:

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

    Bu kez işlemin başarıyla tamamlanması gerekir.

Sonraki adımlar

HDInsight kümenize sınırlı erişimli depolama eklemeyi öğrendiğinize göre, kümenizdeki verilerle çalışmanın diğer yollarını öğrenin: