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 de la méthode d’isolation réseau héritée au réseau virtuel managé

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, suivez ces étapes :

  1. Supprimez tous les calculs dans votre espace de travail.
  2. Activez le réseau virtuel managé dans votre espace de travail. 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.
  3. Configurez des points de terminaison privés pour les communications sortantes dans des ressources privées auxquelles vos points de terminaison en ligne managés doivent accéder. Ces ressources privées incluent un compte de stockage, Azure Key Vault et Azure Container Registry (ACR).
  4. (Facultatif) Si vous effectuez une intégration avec un registre d’utilisateurs, configurez des points de terminaison privés pour les communications sortantes dans votre registre, son compte de stockage et son ACR.

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.

  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

L’espace de travail Azure Machine Learning peut être configuré 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 v1_legacy_mode est activé pour l’espace de travail.

Important

Vérifiez avec votre équipe de sécurité réseau avant de désactiver v1_legacy_mode. Il a peut-être été activé par votre équipe de sécurité réseau pour une certaine raison.

Pour plus d’informations sur la désactivation de v1_legacy_mode, consultez Isolement réseau avec v2.

É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 lister les règles réseau du coffre Azure Key Vault 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 document 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 désactivé pour le déploiement. Si cet indicateur est activé et que la visibilité du registre de conteneurs est privée, cet échec est normal.

  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 Azure Container Registry 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 document de réponse, vérifiez que le champ status a la valeur Approved. S’il n’est pas approuvé, 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 :

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

    La réponse contient une adresse. Cette adresse doit faire partie de la plage fournie par le réseau virtuel

    Notes

    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. S’il s’agit d’un point de terminaison HTTP, l’adresse IP est contenue dans l’URI de point de terminaison, que vous pouvez obtenir directement dans l’IU 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 le nom d’hôte n’est pas résolu par la commande nslookup :

    Pour un point de terminaison en ligne managé,

    1. Vérifiez s’il existe un enregistrement A dans la zone DNS privée du réseau virtuel.

      Pour vérifier les enregistrements, utilisez la commande suivante :

      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 à celle-ci : *.<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é est configuré avec un DNS personnalisé Utilisation de votre espace de travail avec un serveur DNS personnalisé, utilisez la commande suivante pour vérifier si la résolution fonctionne correctement à partir du DNS personnalisé.

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

    Pour un point de terminaison en ligne Kubernetes,

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

    2. De plus, vous pouvez vérifier si azureml-fe fonctionne comme prévu, à l’aide de 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

      curl https://localhost:<port>/api/v1/endpoint/<endpoint-name>/swagger.json
      "Swagger not found"
      

    Si les connexions HTTPS via cURL n’aboutissent pas (dépassement du délai d’expiration, par exemple) mais que les connexions HTTP fonctionnent, vérifiez que le certificat est valide.

    Si cela n’opère pas de résolution 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
    

    Si l’opération réussit, vous pouvez résoudre les 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. Utilisez la commande suivante pour voir si le déploiement a été correctement effectué :

    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 du fichier de votre point de terminaison :

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

    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.

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

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

    Examinez les journaux pour voir s’il y a un problème d’exécution du code de scoring lorsque vous soumettez une requête au déploiement.

Étapes suivantes