Настройка безопасной сетевой конечной точки с помощью TLS/SSL

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

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

Совет

  • В частности, сетевые конечные точки Kubernetes поддерживают TLS версии 1.2 для Служба Azure Kubernetes (AKS) и Kubernetes с поддержкой Azure Arc.
  • Tls версии 1.3 для вывода Kubernetes Машинного обучения Azure не поддерживается.

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

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

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

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

Ниже в общих чертах описан процесс защиты сетевой конечной точки.

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

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

  3. Настройте TLS или SSL в расширении Машинного обучения Azure.

  4. Обновите DNS с помощью полного доменного имени (FQDN), чтобы указать на конечную точку в сети.

Важно!

Необходимо приобрести собственный сертификат, чтобы получить доменное имя или TLS/SSL-сертификат, а затем настроить их в расширении Машинного обучения Azure. Дополнительные сведения см. в следующих разделах этой статьи.

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

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

Дополнительные сведения о том, как получить IP-адрес сетевых конечных точек, см. в разделе Обновление DNS с помощью полного доменного имени этой статьи.

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

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

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

Примечание

Ключ SSL в PEM-файле с защитой от парольной фразы не поддерживается.

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

Дополнительные сведения о настройке диапазонов IP-адресов с помощью полного доменного имени см. в разделе Обновление DNS с помощью полного доменного имени этой статьи.

Совет

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

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

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

Настройка TLS/SSL в расширении Машинного обучения Azure

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

Во время развертывания расширения allowInsecureConnections Машинного обучения Azure параметр конфигурации имеет значение False по умолчанию. Чтобы обеспечить успешное развертывание расширения, необходимо указать параметр sslSecret конфигурации или сочетание sslKeyPemFile параметров, sslCertPemFile защищенных конфигурацией. В противном случае можно настроить allowInsecureConnections=True поддержку HTTP и отключить завершение TLS.

Примечание

Для поддержки сетевой конечной точки allowInsecureConnections HTTPS необходимо задать значение False.

Чтобы включить конечную точку HTTPS для вывода в режиме реального времени, необходимо предоставить TLS/SSL-сертификат и ключ в кодировке PEM. Существует два способа указать сертификат и ключ во время развертывания расширения Машинного обучения Azure.

  • sslSecret Укажите параметр конфигурации.
  • Укажите сочетание sslCertPemFile параметров и slKeyPemFile параметров, защищенных конфигурацией.

Настройка sslSecret

Мы рекомендуем сохранить сертификат и ключ в секрете Kubernetes в пространстве имен azureml.

Чтобы настроить sslSecret, необходимо сохранить секрет Kubernetes в кластере Kubernetes в azureml пространстве имен для хранения cert.pem (СЕРТИФИКАТ TLS/SSL в кодировке PEM) и key.pem (ключ TLS/SSL в pem-кодировке).

Следующий код является примером определения YAML секрета TLS/SSL:

apiVersion: v1
data:
  cert.pem: <PEM-encoded SSL certificate> 
  key.pem: <PEM-encoded SSL key>
kind: Secret
metadata:
  name: <secret name>
  namespace: azureml
type: Opaque

После сохранения секрета в кластере можно использовать следующую команду Azure CLI, чтобы указать sslSecret в качестве имени секрета Kubernetes. (Эта команда будет работать, только если вы используете AKS.)

   az k8s-extension create --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config inferenceRouterServiceType=LoadBalancer sslSecret=<Kubernetes secret name> sslCname=<ssl cname> --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster

Настройка sslCertPemFile и sslKeyPemFile

Можно указать sslCertPemFile параметр конфигурации в виде пути к файлу сертификата TLS/SSL в pem-кодировке, а sslKeyPemFile параметр конфигурации — путь к файлу ключа TLS/SSL в кодировке PEM.

В следующем примере показано, как использовать Azure CLI для указания PEM-файлов для расширения Машинного обучения Azure, использующего приобретенный сертификат TLS/SSL. В примере предполагается, что вы используете AKS.

   az k8s-extension create --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config enableInference=True inferenceRouterServiceType=LoadBalancer sslCname=<ssl cname> --config-protected sslCertPemFile=<file-path-to-cert-PEM> sslKeyPemFile=<file-path-to-cert-KEY> --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster

Примечание

  • PEM-файл, защищенный парольной фразой, не поддерживается.
  • И sslCertPemFIle используют sslKeyPemFIle параметры, защищенные конфигурацией. Они не настраивают sslSecret и sslCertPemFile/sslKeyPemFile одновременно.

Обновление DNS с помощью полного доменного имени

Для развертывания модели в подключенной конечной точке Kubernetes с настраиваемым сертификатом вам нужно обновить запись DNS, чтобы она указывала на IP-адрес подключенной конечной точки. Этот IP-адрес предоставляет служба маршрутизатора вывода Машинного обучения Azure (azureml-fe). Дополнительные сведения о azureml-feсм. в статье Управляемый маршрутизатор вывода Машинного обучения Azure.

Чтобы обновить запись DNS для личного доменного имени, выполните следующие действия.

  1. Получите IP-адрес сетевой конечной точки из URI оценки, который обычно имеет формат http://104.214.29.152:80/api/v1/service/<service-name>/score. В этом примере это IP-адрес 104.214.29.152.

    После настройки личного доменного имени он заменяет IP-адрес в URI оценки. Для кластеров Kubernetes, использующих LoadBalancer в качестве службы маршрутизатора вывода, azureml-fe предоставляется извне через подсистему балансировки нагрузки поставщика облачных служб и завершение TLS/SSL. IP-адрес сетевой конечной точки Kubernetes — это внешний IP-адрес службы, azureml-fe развернутой в кластере.

    Если вы используете AKS, вы можете получить IP-адрес из портал Azure. Перейдите на страницу ресурса AKS, выберите Служба и входящий трафик, а затем найдите службу azureml-fe в пространстве имен azuerml . Затем ip-адрес можно найти в столбце Внешний IP-адрес .

    Снимок экрана: добавление нового расширения в кластер Kubernetes с поддержкой Azure Arc из портал Azure.

    Кроме того, можно выполнить команду kubectl describe svc azureml-fe -n azureml Kubernetes в кластере, чтобы получить IP-адрес из LoadBalancer Ingress параметра в выходных данных.

    Примечание

    Для кластеров Kubernetes, использующих nodePort или clusterIP в качестве службы маршрутизатора вывода, необходимо настроить собственное решение балансировки нагрузки и завершение TLS/SSL для azureml-fe. Также необходимо получить IP-адрес azureml-fe службы в области кластера.

  2. Используйте инструменты, предоставленные вашим регистратором доменных имен, чтобы обновить запись DNS для доменного имени. Запись сопоставляет полное доменное имя (например, www.contoso.com) с IP-адресом. Запись должна указывать на IP-адрес сетевой конечной точки.

    Совет

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

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

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

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

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

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

  1. Используйте документацию из центра сертификации, чтобы обновить сертификат. Этот процесс создает новые файлы сертификатов.

  2. Обновите расширение Машинного обучения Azure и укажите новые файлы сертификатов с помощью az k8s-extension update команды .

    Если вы использовали секрет Kubernetes для настройки TLS/SSL ранее, необходимо сначала обновить секрет Kubernetes, указав новую конфигурацию cert.pem и key.pem в кластере Kubernetes. Затем выполните команду обновления расширения, чтобы обновить сертификат:

       az k8s-extension update --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config inferenceRouterServiceType=LoadBalancer sslSecret=<Kubernetes secret name> sslCname=<ssl cname> --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster
    

    Если вы непосредственно настроили PEM-файлы в команде развертывания расширения, необходимо выполнить команду обновления расширения и указать путь к новому PEM-файлу:

       az k8s-extension update --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config sslCname=<ssl cname> --config-protected sslCertPemFile=<file-path-to-cert-PEM> sslKeyPemFile=<file-path-to-cert-KEY> --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster
    

Отключение протокола TLS

Чтобы отключить ПРОТОКОЛ TLS для модели, развернутой в Kubernetes, выполните приведенные ниже действия.

  1. Обновите расширение Машинного обучения Azure, указав allowInsercureconnection для свойства значение True.

  2. Удалите параметр конфигурации sslCname вместе с параметрами конфигурации sslSecret или sslPem .

  3. Выполните следующую команду Azure CLI в кластере Kubernetes, а затем выполните обновление. Эта команда предполагает, что вы используете AKS.

       az k8s-extension update --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config enableInference=True inferenceRouterServiceType=LoadBalancer allowInsercureconnection=True --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster
    

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

По умолчанию при развертывании расширения Машинного обучения Azure ожидаются параметры конфигурации для поддержки HTTPS. Мы рекомендуем использовать поддержку HTTP только для целей разработки или тестирования. Параметр allowInsecureConnections=True конфигурации обеспечивает поддержку HTTP.

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

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