Menggunakan Tanda Tangan Akses Bersama penyimpanan Azure Blob untuk membatasi akses ke data di HDInsight

HDInsight secara default memiliki akses penuh ke data di akun penyimpanan Azure Blob yang terkait dengan kluster. Anda dapat menggunakan Tanda Tangan Akses Bersama pada kontainer blob untuk membatasi akses ke data. Tanda Tangan Akses Bersama (Shared Access Signatures atau SAS) adalah fitur akun penyimpanan Azure Blob yang memungkinkan Anda membatasi akses ke data. Misalnya, menyediakan akses baca-saja ke data.

Penting

Untuk solusi menggunakan Apache Ranger, pertimbangkan penggunaan HDInsight yang digabung dengan domain. Untuk informasi selengkapnya, lihat dokumen Konfigurasi HDInsight yang digabung dengan domain.

Peringatan

HDInsight harus memiliki akses penuh ke penyimpanan default untuk kluster.

Prasyarat

  • Klien SSH. Untuk informasi selengkapnya, lihat Menyambungkan ke HDInsight (Apache Hadoop) menggunakan SSH.

  • Kontainer penyimpananyang ada.

  • Jika menggunakan PowerShell, Anda memerlukan Modul Az.

  • Jika ingin menggunakan Azure CLI dan Anda belum memasangnya, lihat Memasang Azure CLI.

  • Jika menggunakan Python, versi 2.7 atau lebih tinggi.

  • Jika menggunakan C#, Visual Studio harus versi 2013 atau lebih tinggi.

  • Skema URI untuk akun penyimpanan Anda. Skema yang digunakan adalah wasb:// untuk penyimpanan Azure Blob, abfs:// untuk Azure Data Lake Storage Gen2 atau adl:// untuk Azure Data Lake Storage Gen1. Jika transfer aman diaktifkan untuk penyimpanan Azure Blob, URI akan menjadi wasbs://.

  • Kluster HDInsight yang sudah ada yang akan ditambahkan Tanda Tangan Akses Bersama. Jika tidak, Anda dapat menggunakan Azure PowerShell untuk membuat kluster dan menambahkan Tanda Tangan Akses Bersama selama pembuatan kluster.

  • Contoh file dari https://github.com/Azure-Samples/hdinsight-dotnet-python-azure-storage-shared-access-signature. Repositori ini memuat item berikut ini:

    • Proyek Visual Studio yang dapat membuat kontainer penyimpanan, kebijakan tersimpan, dan SAS untuk digunakan dengan HDInsight
    • Skrip Python yang dapat membuat kontainer penyimpanan, kebijakan tersimpan, dan SAS untuk digunakan dengan HDInsight
    • Skrip PowerShell yang dapat membuat kluster HDInsight dan mengonfigurasinya untuk menggunakan SAS. Versi yang diperbarui digunakan lebih lanjut di bawah ini.
    • File sampel: hdinsight-dotnet-python-azure-storage-shared-access-signature-master\sampledata\sample.log

Tanda Tangan Akses Bersama

Ada dua bentuk Tanda Tangan Akses Bersama:

  • Ad hoc: Waktu mulai, waktu kedaluwarsa, dan izin untuk SAS semuanya ditentukan pada SAS URI.

  • Stored access policy: Kebijakan akses tersimpan ditetapkan pada kontainer sumber daya, seperti kontainer blob. Kebijakan akses tersimpan dapat digunakan untuk mengelola batasan untuk satu atau beberapa tanda tangan akses bersama. Ketika Anda mengaitkan layanan SAS dengan kebijakan akses yang tersimpan, SAS mewarisi batasan - waktu mulai, waktu kedaluwarsa, dan izin yang ditentukan untuk kebijakan akses yang tersimpan.

Perbedaan antara kedua formulir penting untuk satu skenario utama: pencabutan. SAS adalah URL, sehingga siapa pun yang mendapatkan SAS dapat menggunakannya. Tidak peduli siapa yang memintanya untuk memulai. Jika SAS diterbitkan secara publik, SAS dapat digunakan oleh siapa saja di dunia. SAS yang didistribusikan berlaku hingga salah satu dari empat hal terjadi:

  1. Waktu kedaluwarsa yang ditentukan pada SAS tercapai.

  2. Waktu kedaluwarsa yang ditentukan pada kebijakan akses tersimpan yang dirujuk oleh SAS tercapai. Skenario berikut menyebabkan waktu kedaluwarsa tercapai:

    • Interval waktu telah berlalu.
    • Kebijakan akses tersimpan dimodifikasi untuk memiliki waktu kedaluwarsa pada masa lalu. Mengubah waktu kedaluwarsa adalah salah satu cara untuk mencabut SAS.
  3. Kebijakan akses tersimpan yang dirujuk oleh SAS dihapus, yang merupakan cara lain untuk mencabut SAS. Jika Anda membuat ulang kebijakan akses tersimpan dengan nama yang sama, semua token SAS untuk kebijakan sebelumnya akan valid (jika waktu kedaluwarsa pada SAS belum berlalu). Jika Anda berniat untuk mencabut SAS, pastikan untuk menggunakan nama yang berbeda jika Anda membuat ulang kebijakan akses dengan waktu kedaluwarsa di masa depan.

  4. Kunci akun yang digunakan untuk membuat SAS diregenerasi. Meregenerasi kunci menyebabkan semua aplikasi yang menggunakan kunci sebelumnya gagal diautentikasi. Perbarui semua komponen ke kunci baru.

Penting

URI tanda tangan akses bersama dikaitkan dengan kunci akun yang digunakan untuk membuat tanda tangan, dan kebijakan akses tersimpan terkait (jika ada). Jika tidak ada kebijakan akses yang disimpan yang ditentukan, satu-satunya cara untuk mencabut tanda tangan akses bersama adalah dengan mengubah kunci akun.

Kami menyarankan agar Anda selalu menggunakan kebijakan akses yang tersimpan. Saat menggunakan kebijakan yang disimpan, Anda dapat mencabut tanda tangan atau memperpanjang tanggal kedaluwarsa sesuai kebutuhan. Langkah-langkah dalam dokumen ini menggunakan kebijakan akses tersimpan untuk menghasilkan SAS.

Untuk informasi selengkapnya mengenai Tanda Tangan Akses Bersama, lihat Memahami model SAS.

Membuat kebijakan yang disimpan dan SAS

Simpan token SAS yang dihasilkan di akhir setiap metode. Token akan terlihat menyerupai output berikut:

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

Menggunakan PowerShell

Ganti RESOURCEGROUP, STORAGEACCOUNT,dan STORAGECONTAINERdengan nilai yang sesuai untuk kontainer penyimpanan Anda yang ada. Ubah direktori ke hdinsight-dotnet-python-azure-storage-shared-access-signature-master atau revisi -File parameter agar berisi jalur absolut untuk Set-AzStorageblobcontent. Masukkan perintah PowerShell berikut ini:

$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

Menggunakan Azure CLI

Penggunaan variabel di bagian ini didasarkan pada lingkungan Windows. Sedikit variasi akan diperlukan untuk bash atau lingkungan lain.

  1. Ganti STORAGEACCOUNT, dan STORAGECONTAINER dengan nilai yang sesuai untuk kontainer penyimpanan Anda yang sudah ada.

    # 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. Atur kunci primer yang diambil ke variabel untuk digunakan nanti. Ganti PRIMARYKEY dengan nilai yang diambil pada langkah sebelumnya, lalu masukkan perintah di bawah ini:

    #set variable for primary key
    set AZURE_STORAGE_KEY=PRIMARYKEY
    
  3. Ubah direktori ke hdinsight-dotnet-python-azure-storage-shared-access-signature-master atau revisi parameter agar berisi jalur --file absolut untuk az storage blob upload. Jalankan perintah yang tersisa:

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

Menggunakan Python

Buka SASToken.py file dan ganti storage_account_name, storage_account_key, dan storage_container_name dengan nilai yang sesuai untuk kontainer penyimpanan Anda yang sudah ada, lalu jalankan skrip.

Anda mungkin perlu menjalankan pip install --upgrade azure-storage jika Anda menerima pesan kesalahan ImportError: No module named azure.storage.

Menggunakan C#

  1. Buka solusi di Visual Studio.

  2. Di Penjelajah Solusi, klik kanan proyek SASExample dan pilih Properti.

  3. Pilih Pengaturan dan tambahkan nilai untuk entri berikut ini:

    Item Deskripsi
    StorageConnectionString String koneksi untuk akun penyimpanan tempat Anda ingin membuat kebijakan tersimpan dan SAS. Format harus merupakan DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=mykey tempat myaccount nama akun penyimpanan Anda dan mykey merupakan kunci untuk akun penyimpanan.
    ContainerName Kontainer di akun penyimpanan yang ingin Anda batasi aksesnya.
    SASPolicyName Nama yang digunakan untuk kebijakan tersimpan yang akan dibuat.
    FileToUpload Jalur ke file yang diunggah ke kontainer.
  4. Jalankan proyek. Simpan token kebijakan SAS, nama akun penyimpanan, dan nama kontainer. Nilai-nilai ini digunakan saat mengaitkan akun penyimpanan dengan kluster HDInsight Anda.

Menggunakan SAS dengan HDInsight

Saat membuat kluster HDInsight, Anda harus menentukan akun penyimpanan utama. Anda juga dapat menentukan akun penyimpanan tambahan. Kedua metode penambahkan penyimpanan ini memerlukan akses penuh ke akun penyimpanan dan kontainer yang digunakan.

Gunakan Tanda Tangan Akses Bersama untuk membatasi akses kontainer. Tambahkan entri kustom ke konfigurasi situs inti untuk kluster. Anda dapat menambahkan entri selama pembuatan kluster menggunakan PowerShell atau setelah pembuatan klaster menggunakan Ambari.

Membuat kluster yang menggunakan SAS

Ganti CLUSTERNAME, RESOURCEGROUP, DEFAULTSTORAGEACCOUNT, STORAGECONTAINER, STORAGEACCOUNT, dan TOKEN dengan nilai yang sesuai. Masukkan perintah 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
#>

Penting

Ketika diminta untuk memasukkan nama pengguna dan kata sandi HTTP atau SSH, Anda harus memberikan kata sandi yang memenuhi kriteria berikut:

  • Panjang minimal 10 karakter.
  • Harus berisi setidaknya satu digit.
  • Harus berisi setidaknya satu karakter non-alfanumerik.
  • Harus berisi setidaknya satu huruf besar atau huruf kecil.

Dibutuhkan beberapa saat agar skrip ini selesai, biasanya sekitar 15 menit. Ketika skrip selesai tanpa kesalahan, kluster telah dibuat.

Menggunakan SAS dengan kluster yang ada

Jika Anda memiliki kluster yang sudah ada, Anda bisa menambahkan SAS ke konfigurasi situs inti dengan menggunakan langkah-langkah berikut:

  1. Buka UI web Ambari untuk kluster Anda. Alamat untuk halaman ini adalah https://YOURCLUSTERNAME.azurehdinsight.net. Ketika diminta, autentikasi ke kluster menggunakan nama admin (admin) dan kata sandi yang Anda gunakan saat membuat kluster.

  2. Arahkan ke HDFS>Konfigurasi>Tingkat Lanjut>Situs inti kustom.

  3. Perluas situs inti Kustom, gulir ke akhir lalu pilih Tambahkan properti... . Gunakan nilai berikut untuk Kunci dan Nilai:

    • Kunci: fs.azure.sas.CONTAINERNAME.STORAGEACCOUNTNAME.blob.core.windows.net
    • Nilai: SAS dikembalikan oleh salah satu metode yang sebelumnya dijalankan.

    Ganti CONTAINERNAME dengan nama kontainer yang Anda gunakan dengan aplikasi C# atau SAS. Ganti STORAGEACCOUNTNAME dengan nama akun penyimpanan yang Anda gunakan.

    Memilih Tambahkan untuk menyimpan kunci dan nilai ini

  4. Pilih tombol ​Simpan untuk menyimpan konfigurasi. Jika diminta, tambahkan deskripsi perubahan (misalnya "menambahkan akses penyimpanan SAS") lalu klik Simpan.

    Pilih OK ketika perubahan telah selesai.

    Penting

    Anda harus menghidupkan-ulang beberapa layanan sebelum perubahan berlaku.

  5. Daftar menurun Hidupkan ulang akan muncul. Pilih Hidupkan Ulang Semua yang Terpengaruh dari daftar menurun lalu Konfirmasi Hidupkan Ulang Semua.

    Ulangi proses ini untuk MapReduce2 dan YARN.

  6. Setelah layanan dimulai ulang, pilih masing-masing layanan dan nonaktifkan mode pemeliharaan dari daftar menurun Tindakan Layanan.

Menguji akses terbatas

Gunakan langkah-langkah berikut untuk memverifikasi bahwa Anda hanya dapat membaca dan mencantumkan item di akun penyimpanan SAS.

  1. Sambungkan ke kluster. Ganti CLUSTERNAME dengan nama kluster Anda dan masukkan perintah berikut:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. Untuk mencantumkan konten kontainer, gunakan perintah berikut ini dari permintaan:

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

    Ganti SASCONTAINER dengan nama kontainer yang dibuat untuk akun penyimpanan SAS. Ganti SASACCOUNTNAME dengan nama akun penyimpanan yang digunakan untuk SAS.

    Daftar ini menyertakan file yang diunggah saat kontainer dan SAS dibuat.

  3. Gunakan perintah berikut untuk memverifikasi bahwa Anda dapat membaca konten file. Ganti SASCONTAINER dan SASACCOUNTNAME seperti pada langkah sebelumnya. Ganti sample.log dengan nama file yang ditampilkan di perintah sebelumnya:

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

    Perintah ini mencantumkan isi file.

  4. Gunakan perintah berikut untuk mengunduh file ke sistem file lokal:

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

    Perintah ini mengunduh file ke file lokal bernama testfile.txt.

  5. Gunakan perintah berikut untuk mengunggah file lokal ke file baru bernama testupload.txt di penyimpanan SAS:

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

    Anda menerima pesan yang mirip dengan teks berikut:

    put: java.io.IOException
    

    Kesalahan ini terjadi karena lokasi penyimpanan merupakan baca+daftar saja. Gunakan perintah berikut untuk meletakkan data pada penyimpanan default untuk kluster, yang bisa ditulis:

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

    Kali ini, operasi harus berhasil diselesaikan.

Langkah berikutnya

Sekarang setelah Anda mempelajari cara menambahkan penyimpanan akses terbatas ke kluster HDInsight Anda, pelajari cara lain untuk bekerja dengan data di kluster Anda: