استخدم توقيعات الوصول المشترك لموقع تخزين Azure Blob لتقييد الوصول إلى البيانات في HDInsight

يتمتع HDInsight بحق الوصول الكامل إلى البيانات الموجودة في حسابات موقع تخزين Azure Blob المرتبطة بالمجموعة. يمكنك استخدام توقيعات الوصول المشتركة على حاوية البيانات الثنائية الكبيرة لتقييد الوصول إلى البيانات. توقيعات الوصول المشتركة (SAS) هي ميزة لحسابات موقع تخزين Azure Blob التي تتيح لك تقييد الوصول إلى البيانات. على سبيل المثال، توفير وصول للقراءة فقط إلى البيانات.

هام

للحصول على حل باستخدام Apache Ranger، ضع في اعتبارك استخدام HDInsight المرتبط بالمجال. لمزيد من المعلومات، راجع مستند تكوين HDInsight المرتبط بالمجال.

تحذير

يجب أن يتمتع HDInsight بوصول كامل إلى وحدة التخزين الافتراضية للمجموعة.

المتطلبات الأساسية

  • عميل SSH. لمزيدٍ من المعلومات، يرجى الرجوع إلى الاتصال بـ HDInsight (Apache Hadoop) باستخدام SSH .

  • حاوية تخزين موجودة.

  • إذا كنت تستخدم PowerShell، فستحتاج إلى Az Module.

  • إذا كنت تريد استخدام Azure CLI ولم تقم بتثبيته بعد، فراجع تثبيت Azure CLI.

  • في حالة استخدام Python، الإصدار 2.7 أو أعلى.

  • في حالة استخدام C#، يجب أن يكون Visual Studio هو الإصدار 2013 أو أعلى.

  • مخطط URI لحساب التخزين الخاص بك. سيكون هذا المخطط wasb:// لموقع تخزين Azure Blob، أو abfs:// تخزين Azure Data Lake Gen2 أو adl:// لـ Azure Data Lake Storage Gen1. إذا تم تمكين النقل الآمن لموقع تخزين Azure Blob، فسيكون URI wasbs://.

  • مجموعة HDInsight موجودة لإضافة توقيع وصول مشترك إلى. إذا لم يكن الأمر كذلك، يمكنك استخدام Azure PowerShell لإنشاء كتلة وإضافة توقيع وصول مشترك أثناء إنشاء الكتلة.

  • ملفات الأمثلة من https://github.com/Azure-Samples/hdinsight-dotnet-python-azure-storage-shared-access-signature. يحتوي هذا المستودع على العناصر التالية:

    • مشروع Visual Studio يمكنه إنشاء حاوية تخزين ونهج تخزين وSAS للاستخدام مع HDInsight
    • برنامج نصي بلغة Python يمكنه إنشاء حاوية تخزين ونهج تخزين وSAS للاستخدام مع HDInsight
    • برنامج نصي PowerShell يمكنه إنشاء مجموعة HDInsight وتكوينها لاستخدام SAS. يتم استخدام نسخة محدثة أدناه.
    • نموذج للملف: hdinsight-dotnet-python-azure-storage-shared-access-signature-master\sampledata\sample.log

توقيعات الوصول المشترك

هناك نوعان من تواقيع الوصول المشترك:

  • Ad hoc: تم تحديد وقت البدء ووقت انتهاء الصلاحية والأذونات الخاصة بـ SAS في SAS URI.

  • Stored access policy: يتم تحديد نهج الوصول المخزنة في حاوية الموارد، مثل حاوية البيانات الثنائية الكبيرة. يمكن استخدام النهج لإدارة القيود الخاصة بتوقيع واحد أو أكثر من توقيعات الوصول المشتركة. عند ربط SAS بنهج وصول مخزنة، ترث SAS القيود - وقت البدء ووقت انتهاء الصلاحية والأذونات - المحددة لنهج الوصول المخزنة.

الفرق بين النموذجين مهم لسيناريو رئيس واحد: الإلغاء. SAS هو عنوان URL؛ لذا يمكن لأي شخص يحصل على SAS استخدامه. لا يهم من الذي طلب ذلك. إذا نُشِر SAS علناً، فيمكن لأي شخص في العالم استخدامه. يكون SAS الموزع صالحاً حتى يحدث أحد الأشياء الأربعة:

  1. تم الوصول إلى وقت انتهاء الصلاحية المحدد في SAS.

  2. تم الوصول إلى وقت انتهاء الصلاحية المحدد في نهج الوصول المخزنة المشار إليها بواسطة SAS. تتسبب السيناريوهات التالية في الوصول إلى وقت انتهاء الصلاحية:

    • انقضى الفاصل الزمني.
    • تم تعديل نهج الوصول المخزنة بحيث يكون لها وقت انتهاء صلاحية في الماضي. يُعَد تغيير وقت انتهاء الصلاحية إحدى طرق إلغاء SAS.
  3. يتم حذف نهج الوصول المخزنة المشار إليها بواسطة SAS، وهي طريقة أخرى لإلغاء SAS. إذا أعدت إنشاء نهج الوصول المخزنة بنفس الاسم، فستكون جميع رموز SAS المميزة للنهج السابقة صالحة (إذا لم يمر وقت انتهاء الصلاحية على SAS). إذا كنت تنوي إبطال SAS، فتأكد من استخدام اسم مختلف إذا قمت بإعادة إنشاء نهج الوصول مع انتهاء وقت الصلاحية في المستقبل.

  4. تتم إعادة إنشاء مفتاح الحساب الذي تم استخدامه لإنشاء SAS. تؤدي إعادة إنشاء المفتاح إلى فشل جميع التطبيقات التي تستخدم المفتاح السابق في المصادقة. حدِّث كافة المكونات إلى المفتاح الجديد.

هام

يرتبط URI لتوقيع الوصول المشترك بمفتاح الحساب المستخدم لإنشاء التوقيع ونهج الوصول المخزنة المرتبطة (إن وجدت). إذا لم يُحدَّد نهج وصول مخزن، فإن الطريقة الوحيدة لإبطال توقيع الوصول المشترك هي تغيير مفتاح الحساب.

نوصي باستخدام نُهج الوصول المخزنة دائماً. عند استخدام النُهج المخزنة، يمكنك إما إبطال التوقيعات، أو تمديد تاريخ انتهاء الصلاحية حسب الحاجة. تستخدم الخطوات الواردة في هذا المستند نُهج الوصول المخزنة لإنشاء SAS.

لمزيد من المعلومات حول توقيعات الوصول المشترك، راجع فهم نموذج SAS.

إنشاء نهج مخزنة وSAS

احفظ رمز SAS الذي تم إنتاجه في نهاية كل طريقة. سيبدو الرمز المميز مشابهاً للإخراج التالي:

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

استخدام PowerShell

استبدل RESOURCEGROUP، STORAGEACCOUNT وSTORAGECONTAINER بالقيم المناسبة لحاوية التخزين الموجودة لديك. غَيِّر الدليل إلى hdinsight-dotnet-python-azure-storage-shared-access-signature-master أو راجع المعلمة -File لتحتوي على المسار المطلق لـ Set-AzStorageblobcontent. أدخل أمر 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

استخدام Azure CLI

يعتمد استخدام المتغيرات في هذا القسم على بيئة Windows. ستكون هناك حاجة إلى اختلافات طفيفة في bash أو البيئات الأخرى.

  1. استبدل STORAGEACCOUNT، STORAGECONTAINER بالقيم المناسبة لحاوية التخزين الموجودة لديك.

    # 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. عَيِّن المفتاح الأساسي المسترجع إلى متغير لاستخدامه لاحقاً. استبدل PRIMARYKEY بالقيمة المستردة في الخطوة السابقة، ثم أدخل الأمر أدناه:

    #set variable for primary key
    set AZURE_STORAGE_KEY=PRIMARYKEY
    
  3. غَيِّر الدليل إلى hdinsight-dotnet-python-azure-storage-shared-access-signature-master أو راجع المعلمة --file لتحتوي على المسار المطلق لـ az storage blob upload. نفذ الأوامر المتبقية:

    # 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

افتح ملف SASToken.py واستبدل storage_account_name، storage_account_key وstorage_container_name بالقيم المناسبة لحاوية التخزين الموجودة لديك، ثم شَغِّل البرنامج النصي.

قد تحتاج إلى تنفيذ pip install --upgrade azure-storage إذا تلقيت رسالة الخطأ ImportError: No module named azure.storage.

استخدام لغة C#‎

  1. افتح الحل في Visual Studio.

  2. في Solution Explorer، انقر بزر الماوس الأيمن على مشروع SASExample وحدد Properties.

  3. حدد Settings وأضف قيماً للإدخالات التالية:

    العنصر الوصف
    StorageConnectionString سلسلة الاتصال لحساب التخزين الذي تريد إنشاء نهج مخزنة وSAS له. يجب أن يكون التنسيق DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=mykey حيث myaccount هو اسم حساب التخزين وmykey هو مفتاح حساب التخزين.
    ContainerName الحاوية في حساب التخزين التي تريد تقييد الوصول إليها.
    SASPolicyName الاسم الذي سيتم استخدامه لإنشاء النهج المخزنة.
    FileToUpload مسار الملف الذي تم تحميله إلى الحاوية.
  4. شغِّل المشروع. احفظ رمز نهج SAS واسم حساب التخزين واسم الحاوية. تُستخدم هذه القيم عند ربط حساب التخزين بمجموعة HDInsight الخاصة بك.

استخدم SAS مع HDInsight

عند إنشاء مجموعة HDInsight، يجب عليك تحديد حساب تخزين أساسي. يمكنك أيضاً تحديد حسابات تخزين إضافية. تتطلب كلتا الطريقتين لإضافة التخزين الوصول الكامل إلى حسابات التخزين والحاويات المستخدمة.

استخدم توقيع الوصول المشترك لتقييد الوصول إلى الحاوية. أضف إدخالاً مخصصاً إلى تكوين core-site للمجموعة. يمكنك إضافة الإدخال أثناء إنشاء الكتلة باستخدام PowerShell أو بعد إنشاء الكتلة باستخدام Ambari.

إنشاء كتلة تستخدم SAS

استبدال CLUSTERNAME، وRESOURCEGROUP، وDEFAULTSTORAGEACCOUNT، وSTORAGECONTAINER وSTORAGEACCOUNT، وTOKEN بالقيم المناسبة. أدخل أوامر 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
#>

هام

عند مطالبتك بإدخال اسم المستخدم وكلمة المرور HTTP / s أو SSH، يجب عليك توفير كلمة مرور تفي بالمعايير التالية:

  • يجب ألا يقل طوله عن 10 أحرف.
  • يجب أن يحتوي على رقم واحد على الأقل.
  • يجب أن يحتوي على حرف واحد على الأقل ليس أبجديَّا رقميَّا.
  • يجب أن يحتوي على حرف واحد كبير أو صغير على الأقل.

يستغرق إكمال هذا النص بعض الوقت، عادةً حوالي 15 دقيقة. عندما يكتمل البرنامج النصي دون أي أخطاء، يتم إنشاء الكتلة.

استخدم SAS مع مجموعة موجودة

إذا كانت لديك مجموعة حالية، فيمكنك إضافة SAS إلى تكوين core-site باتباع الخطوات التالية:

  1. افتح واجهة مستخدم ويب Ambari لمجموعتك. عنوان هذه الصفحة هو https://YOURCLUSTERNAME.azurehdinsight.net. عند المطالبة، قم بالمصادقة إلى المجموعة باستخدام اسم المسؤول (المسؤول) وكلمة المرور اللذين استخدمتهما عند إنشاء الكتلة.

  2. انتقل إلى HDFS>Configs>Advanced>Custom core-site.

  3. وَسِّع قسم موقع أساسي مخصص، وانتقل إلى النهاية، ثم حدد Add property... . استخدم القيم التالية لـ Key والقيمة:

    • ‏‏المفتاح: fs.azure.sas.CONTAINERNAME.STORAGEACCOUNTNAME.blob.core.windows.net
    • القيمة: إرجاع SAS بإحدى الطرق التي تم تنفيذها مسبقاً.

    استبدل CONTAINERNAME باسم الحاوية الذي استخدمته مع تطبيق C# أو SAS. استبدل STORAGEACCOUNTNAME باسم حساب التخزين الذي استخدمته.

    حدد إضافة لحفظ هذا المفتاح والقيمة

  4. حدد الزر حفظ لحفظ تغييرات التكوين. عند المطالبة، أضف وصفاً للتغيير ("إضافة وصول تخزين SAS" على سبيل المثال) ثم حدد حفظ.

    حدد موافق عند اكتمال التغييرات.

    هام

    يجب إعادة تشغيل العديد من الخدمات قبل تفعيل التغيير.

  5. ستظهر قائمة منسدلة إعادة التشغيل. حدد إعادة تشغيل جميع العناصر المتأثرة من القائمة المنسدلة ثم تأكيد إعادة تشغيل الكل.

    كرر هذه العملية لـ MapReduce2 وYARN.

  6. بمجرد إعادة تشغيل الخدمات، حدد كل واحدة وقم بتعطيل وضع الصيانة من القائمة المنسدلة إجراءات الخدمة.

اختبار الوصول المقيد

استخدم الخطوات التالية للتحقق من أنه يمكنك فقط قراءة العناصر وإدراجها في حساب تخزين SAS.

  1. الاتصال بنظام المجموعة. استبدل CLUSTERNAME باسم مجموعتك وأدخل الأمر التالي:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. لسرد محتويات الحاوية، استخدم الأمر التالي من الموجه:

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

    استبدل SASCONTAINER باسم الحاوية التي تم إنشاؤها لحساب تخزين SAS. استبدل SASACCOUNTNAME باسم حساب التخزين المستخدم لـ SAS.

    تتضمن القائمة الملف الذي تم تحميله عند إنشاء الحاوية وSAS.

  3. استخدم الأمر التالي للتحقق من أنه يمكنك قراءة محتويات الملف. استبدل SASCONTAINER وSASACCOUNTNAME كما في الخطوة السابقة. استبدل sample.log باسم الملف المعروض في الأمر السابق:

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

    يسرد هذا الأمر محتويات الملف.

  4. استخدم الأمر التالي لتنزيل الملف إلى نظام الملفات المحلي:

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

    يقوم هذا الأمر بتنزيل الملف إلى ملف محلي يسمى testfile.txt.

  5. استخدم الأمر التالي لتحميل الملف المحلي إلى ملف جديد باسم testupload.txt على تخزين SAS:

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

    تتلقى رسالة مشابهة للنص التالي:

    put: java.io.IOException
    

    يحدث هذا الخطأ لأن موقع التخزين للقراءة + القائمة فقط. استخدم الأمر التالي لوضع البيانات على التخزين الافتراضي للكتلة، وهو قابل للكتابة:

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

    هذه المرة، يجب أن تكتمل العملية بنجاح.

الخطوات التالية

الآن بعد أن تعلمت كيفية إضافة سعة تخزين محدودة الوصول إلى مجموعة HDInsight الخاصة بك، تعرف على طرق أخرى للعمل مع البيانات الموجودة في مجموعتك: