Sécuriser vos points de terminaison en ligne managés avec l’isolation réseau

S’APPLIQUE À :Extension Azure CLI v2 (actuelle)Kit de développement logiciel (SDK) Python azure-ai-ml v2 (version actuelle)

Dans cet article, vous allez utiliser l’isolation réseau pour sécuriser un point de terminaison en ligne managé. Vous allez créer un point de terminaison en ligne managé qui utilise le point de terminaison privé d’un espace de travail Azure Machine Learning pour sécuriser les communications entrantes. Vous allez également configurer l’espace de travail avec un réseau virtuel managé qui autorise uniquement les communications sortantes approuvées pour les déploiements. Enfin, vous allez créer un déploiement qui utilise les points de terminaison privés du réseau virtuel managé de l’espace de travail pour la communication sortante.

Pour obtenir des exemples qui utilisent la méthode héritée pour l’isolation réseau, consultez les fichiers de déploiement deploy-moe-vnet-legacy.sh (pour le déploiement à l’aide d’un modèle générique) et deploy-moe-vnet-mlflow-legacy.sh (pour le déploiement à l’aide d’un modèle MLflow) dans le référentiel GitHub azureml-examples.

Prérequis

  • Pour utiliser Azure Machine Learning, vous devez disposer d’un abonnement Azure. Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer. Essayez la version gratuite ou payante d’Azure Machine Learning dès aujourd’hui.

  • Installez et configurez l’interface Azure CLI ainsi que l’extension ml pour l’interface Azure CLI. Pour plus d’informations, consultez Installer, configurer et utiliser l’interface CLI (v2).

    Conseil

    Le réseau virtuel managé Azure Machine Learning a été introduit le 23 mai 2023. Si vous avez une version antérieure de l’extension ml, il est possible que vous deviez la mettre à jour pour que les exemples de cet article fonctionnent. Pour mettre à jour l’extension, utilisez la commande Azure CLI suivante :

    az extension update -n ml
    
  • Les exemples CLI de cet article supposent que vous utilisez le shell Bash (ou un shell compatible). Par exemple, à partir d’un système Linux ou d’un sous-système Windows pour Linux.

  • Vous devez avoir un groupe de ressources Azure dans lequel vous (ou le principal de service que vous utilisez) disposez d’un accès Contributor. Vous disposez d’un tel groupe de ressources si vous avez configuré votre extension ml.

  • Si vous souhaitez utiliser une identité managée affectée par l’utilisateur pour créer et gérer des points de terminaison en ligne et des déploiements en ligne, l’identité doit avoir les autorisations appropriées. Pour plus d’informations sur les autorisations requises, consultez Configurer l’authentification du service. Par exemple, vous devez attribuer l’autorisation RBAC appropriée pour Azure Key Vault sur l’identité.

Migrer d’une ancienne méthode d’isolation du réseau vers un réseau virtuel géré par l’espace de travail

Si vous avez précédemment utilisé la méthode héritée pour l’isolation réseau de points de terminaison en ligne managés et que vous souhaitez migrer en utilisant un réseau virtuel managé d’espace de travail pour sécuriser vos points de terminaison, vous pouvez suivre ces étapes :

  1. Créez un espace de travail et activez le réseau virtuel managé. Pour obtenir plus d’informations sur la façon de configurer un réseau managé pour votre espace de travail, consultez Isolation de réseau virtuel managé par l’espace de travail.
  2. (Facultatif) Sur le paramètre réseau de l’espace de travail, ajoutez des règles de trafic sortant avec le type de points de terminaison privés si vos déploiements doivent accéder à des ressources privées supplémentaires, autres que le compte de stockage, Azure Key Vault et Azure Container Registry (ACR) associé à l’espace de travail (qui sont ajoutés par défaut).
  3. (Facultatif) Si vous envisagez d’utiliser des registres Azure Machine Learning, configurez des points de terminaison privés pour la communication sortante vers votre registre, son compte de stockage et son Azure Container Registry.
  4. Créez des points de terminaison / déploiements en ligne dans le nouvel espace de travail. Vous pouvez tirer parti des registres Azure Machine Learning pour les déployer directement à partir d’eux. Si vous souhaitez obtenir plus d’informations, consultez Déployer à partir du registre.
  5. Mettez à jour les applications appelant des points de terminaison pour utiliser les URI de scoring des nouveaux points de terminaison en ligne.
  6. Supprimez les points de terminaison en ligne de l’ancien espace de travail après la validation.

Si vous n’avez pas besoin de conserver des calculs ou de conserver des points de terminaison et des déploiements en ligne dans l’ancien espace de travail pour servir sans temps d’arrêt, vous pouvez simplement supprimer tous les calculs de l’espace de travail existant et mettre à jour l’espace de travail pour activer le réseau virtuel géré par l’espace de travail.

Limites

  • L’indicateur v1_legacy_mode doit être désactivé (false) sur votre espace de travail Azure Machine Learning. Si cet indicateur est activé, vous ne pourrez pas créer de point de terminaison en ligne managé. Pour plus d’informations, consultez Isolement réseau avec l’API v2.

  • Si votre espace de travail Azure Machine Learning a un point de terminaison privé qui a été créé avant le 24 mai 2022, vous devez recréer le point de terminaison privé de l’espace de travail avant de configurer vos points de terminaison en ligne pour utiliser un point de terminaison privé. Pour plus d’informations sur la création d’un point de terminaison privé pour votre espace de travail, consultez Guide pratique pour configurer un point de terminaison privé pour un espace de travail Azure Machine Learning.

    Conseil

    Pour confirmer la création d’un espace de travail, vous pouvez vérifier les propriétés de l’espace de travail.

    Dans Studio, accédez à la Directory + Subscription + Workspace section (en haut à droite de Studio) et sélectionnez View all properties in Azure Portal. Sélectionnez la vue JSON en haut à droite de la page « Vue d’ensemble », puis choisissez la dernière version de l’API. À partir de cette page, vous pouvez case activée la valeur de properties.creationTime.

    Vous pouvez également utiliser az ml workspace show avec l’interface CLI, my_ml_client.workspace.get("my-workspace-name") avec le Kit de développement logiciel (SDK) ou curl sur un espace de travail avec l’API REST.

  • Lorsque vous utilisez l’isolement réseau avec des points de terminaison en ligne, vous pouvez utiliser des ressources associées à l’espace de travail (Azure Container Registry (ACR), compte de stockage, Key Vault et Application Insights) depuis un groupe de ressources différent de celui de votre espace de travail. Toutefois, ces ressources doivent appartenir aux mêmes abonnement et locataire que votre espace de travail.

Remarque

L’isolation réseau décrite dans cet article s’applique aux opérations de plan de données, c’est-à-dire aux opérations qui résultent de demandes de scoring (ou de service de modèle). Les opérations de plan de contrôle (telles que les requêtes de création, de mise à jour, de suppression ou de récupération de clés d’authentification) sont envoyées à Azure Resource Manager sur le réseau public.

Préparer votre système

  1. Pour créer les variables d’environnement utilisées dans cet exemple, exécutez les commandes suivantes. Remplacez par le nom <YOUR_WORKSPACE_NAME> à utiliser pour votre espace de travail. Remplacez <YOUR_RESOURCEGROUP_NAME> par le groupe de ressources qui contient votre espace de travail.

    Conseil

    Avant de créer un espace de travail, vous devez créer un groupe de ressources Azure qui va le contenir. Pour plus d’informations, consultez Gérer les groupes de ressources Azure.

    export RESOURCEGROUP_NAME="<YOUR_RESOURCEGROUP_NAME>"
    export WORKSPACE_NAME="<YOUR_WORKSPACE_NAME>"
    
  2. Créer votre espace de travail. Le paramètre -m allow_only_approved_outbound configure un réseau virtuel managé pour l’espace de travail et bloque le trafic sortant, sauf vers les destinations approuvées.

    az ml workspace create -g $RESOURCEGROUP_NAME -n $WORKSPACE_NAME -m allow_only_approved_outbound
    

    Sinon, si vous souhaitez autoriser le déploiement à envoyer du trafic sortant vers Internet, supprimez les marques de commentaire du code suivant et exécutez-le à la place.

    # az ml workspace create -g $RESOURCEGROUP_NAME -n $WORKSPACE_NAME -m allow_internet_outbound
    

    Pour plus d’informations sur la création d’un espace de travail ou la mise à niveau de votre espace de travail existant pour utiliser un réseau virtuel géré, consultez Configurer un réseau virtuel managé pour autoriser les sorties Internet.

    Lorsque l’espace de travail est configuré avec un point de terminaison privé, l’Azure Container Registry pour l’espace de travail doit être configuré pour le niveau Premium pour autoriser l’accès via le point de terminaison privé. Pour plus d’informations, consultez Niveaux de service pour Azure Container Registry. En outre, l’espace de travail doit être défini avec la propriété image_build_compute, car la création du déploiement implique la création d’images. Pour plus d’informations, consultez Configurer les builds d’images.

    Important

    Lorsque le réseau virtuel géré par l’espace de travail est configuré pour la première fois pour un espace de travail, le réseau n’est pas encore approvisionné. Avant de continuer à créer des déploiements en ligne, provisionnez le réseau en suivant les instructions d’approvisionnement manuel d’un réseau managé. La création de déploiements en ligne sera rejetée jusqu’à ce que le réseau managé soit approvisionné.

  3. Configurez les valeurs par défaut pour l’interface CLI afin d’éviter de transmettre plusieurs fois les valeurs de votre espace de travail et de votre groupe de ressources.

    az configure --defaults workspace=$WORKSPACE_NAME group=$RESOURCEGROUP_NAME
    
  4. Clonez le référentiel d’exemples pour obtenir les exemples de fichiers pour le point de terminaison et le déploiement, puis accédez au répertoire du dépôt /cli.

    git clone --depth 1 https://github.com/Azure/azureml-examples
    cd /cli
    

Les commandes de ce tutoriel se trouvent dans le fichier deploy-managed-online-endpoint-workspacevnet.sh du répertoire cli, tandis que les fichiers de configuration YAML se trouvent dans le sous-répertoire endpoints/online/managed/sample/.

Créer un point de terminaison en ligne managé sécurisé

Pour créer un point de terminaison en ligne managé sécurisé, créez le point de terminaison dans votre espace de travail et définissez le point de terminaison public_network_access sur disabledpour contrôler la communication entrante. Le point de terminaison doit ensuite utiliser le point de terminaison privé de l’espace de travail pour la communication entrante.

Étant donné que l’espace de travail est configuré pour avoir un réseau virtuel managé, tous les déploiements du point de terminaison utilisent les points de terminaison privés du réseau virtuel managé pour la communication sortante.

  1. Définissez le nom du point de terminaison.

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    
  2. Créez un point de terminaison avec public_network_access désactivé pour bloquer le trafic entrant.

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml --set public_network_access=disabled
    

    Si vous désactivez l’accès au réseau public pour le point de terminaison, la seule façon d’appeler le point de terminaison consiste à utiliser un point de terminaison privé, qui peut accéder à l’espace de travail, dans votre réseau virtuel. Pour plus d’informations, consultez Sécuriser les requêtes de scoring entrantes et Configurer un point de terminaison privé pour un espace de travail Azure Machine Learning.

    Sinon, si vous souhaitez autoriser le point de terminaison à recevoir des demandes de scoring à partir d’Internet, supprimez les marques de commentaire du code suivant et exécutez-le à la place.

    # az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
    
  3. Créez un déploiement dans le réseau virtuel géré par l’espace de travail.

    az ml online-deployment create --name blue --endpoint $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment.yml --all-traffic
    
  4. Obtenez l’état du déploiement.

    az ml online-endpoint show -n $ENDPOINT_NAME
    
  5. Testez le point de terminaison avec une demande de scoring, à l’aide de l’interface CLI.

    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
    
  6. Obtenir les journaux de déploiement.

    az ml online-deployment get-logs --name blue --endpoint $ENDPOINT_NAME
    
  7. Supprimez le point de terminaison si vous n’en avez plus besoin.

    az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait
    
  8. Supprimez toutes les ressources créées dans cet article. Remplacez <resource-group-name> par le nom du groupe de ressources qui est utilisé dans cet exemple :

    az group delete --resource-group <resource-group-name>
    

Résolution des problèmes

Échec de la création du point de terminaison en ligne avec un message V1LegacyMode == true

Vous pouvez configurer l’espace de travail Azure Machine Learning pour v1_legacy_mode, ce qui désactive les API v2. Les points de terminaison en ligne managés sont une fonctionnalité de la plateforme d’API v2 et ne fonctionnent pas si vous activez v1_legacy_mode pour l’espace de travail.

Pour désactiver v1_legacy_mode, consultez Isolement réseau avec v2.

Important

Contactez votre équipe de sécurité du réseau avant de désactiver v1_legacy_mode, car elle peut l’avoir activé pour une raison spécifique.

Échec de la création d’un point de terminaison en ligne avec l’authentification basée sur une clé

Utilisez la commande suivante pour répertorier les règles réseau du coffre de clés Azure pour votre espace de travail. Remplacez <keyvault-name> par le nom de votre coffre de clés :

az keyvault network-rule list -n <keyvault-name>

Cette commande retourne une réponse similaire au code JSON suivant :

{
    "bypass": "AzureServices",
    "defaultAction": "Deny",
    "ipRules": [],
    "virtualNetworkRules": []
}

Si bypass n’a pas la valeur AzureServices, suivez les conseils donnés dans Configurer les paramètres réseau du coffre de clés pour lui affecter la valeur AzureServices.

Échec des déploiements en ligne avec une erreur de téléchargement d’image

Remarque

Ce problème s’applique lorsque vous utilisez la méthode d’isolation réseau héritée pour les points de terminaison en ligne managés, dans laquelle Azure Machine Learning crée un réseau virtuel managé pour chaque déploiement sous un point de terminaison.

  1. Vérifiez si l’indicateur egress-public-network-access est disabled pour le déploiement. Si cet indicateur est activé et que la visibilité du registre de conteneurs est privée, cet échec est attendu.

  2. Utilisez la commande suivante pour vérifier l’état de la connexion au point de terminaison privé. Remplacez <registry-name> par le nom du registre de conteneurs Azure de votre espace de travail :

    az acr private-endpoint-connection list -r <registry-name> --query "[?privateLinkServiceConnectionState.description=='Egress for Microsoft.MachineLearningServices/workspaces/onlineEndpoints'].{Name:name, status:privateLinkServiceConnectionState.status}"
    

    Dans le code de réponse, vérifiez que le champ status a la valeur Approved. Dans le cas contraire, utilisez la commande suivante pour l’approuver. Remplacez <private-endpoint-name> par le nom retourné par la commande précédente.

    az network private-endpoint-connection approve -n <private-endpoint-name>
    

Impossible de résoudre le point de terminaison de scoring

  1. Vérifiez que le client qui émet la requête de scoring est un réseau virtuel ayant accès à l’espace de travail Azure Machine Learning.

  2. Utilisez la commande nslookup sur le nom d’hôte du point de terminaison pour récupérer les informations d’adresse IP, par exemple :

    nslookup endpointname.westcentralus.inference.ml.azure.com
    

    La réponse contient une adresse qui doit se trouver dans la plage fournie par le réseau virtuel.

    Remarque

    • Pour le point de terminaison en ligne Kubernetes, le nom d’hôte du point de terminaison doit être le CName (nom de domaine) spécifié dans votre cluster Kubernetes.
    • Si le point de terminaison est HTTP, l’adresse IP est contenue dans l’URI du point de terminaison que vous pouvez obtenir directement dans l’interface utilisateur de studio.
    • Vous trouverez d’autres façons d’obtenir l’adresse IP du point de terminaison dans Sécuriser le point de terminaison en ligne Kubernetes.
  3. Si la commande nslookup ne résout pas le nom d’hôte, prenez les mesures suivantes :

Points de terminaison en ligne managés

  1. Utilisez la commande suivante pour vérifier qu’un enregistrement A existe dans la zone DNS (Domain Name System) pour le réseau virtuel.

    az network private-dns record-set list -z privatelink.api.azureml.ms -o tsv --query [].name
    

    Les résultats doivent contenir une entrée similaire à *.<GUID>.inference.<region>.

  2. Si aucune valeur d’inférence n’est retournée, supprimez le point de terminaison privé de l’espace de travail, puis recréez-le. Pour plus d’informations, consultez Guide pratique pour configurer un point de terminaison privé.

  3. Si l’espace de travail avec un point de terminaison privé utilise un serveur DNS personnalisé, exécutez la commande suivante pour vérifier que la résolution du DNS personnalisé fonctionne correctement.

dig endpointname.westcentralus.inference.ml.azure.com

Points de terminaison en ligne Kubernetes

  1. Vérifiez la configuration DNS dans le cluster Kubernetes.

  2. De plus, vérifiez si azureml-fe fonctionne comme prévu, en utilisant la commande suivante :

    kubectl exec -it deploy/azureml-fe -- /bin/bash
    (Run in azureml-fe pod)
    
    curl -vi -k https://localhost:<port>/api/v1/endpoint/<endpoint-name>/swagger.json
    "Swagger not found"
    

    Pour HTTP, utilisez la commande suivante :

     curl https://localhost:<port>/api/v1/endpoint/<endpoint-name>/swagger.json
    "Swagger not found"
    
  3. Si les connexions HTTP via curl sont défaillantes, ou s’il existe un dépassement du délai d’expiration alors que la connexion HTTP fonctionne, vérifiez que le certificat est valide.

  4. Si le processus précédent ne parvient pas à résoudre en enregistrement A, vérifiez si la résolution fonctionne à partir d’Azure DNS (168.63.129.16).

    dig @168.63.129.16 endpointname.westcentralus.inference.ml.azure.com
    
  5. Si la commande précédente réussit, vous pouvez résoudre des problèmes de redirecteur conditionnel pour la liaison privée sur le DNS personnalisé.

Les déploiements en ligne ne peuvent pas faire l’objet d’un scoring

  1. Exécutez la commande suivante pour voir si le déploiement a été correct :

    az ml online-deployment show -e <endpointname> -n <deploymentname> --query '{name:name,state:provisioning_state}' 
    

    Si le déploiement a réussi, la valeur de state est Succeeded.

  2. Si le déploiement a réussi, utilisez la commande suivante pour vérifier que le trafic est affecté au déploiement. Remplacez <endpointname> par le nom de votre point de terminaison.

    az ml online-endpoint show -n <endpointname>  --query traffic
    

    La réponse de cette commande doit indiquer le pourcentage du trafic affecté aux déploiements.

    Conseil

    Cette étape n’est pas nécessaire si vous utilisez l’en-tête azureml-model-deployment dans votre requête pour cibler ce déploiement.

  3. Si les affectations de trafic (ou l’en-tête de déploiement) sont définies correctement, utilisez la commande suivante pour obtenir les journaux d’activité du point de terminaison. Remplacez <endpointname> par le nom du point de terminaison et <deploymentname> par le déploiement.

    az ml online-deployment get-logs  -e <endpointname> -n <deploymentname> 
    
  4. Passez en revue les journaux pour voir s’il existe un problème d’exécution du code de scoring lorsque vous envoyez une requête au déploiement.

Étapes suivantes