Использование TLS для защиты веб-службы с помощью Машинного обучения Azure.

ОБЛАСТЬ ПРИМЕНЕНИЯ:Пакет SDK для Python azureml версии 1

В этой статье описано, как защитить веб-службу, развернутую с помощью Машинного обучения Azure.

Протокол HTTPS используется для ограничения доступа к веб-службам и защиты данных, отправляемых клиентами. Протокол HTTPS обеспечивает безопасность обмена данными между клиентом и веб-службой путем шифрования обмена данными между ними. Для шифрования используется протокол TLS. Протокол TLS иногда по-прежнему называется SSL (предшественник TLS).

Совет

В пакете SDK для Машинного обучения Azure используется термин "SSL" для свойств, связанных с безопасным обменом данными. Это не означает, что веб-служба не использует TLS. Просто SSL — это более распространенный термин.

В частности, веб-службы, развернутые с помощью Машинного обучения Azure, поддерживают TLS версии 1.2 для AKS и ACI. Для развертываний ACI, если вы используете более старую версию TLS, мы рекомендуем повторно выполнить развертывание, чтобы получить последнюю версию TLS.

TLS версии 1.3 для Машинного обучения Azure — вывод AKS не поддерживается.

Протоколы TLS и SSL используют цифровые сертификаты, которые помогают в шифровании и проверке личности. Дополнительные сведения о работе цифровых сертификатов см. в статье об инфраструктуре открытых ключей в Википедии.

Предупреждение

Если для веб-службы не используется протокол HTTPS, данные, отправляемые в службу и из нее, могут быть видны другим пользователям в Интернете.

HTTPS также позволяет клиенту проверять подлинность сервера, к которому он подключается. Эта функция защищает клиентов от атак типа "злоумышленник в середине".

Это общий процесс защиты веб-службы:

  1. Получите имя домена.

  2. Получите цифровой сертификат.

  3. Разверните веб-службу с включенным протоколом TLS или обновите ее для включения этого протокола.

  4. Обновите имя DNS, чтобы оно указывало на веб-службу.

Важно!

При развертывании в службе Azure Kubernetes Service (AKS) можно приобрести собственный сертификат или использовать сертификат, предоставляемый корпорацией Майкрософт. Если вы используете сертификат от корпорации Майкрософт, вам не нужно получать имя домена или TLS/SSL-сертификат. Дополнительные сведения см. в разделе Включение TLS и развертывание в этой статье.

Существуют небольшие отличия при обеспечении безопасности в зависимости от целевых объектов развертывания.

Важно!

Для использования некоторых команд Azure CLI, приведенных в этой статье, используйте расширение azure-cli-ml (версия 1) для Машинного обучения Azure. Поддержка расширения версии 1 будет прекращена 30 сентября 2025 г. Вы можете установить и использовать расширение версии 1 до этой даты.

Рекомендуется перейти на расширение ml (версия 2) до 30 сентября 2025 г. Дополнительные сведения о расширении версии 2 см. на странице расширения CLI для Azure ML и пакета SDK для Python версии 2.

Получение доменного имени

Если у вас еще нет доменного имени, то его можно приобрести у регистратора доменных имен. Процесс и цена отличаются в зависимости от регистратора. Регистратор предоставляет средства для управления доменным именем. Эти средства используются для сопоставления полного доменного имени (например, www.contoso.com) с IP-адресом, на котором размещена веб-служба.

Получение сертификата TLS/SSL

Существует много способов получить сертификат TLS/SSL (цифровой сертификат). Наиболее распространенным является покупка в одном из центров сертификации (ЦС). Независимо от того, где вы получаете сертификат, вам нужны следующие файлы:

  • Сертификат. Сертификат должен содержать полную цепочку сертификатов и должен быть в кодировке PEM.
  • Ключ. Ключ тоже должен быть в кодировке PEM.

При запросе сертификата необходимо указать полное доменное имя адреса, который планируется использовать для веб-службы (например, www.contoso.com). Адрес, указанный в сертификате, и адрес, используемый клиентами, сравниваются при проверке удостоверения веб-службы. Если эти адреса не совпадают, клиент получает сообщение об ошибке.

Совет

Если центр сертификации не может предоставить сертификат и ключ в виде файлов в кодировке PEM, вы можете использовать такую служебную программу, как OpenSSL, чтобы изменить формат.

Предупреждение

Используйте самозаверяющие сертификаты только для разработки. Не используйте их в рабочих средах. Самозаверяющие сертификаты могут вызвать проблемы в клиентских приложениях. Дополнительные сведения см. в документации для сетевых библиотек, используемых в клиентском приложении.

Включение TLS и развертывание

Для развертывания AKS можно включить завершение TLS при создании или подключении кластера AKS в рабочей области Машинного обучения Azure. Во время развертывания модели AKS можно отключить завершение сеанса TLS с помощью объекта конфигурации развертывания. В противном случае для всех развертываний моделей AKS по умолчанию будет включено завершение сеанса TLS во время создания или присоединения кластера AKS.

Для развертывания ACI можно включить завершение сеанса TLS во время развертывания модели с помощью объекта конфигурации развертывания.

Развертывание в Службе Azure Kubernetes

Примечание

Сведения в этом разделе также применяются при развертывании безопасной веб-службы для конструктора. Если вы не знакомы с использованием пакета SDK для Python, см. статью Что собой представляет пакет SDK службы "Машинное обучение Azure"для Python?.

При создании или подключении кластера AKS в рабочей области Машинного обучения Azure можно включить завершение TLS с помощью объектов конфигурации AksCompute.provisioning_configuration() и AksCompute.attach_configuration( ). Оба варианта возвращают объект конфигурации, содержащий метод enable_ssl, и для включения TLS можно использовать метод enable_ssl.

TLS можно включить с помощью сертификата Майкрософт или пользовательского сертификата, приобретенного в центре сертификации.

  • При использовании сертификата от Майкрософт необходимо использовать параметр leaf_domain_label. Этот параметр создает DNS-имя для службы. Например, значение contoso создает доменное имя contoso<шесть-случайных-символов>.<регион-azure>.cloudapp.azure.com, где <регион-azure> — это регион, содержащий службу. При необходимости можно использовать параметр overwrite_existing_domain для перезаписи существующего leaf_domain_label. В следующем примере показано, как создать конфигурацию, которая включает TLS с сертификатом Майкрософт:

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

    Важно!

    При использовании сертификата от Майкрософт вам не нужно приобретать собственный сертификат или доменное имя.

  • При использовании приобретенного пользовательского сертификата используются параметры 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

При развертывании в службе "Экземпляры контейнеров Azure" вы предоставляете значения для параметров, связанных с 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-адрес конечной точки оценки.

Важно!

При использовании сертификата от Майкрософт для развертывания 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 для доменного имени. Эта запись сопоставляет полное доменное имя (например, www.contoso.com) с IP-адресом. Запись должна указывать на IP-адрес конечной точки оценки.

    Совет

    Корпорация Майкрософт не несет ответственности за обновление DNS для пользовательского DNS-имени или сертификата. Вы должны сами обновить его у регистратора доменных имен.

  3. После обновления записи DNS можно проверить разрешение DNS с помощью команды nslookup custom-domain-name. Если запись DNS обновляется правильно, имя личного домена будет указывать на IP-адрес конечной точки оценки.

    В зависимости от регистратора и срока жизни, настроенного для имени домена, может потребоваться от нескольких минут до нескольких часов, прежде чем клиенты смогут разрешить имя домена.

Дополнительные сведения о разрешении DNS с помощью Машинного обучения Azure см. в статье Использование рабочей области с пользовательским DNS-сервером.

Обновление TLS/SSL-сертификата

Срок действия TLS/SSL-сертификатов истекает, и их необходимо обновлять. Обычно это происходит раз в год. Используйте сведения в следующих разделах, чтобы обновить и продлить сертификат для моделей, развернутых в службе Kubernetes Azure:

Обновление сертификата, созданного Майкрософт

Если сертификат изначально был создан Майкрософт (при использовании leaf_domain_label для создания службы), он будет автоматически продлен при необходимости. Если вы хотите продлить сертификат вручную, используйте один из следующих примеров для обновления сертификата:

Важно!

  • Если существующий сертификат по-прежнему действителен, используйте renew=True (пакет SDK) или --ssl-renew (CLI), чтобы принудительно продлить его. Эта операция войдет в силу около 5 часов.
  • При первоначальном развертывании службы используется leaf_domain_label для создания DNS-имени с помощью шаблона <leaf-domain-label>######.<azure-region>.cloudapp.azure.com. Чтобы сохранить существующее имя (включая 6 созданных ранее цифр), используйте исходное значение leaf_domain_label. Не включайте созданные 6 цифр.

Использование пакета 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)

Использование интерфейса командной строки

ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ml для Azure CLI версии 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)
    

    Использование интерфейса командной строки

    ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ml для Azure CLI версии 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, создайте 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)

Дальнейшие действия

Вы узнаете, как выполнять следующие задачи: