استخدام TLS لتأمين خدمة ويب من خلال التعلم الآلي من Microsoft Azure

ينطبق على:Python SDK azureml الإصدار 1

توضح لك هذه المقالة كيفية تأمين خدمة ويب تم توزيعها عبر التعلم الآلي من Microsoft Azure.

تستخدم HTTPS لتقييد الوصول إلى خدمات الويب وتأمين البيانات التي يرسلها العملاء. يساعد HTTPS في تأمين الاتصالات بين العميل وخدمة الويب عن طريق تشفير الاتصالات بين الاثنين. التشفير يستخدم Transport Layer Security (TLS). لا يزال يشار إلى TLS أحياناً باسم طبقة مآخذ توصيل آمنة (SSL)، والتي كانت سلف TLS.

تلميح

يستخدم التعلم الآلي لـSDK المصطلح "SSL" للخصائص المرتبطة بالاتصالات الآمنة. هذا لا يعني أن خدمة الويب لديك لا تستخدم TLS. SSL هو مصطلح معروف بشكل أكثر تداولاً.

على وجه التحديد، تدعم خدمات الويب التي يتم توزيعها عبر التعلم الآلي من Microsoft Azure الإصدار 1.2 من TLS لـAKS وACI. بالنسبة لعمليات توزيع ACI، إذا كنت تستخدم إصدار TLS أقدم، فإننا نوصي بإعادة التوزيع للحصول على أحدث إصدار من TLS.

الإصدار 1.3 من TLS للتعلم الآلي في Azure - أما AKS Inference فغير مدعوم.

يعتمد كل من TLS وSSL على الشهادات الرقمية، والتي تساعد في التشفير والتحقق من الهوية. لمزيد من المعلومات بشأن كيفية عمل الشهادات الرقمية، راجع موضوع Wikipedia البنية التحتية للمفتاح العام.

تحذير

إذا كنت لا تستخدم HTTPS لخدمة الويب الخاصة بك، فقد تكون البيانات المرسلة من وإلى الخدمة مرئية للآخرين على الإنترنت.

يتيح HTTPS أيضاً للعميل التحقق من صحة الخادم الذي يتصل به. تحمي هذه الميزة العملاء من هجمات man-in-the-middle.

هذه هي العملية العامة لتأمين خدمة الويب:

  1. احصل على اسم المجال.

  2. احصل على شهادة رقمية.

  3. قم بتوزيع أو تحديث خدمة الويب مع تمكين TLS.

  4. قم بتحديث DNS للإشارة إلى خدمة الويب.

هام

إذا كنت تقوم بالتوزيع في خدمة Azure Kubernetes (AKS)، يمكنك شراء شهادتك الخاصة أو استخدام شهادة توفرها Microsoft. إذا كنت تستخدم شهادة من Microsoft، فلن تحتاج إلى الحصول على اسم مجال أو شهادة TLS/SSL. لمزيد من المعلومات، راجع قسم تمكين TLS وتوزيعه من هذه المقالة.

توجد اختلافات طفيفة عند التأمين عبر أهداف التوزيع.

هام

تتطلب أوامر Azure CLI الواردة في هذه المقالة ملحق azure-cli-ml، أو الإصدار 1، التعلم الآلي من Microsoft Azure. سينتهي دعم ملحق الإصدار 1 في 30 سبتمبر 2025. ستتمكن من تثبيت ملحق v1 واستخدامه حتى ذلك التاريخ.

نوصي بالانتقال إلى ملحق ml أو الإصدار 2 قبل 30 سبتمبر 2025. لمزيد من المعلومات حول ملحق v2، راجع ملحق Azure ML CLI وPython SDK v2.

الحصول على اسم المجال

إذا لم يكن لديك اسم مجال بالفعل، فقم بشراء واحد من مسجل اسم المجال. تختلف العملية والسعر بين المسجلين. يوفر المسجل أدوات لإدارة اسم المجال. يمكنك استخدام هذه الأدوات لتعيين اسم مجال مؤهل بالكامل (FQDN) (مثل www.contoso.com) إلى عنوان IP الذي يستضيف خدمة الويب الخاصة بك.

احصل على شهادة TLS/SSL

هناك عدة طرق للحصول على شهادة TLS/SSL (شهادة رقمية). الأكثر تداولاً هو شراء واحد من مصادقة شهادة (CA). بغض النظر عن مكان حصولك على الشهادة، فأنت بحاجة إلى الملفات التالية:

  • شهادة. يجب أن تحتوي الشهادة على سلسلة الشهادات الكاملة، ويجب أن تكون "مشفرة بنظام PEM."
  • مفتاح. يجب أيضاً أن يكون المفتاح مشفراً بـPEM.

عندما تطلب شهادة، يجب عليك تقديم FQDN للعنوان الذي تخطط لاستخدامه لخدمة الويب (على سبيل المثال، www.contoso.com). تتم مقارنة العنوان المختوم في الشهادة والعنوان الذي يستخدمه العملاء للتحقق من هوية خدمة الويب. إذا لم تتطابق هذه العناوين، يتلقى العميل رسالة خطأ.

تلميح

إذا تعذر على مصادقة الشهادة تقديم الشهادة والمفتاح كملفات بتشفير PEM، يمكنك استخدام أداة مساعدة مثل OpenSSL لتغيير التنسيق.

تحذير

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

تمكين TLS وتوزيعه

لنشر AKS، يمكنك تمكين إنهاء TLS عند إنشاء مجموعة AKS أو إرفاقها في مساحة عمل التعلم الآلي من Microsoft Azure. في وقت توزيع نموذج AKS، يمكنك تعطيل إنهاء TLS باستخدام عنصر تكوين التوزيع، وإلا فسيتم تمكين إنهاء TLS افتراضياً عند إنشاء نظام مجموعة AKS أو إرفاق الوقت.

لتوزيع ACI، يمكنك تمكين إنهاء TLS في وقت توزيع النموذج باستخدام عنصر تكوين التوزيع.

التوزيع على خدمة Azure Kubernetes

ملاحظة

تنطبق المعلومات الواردة في هذا القسم أيضاً عند توزيع خدمة ويب آمنة للمصمم. إذا لم تكن معتاداً على استخدام Python SDK، فراجع ما المقصود بالتعلم الآلي لـSDK لـPython؟.

عند إنشاء مجموعة AKS أو إرفاقها في مساحة عمل التعلم الآلي من Microsoft Azure، يمكنك تمكين إنهاء TLS باستخدام كائنات التكوين AksCompute.provisioning_configuration() و AksCompute.attach_configuration(). تعيد كلتا الطريقتين عنصر تكوين له أسلوب enable_ssl، ويمكنك استخدام أسلوب enable_ssl لتمكين TLS.

يمكنك تمكين TLS إما بشهادة Microsoft أو شهادة مخصصة تم شراؤها من CA.

  • عندما تستخدم شهادة من Microsoft، يجب عليك استخدام معلمة Leaf_domain_label. تقوم هذه المعلمة بإنشاء اسم DNS للخدمة. على سبيل المثال، تنشئ قيمة "contoso" اسم مجال لـ"contoso<six-random-characters>.<azureregion>.cloudapp.azure.com"، حيث <azureregion> هي المنطقة التي تحتوي على الخدمة. اختيارياً، يمكنك استخدام المعلمة overwrite_existing_domain للكتابة فوق leaf_domain_label الموجود حالياً. يوضح المثال التالي كيفية إنشاء تكوين يمكّن TLS بشهادة Microsoft:

    from azureml.core.compute import AksCompute
    
    # Config used to create a new AKS cluster and enable TLS
    provisioning_config = AksCompute.provisioning_configuration()
    
    # Leaf domain label generates a name using the formula
    #  "<leaf-domain-label>######.<azure-region>.cloudapp.azure.com"
    #  where "######" is a random series of characters
    provisioning_config.enable_ssl(leaf_domain_label = "contoso")
    
    
    # Config used to attach an existing AKS cluster to your workspace and enable TLS
    attach_config = AksCompute.attach_configuration(resource_group = resource_group,
                                          cluster_name = cluster_name)
    
    # Leaf domain label generates a name using the formula
    #  "<leaf-domain-label>######.<azure-region>.cloudapp.azure.com"
    #  where "######" is a random series of characters
    attach_config.enable_ssl(leaf_domain_label = "contoso")
    

    هام

    عندما تستخدم شهادة من Microsoft، لن تحتاج إلى شراء شهادتك الخاصة أو اسم المجال.

  • عند استخدام شهادة مخصصة اشتريتها، فإنك تستخدم معلمات ssl_cert_pem_file وssl_key_pem_file وssl_cname. ملف PEM مع حماية عبارة المرور غير مدعوم. يوضح المثال التالي كيفية استخدام ملفات .pem لإنشاء تكوين يستخدم شهادة TLS/SSL التي اشتريتها:

    from azureml.core.compute import AksCompute
    
    # Config used to create a new AKS cluster and enable TLS
    provisioning_config = AksCompute.provisioning_configuration()
    provisioning_config.enable_ssl(ssl_cert_pem_file="cert.pem",
                                        ssl_key_pem_file="key.pem", ssl_cname="www.contoso.com")
    
    # Config used to attach an existing AKS cluster to your workspace and enable SSL
    attach_config = AksCompute.attach_configuration(resource_group = resource_group,
                                         cluster_name = cluster_name)
    attach_config.enable_ssl(ssl_cert_pem_file="cert.pem",
                                        ssl_key_pem_file="key.pem", ssl_cname="www.contoso.com")
    

لمزيد من المعلومات بشأن enable_ssl، راجع AksProvisioningConfiguration.enable_ssl() وAksAttachConfiguration.enable_ssl().

ماذا يُقصد بـ Azure Container Instances؟

عند التوزيع إلى مثيلات Azure Container، فإنك توفر قيماً للمعلمات ذات الصلة بـTLS، كما توضح قصاصة التعليمة البرمجية التالي:

from azureml.core.webservice import AciWebservice

aci_config = AciWebservice.deploy_configuration(
    ssl_enabled=True, ssl_cert_pem_file="cert.pem", ssl_key_pem_file="key.pem", ssl_cname="www.contoso.com")

لمزيد من المعلومات، راجع AciWebservice.deploy_configuration().

تحديث DNS الخاص بك

بالنسبة لتوزيع AKS بشهادة مخصصة أو لتوزيع ACI، يجب عليك تحديث سجل DNS للإشارة إلى عنوان IP الخاص بنقطة نهاية التسجيل.

هام

عند استخدام شهادة من Microsoft لتوزيع AKS، فلن تحتاج إلى تحديث قيمة DNS لنظام المجموعة يدوياً. يجب تعيين القيمة تلقائياً.

يمكنك اتباع الخطوات التالية لتحديث سجل DNS لاسم المجال المخصص الخاص بك:

  1. احصل على نقاط عنوان IP لنقطة النهاية من تسجيل URI لنقطة النهاية، والذي يكون عادةً بتنسيق http://104.214.29.152:80/api/v1/service/<service-name>/score. في هذا المثال، عنوان IP هو 104.214.29.152.

  2. استخدم الأدوات من مسجل اسم المجال الخاص بك لتحديث سجل DNS لاسم المجال الخاص بك. يقوم السجل بتعيين FQDN (على سبيل المثال، www.contoso.com) إلى عنوان IP. يجب أن يشير السجل إلى عنوان IP الخاص بنقطة نهاية التسجيل.

    تلميح

    Microsoft ليست مسؤولة عن تحديث DNS لاسم DNS المخصص أو الشهادة الخاصة بك. يجب عليك تحديثه مع مسجل اسم المجال الخاص بك.

  3. بعد تحديث سجل DNS، يمكنك التحقق من صحة حل DNS باستخدام الأمر nslookup custom-domain-name. إذا تم تحديث سجل DNS بشكل صحيح، فسيشير اسم المجال المخصص إلى عنوان IP الخاص بنقطة نهاية التسجيل.

    يمكن أن يكون هناك تأخير لمدة دقائق أو ساعات قبل أن يتمكن العملاء من حل اسم المجال، اعتماداً على المسجل و"time to live" (TTL) الذي تم تكوينه لاسم المجال.

لمزيد من المعلومات بشأن حل DNS مع التعلم الآلي، راجع كيفية استخدام مساحة العمل الخاصة بك مع خادم DNS مخصص.

تحديث شهادة TLS/SSL

تنتهي صلاحية شهادات TLS/SSL ويجب تجديدها. عادة يحدث هذا كل عام. استخدم المعلومات الواردة في الأقسام التالية لتحديث شهادتك وتجديدها للنماذج التي تم توزيعها في خدمة Azure Kubernetes:

تحديث شهادة تم إنشاؤها من قبل Microsoft

إذا تم إنشاء الشهادة في الأصل بواسطة Microsoft (عند استخدام Lea_domain_label لإنشاء الخدمة)، سيتم تجديدها تلقائياً عند الحاجة. إذا كنت تريد تجديدها يدوياً، فاستخدم أحد الأمثلة التالية لتحديث الشهادة:

هام

  • إذا كانت الشهادة الحالية لا تزال صالحة، فاستخدم renew=True (SDK) أو --ssl-renew (CLI) لفرض التكوين لتجديدها. ستستغرق هذه العملية حوالي 5 ساعات حتى تسري.
  • عندما تم توزيع الخدمة في الأصل، يتم استخدام leaf_domain_label لإنشاء اسم DNS باستخدام النمط <leaf-domain-label>######.<azure-region>.cloudapp.azure.com. للاحتفاظ بالاسم الحالي (بما في ذلك الأرقام الستة التي تم إنشاؤها في الأصل)، استخدم القيمة الأصلية leaf_domain_label. لا تقم بتضمين الأرقام الستة التي تم إنشاؤها.

استخدام SDK

from azureml.core.compute import AksCompute
from azureml.core.compute.aks import AksUpdateConfiguration
from azureml.core.compute.aks import SslConfiguration

# Get the existing cluster
aks_target = AksCompute(ws, clustername)

# Update the existing certificate by referencing the leaf domain label
ssl_configuration = SslConfiguration(leaf_domain_label="myaks", overwrite_existing_domain=True, renew=True)
update_config = AksUpdateConfiguration(ssl_configuration)
aks_target.update(update_config)

استخدام CLI

ينطبق على:ملحق Azure CLI ml الإصدار 1

az ml computetarget update aks -g "myresourcegroup" -w "myresourceworkspace" -n "myaks" --ssl-leaf-domain-label "myaks" --ssl-overwrite-domain True --ssl-renew

لمزيد من المعلومات، راجع المستندات المرجعية التالية:

تحديث الشهادة المخصصة

إذا تم إنشاء الشهادة في الأصل بواسطة مصادقة الشهادة، فاستخدم الخطوات التالية:

  1. استخدم الوثائق المقدمة من قبل مصادقة الشهادة لتجديد الشهادة. هذه العملية تنشئ ملفات شهادة جديدة.

  2. استخدم إما SDK أو CLI لتحديث الخدمة بالشهادة الجديدة:

    استخدام SDK

    from azureml.core.compute import AksCompute
    from azureml.core.compute.aks import AksUpdateConfiguration
    from azureml.core.compute.aks import SslConfiguration
    
    # Read the certificate file
    def get_content(file_name):
        with open(file_name, 'r') as f:
            return f.read()
    
    # Get the existing cluster
    aks_target = AksCompute(ws, clustername)
    
    # Update cluster with custom certificate
    ssl_configuration = SslConfiguration(cname="myaks", cert=get_content('cert.pem'), key=get_content('key.pem'))
    update_config = AksUpdateConfiguration(ssl_configuration)
    aks_target.update(update_config)
    

    استخدام CLI

    ينطبق على:ملحق Azure CLI ml الإصدار 1

    az ml computetarget update aks -g "myresourcegroup" -w "myresourceworkspace" -n "myaks" --ssl-cname "myaks"--ssl-cert-file "cert.pem" --ssl-key-file "key.pem"
    

لمزيد من المعلومات، راجع المستندات المرجعية التالية:

تعطيل TLS

لتعطيل TLS لنموذج تم توزيعه في Azure Kubernetes Service، أنشئ SslConfiguration باستخدام status="Disabled"، ثم قم بإجراء تحديث:

from azureml.core.compute import AksCompute
from azureml.core.compute.aks import AksUpdateConfiguration
from azureml.core.compute.aks import SslConfiguration

# Get the existing cluster
aks_target = AksCompute(ws, clustername)

# Disable TLS
ssl_configuration = SslConfiguration(status="Disabled")
update_config = AksUpdateConfiguration(ssl_configuration)
aks_target.update(update_config)

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

ستتعرف على كيفية: