Configurer un point de terminaison en ligne sécurisé avec TLS/SSL

Cet article vous explique comment sécuriser un point de terminaison en ligne sécurisé Kubernetes crée par le biais d’Azure Machine Learning.

Vous utilisez HTTPS pour restreindre l’accès aux points de terminaison en ligne et sécuriser les données soumises par les clients. HTTPS chiffre les communications entre un client et un point de terminaison en ligne à l’aide du protocole TLS. TLS est encore parfois appelé SSL (Secure Sockets Layer), qui était son prédécesseur.

Conseil

  • Plus précisément, les points de terminaison en ligne Kubernetes prennent en charge la version 1.2 de TLS pour AKS (Azure Kubernetes Service) et Kubernetes avec Azure Arc.
  • La version 1.3 de TLS pour l’inférence Kubernetes d’Azure Machine Learning n’est pas prise en charge.

TLS et SSL s'appuient tous deux sur des certificats numériques qui facilitent le chiffrement et la vérification d'identité. Pour plus d’informations sur le fonctionnement des certificats numériques, consultez l'article Wikipédia Infrastructure_à_clé_publique.

Avertissement

Si vous n’utilisez pas HTTPS pour vos points de terminaison en ligne, les données envoyées vers et depuis le service peuvent être visibles par d'autres personnes sur Internet.

HTTPS permet également au client de vérifier l’authenticité du serveur auquel il se connecte. Cette fonctionnalité protège les clients des attaques de l'intercepteur.

L’élément suivant est le processus général de sécurisation d’un point de terminaison en ligne :

  1. Obtenez un nom de domaine.

  2. Obtenez un certificat numérique.

  3. Configurez TLS/SSL dans l’extension Azure Machine Learning.

  4. Mettez à jour votre DNS avec un nom de domaine complet (FQDN) pour qu’il pointe vers le point de terminaison en ligne.

Important

Vous devez acheter votre propre certificat pour obtenir un nom de domaine ou un certificat TLS/SSL, puis les configurer dans l’extension Azure Machine Learning. Pour plus d’informations, consultez les sections suivantes de cet article.

Obtenir un nom de domaine

Si vous ne possédez pas de nom de domaine, achetez-en-un auprès d’un bureau d’enregistrement de noms de domaine. Le processus et le prix varient selon les bureaux d’enregistrement. Le bureau d’enregistrement propose des outils pour gérer le nom de domaine. Vous utilisez ces outils pour mapper un FQDN (par exemple, www.contoso.com) à l’adresse IP qui héberge votre point de terminaison en ligne.

Pour plus d’informations sur la manière d’obtenir l’adresse IP de vos points de terminaison en ligne, consultez la section Mettre à jour votre DNS avec un nom de domaine complet de cet article.

Obtenir un certificat TLS/SSL

Il existe de nombreuses façons d’obtenir un certificat TLS/SSL (certificat numérique). Le moyen le plus courant consiste à en acheter un auprès d’une autorité de certification. Quel que soit l’endroit où vous obtenez le certificat, vous avez besoin des fichiers suivants :

  • Un certificat contenant la chaîne de certificats complète, codé en PEM
  • Une clé codée en PEM

Notes

Une clé SSL dans un fichier PEM avec une protection par phrase secrète n’est pas prise en charge.

Lorsque vous demandez un certificat, vous devez fournir le nom de domaine complet (FQDN) de l’adresse que vous envisagez d’utiliser pour le point de terminaison en ligne (par exemple, www.contoso.com). L’adresse estampillée sur le certificat et l’adresse utilisée par les clients sont comparées pour vérifier l’identité du point de terminaison. Si ces adresses ne correspondent pas, le client reçoit un message d’erreur.

Pour plus d’informations sur la manière de configurer la bande IP avec un nom de domaine complet, consultez la section Mettre à jour votre DNS avec un nom de domaine complet de cet article.

Conseil

Si l’autorité de certification ne peut pas fournir le certificat et la clé sous forme de fichiers PEM, vous pouvez utiliser un outil tel qu’OpenSSL pour modifier le format.

Avertissement

Utilisez les certificats auto-signés uniquement pour le développement. Ne les utilisez pas dans des environnements de production. Les certificats autosignés peuvent entraîner des problèmes dans vos applications clientes. Pour plus d’informations, consultez la documentation relative aux bibliothèques réseau que votre application cliente utilise.

Configurer TLS/SSL dans l’extension Azure Machine Learning

Pour un point de terminaison en ligne Kubernetes qui est configuré pour utiliser le protocole HTTPS d’inférence pour les connexions sécurisées, vous pouvez activer la terminaison TLS avec les paramètres de configuration de déploiement quand vous déployez l’extension Azure Machine Learning dans un cluster Kubernetes.

Au moment du déploiement de l’extension Azure Machine Learning, le paramètre de configuration allowInsecureConnections est False par défaut. Pour réussir le déploiement de l’extension, vous devez spécifier le paramètre de configuration sslSecret ou une combinaison des paramètres protégés par la configuration sslKeyPemFile et sslCertPemFile. Vous pouvez également définir allowInsecureConnections=True pour prendre en charge HTTP et désactiver la terminaison TLS.

Notes

Pour prendre en charge le point de terminaison en ligne HTTPS, allowInsecureConnections doit être défini sur False.

Pour activer un point de terminaison HTTPS pour l’inférence en temps réel, vous devez fournir un certificat TLS/SSL codé en PEM et une clé. Il existe deux façons de spécifier le certificat et la clé au moment du déploiement de l’extension Azure Machine Learning :

  • Spécifiez le paramètre de configuration sslSecret.
  • Spécifiez une combinaison des paramètres protégés par la configuration sslCertPemFile et slKeyPemFile.

Configurez sslSecret

La bonne pratique consiste à enregistrer le certificat et la clé dans un secret Kubernetes dans l’espace de noms azureml.

Pour configurer sslSecret, vous devez enregistrer un secret Kubernetes dans votre cluster Kubernetes dans l’espace de noms azureml pour stocker cert.pem (certificat TLS /SSL codé en PEM) et key.pem (clé TLS/SSL codée en PEM).

Le code suivant est un exemple de définition YAML d’un secret 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

Après avoir enregistré le secret dans votre cluster, vous pouvez utiliser la commande Azure CLI suivante pour spécifier sslSecret comme nom de ce secret Kubernetes. (Cette commande fonctionne uniquement si vous utilisez 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

Configurez sslCertPemFile et sslKeyPemFile

Vous pouvez spécifier le paramètre de configuration sslCertPemFile comme chemin du fichier de certificat TLS/SSL codé en PEM et le paramètre de configuration sslKeyPemFile comme chemin du fichier de clé TLS/SSL codée en PEM.

L’exemple suivant montre comment utiliser Azure CLI pour spécifier des fichiers .PEM pour l’extension Azure Machine Learning, qui utilise un certificat TLS/SSL que vous avez acheté. L’exemple suppose que vous utilisez 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

Notes

  • Un fichier PEM avec protection par phrase secrète n’est pas pris en charge.
  • sslCertPemFIle et sslKeyPemFIle utilisent des paramètres protégés par la configuration. Ils ne configurent pas sslSecret et sslCertPemFile/sslKeyPemFile en même temps.

Mettre à jour votre DNS avec un nom de domaine complet

Pour le déploiement de modèle sur un point de terminaison en ligne Kubernetes avec un certificat personnalisé, vous devez mettre à jour votre enregistrement DNS pour qu’il pointe vers l’adresse IP du point de terminaison en ligne. Le service de routeur d’inférence Azure Machine Learning (azureml-fe) fournit cette adresse IP. Pour plus d’informations sur azureml-fe, consultez Routeur d’inférence Azure Machine Learning managé.

Pour mettre à jour l’enregistrement DNS pour votre nom de domaine personnalisé :

  1. Obtenez l’adresse IP du point de terminaison en ligne à partir de l’URI de scoring, qui est généralement au format http://104.214.29.152:80/api/v1/service/<service-name>/score. Dans cet exemple, l’adresse IP est 104.214.29.152.

    Quand vous avez configuré votre nom de domaine personnalisé, celui-ci remplace l’adresse IP dans l’URI de scoring. Pour les clusters Kubernetes qui utilisent LoadBalancer comme service de routeur d’inférence, azureml-fe est exposé en externe par le biais de la terminaison TLS/SSL et de l’équilibreur de charge d’un fournisseur de cloud. L’adresse IP du point de terminaison en ligne Kubernetes est l’adresse IP externe du service azureml-fe déployé dans le cluster.

    Si vous utilisez AKS, vous pouvez obtenir l’adresse IP à partir du portail Azure. Rendez-vous sur la page de votre ressource AKS, accédez aux services et entrées, puis recherchez le service azureml-fe sous l’espace de noms azuerml. Vous trouverez alors l’adresse IP dans la colonne Adresse IP externe.

    Capture d’écran illustrant l’ajout d’une nouvelle extension au cluster Kubernetes avec Azure Arc à partir du portail Azure.

    En outre, vous pouvez exécuter la commande Kubernetes kubectl describe svc azureml-fe -n azureml dans votre cluster pour obtenir l’adresse IP à partir du paramètre LoadBalancer Ingress dans la sortie.

    Notes

    Pour les clusters Kubernetes qui utilisent nodePort ou clusterIP comme service de routeur d’inférence, vous devez configurer votre propre solution d’équilibrage de charge et votre propre terminaison TLS/SSL pour azureml-fe. Vous devez également obtenir l’adresse IP du service azureml-fe dans l’étendue du cluster.

  2. Utilisez les outils de votre bureau d’enregistrement de noms de domaine pour mettre à jour l’enregistrement DNS pour votre nom de domaine. L’enregistrement mappe le nom de domaine complet (par exemple, www.contoso.com) à l’adresse IP. L’enregistrement doit pointer vers l’adresse IP du point de terminaison en ligne.

    Conseil

    Microsoft n’est pas responsable de la mise à jour du DNS pour votre certificat ou nom DNS personnalisé. Vous devez le mettre à jour avec votre bureau d’enregistrement de noms de domaine.

  3. Après la mise à jour de l’enregistrement DNS, vous pouvez valider la résolution DNS à l’aide de la commande nslookup custom-domain-name. Si l’enregistrement DNS est correctement mis à jour, le nom de domaine personnalisé pointe alors vers l’adresse IP du point de terminaison en ligne.

    Selon le bureau d’enregistrement et la durée de vie (TTL) configurée pour le nom de domaine, les clients peuvent avoir à patienter quelques minutes voire plusieurs heures avant de pouvoir résoudre le nom de domaine.

Pour plus d’informations sur la résolution DNS avec Azure Machine Learning, consultez Utilisation de votre espace de travail avec un serveur DNS personnalisé.

Mettre à jour le certificat TLS/SSL

Les certificats TLS/SSL expirent et doivent être renouvelés. En général, cela se produit chaque année. Utilisez les informations fournies dans les étapes suivantes pour mettre à jour et renouveler votre certificat pour les modèles déployés sur Kubernetes (AKS et Kubernetes avec Azure Arc) :

  1. Utilisez la documentation de l’autorité de certification pour renouveler le certificat. Ce processus crée de nouveaux fichiers de certificat.

  2. Mettez à jour votre extension Azure Machine Learning et spécifiez les nouveaux fichiers de certificat à l’aide de la commande az k8s-extension update.

    Si vous aviez déjà utilisé un secret Kubernetes pour configurer TLS/SSL, vous devez d’abord mettre à jour le secret Kubernetes avec la nouvelle configuration de cert.pem et key.pem dans votre cluster Kubernetes. Exécutez ensuite la commande de mise à jour de l’extension pour mettre à jour le certificat :

       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
    

    Si vous aviez déjà configuré directement les fichiers PEM dans la commande de déploiement d’extension, vous devez exécuter la commande de mise à jour de l’extension et spécifier le nouveau chemin des fichiers 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
    

Désactiver le protocole TLS

Pour désactiver TLS pour un modèle déployé sur Kubernetes :

  1. Mettez à jour l’extension Azure Machine Learning avec allowInsercureconnection défini sur True.

  2. Supprimez le paramètre de configuration sslCname et le paramètre de configuration sslSecret ou sslPem.

  3. Exécutez la commande Azure CLI suivante dans votre cluster Kubernetes, puis effectuez une mise à jour. Cette commande suppose que vous utilisez 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
    

Avertissement

Par défaut, le déploiement de l’extension Azure Machine Learning attend des paramètres de configuration pour la prise en charge de HTTPS. Nous recommandons la prise en charge de HTTP uniquement à des fins de développement ou de test. Le paramètre de configuration allowInsecureConnections=True permet la prise en charge de HTTP.

Étapes suivantes

Découvrez comment :