Proteggere gli endpoint online gestiti con isolamento rete

SI APPLICA A:estensione ml dell'interfaccia della riga di comando di Azure v2 (corrente)Python SDK azure-ai-ml v2 (corrente)

Nel presente articolo si descrive come utilizzare l'isolamento di rete per proteggere un endpoint online gestito. Verrà creato un endpoint online gestito che si avvale di un endpoint privato di un'area di lavoro di Azure Machine Learning per comunicazioni sicure in ingresso. Inoltre, verrà configurata l'area di lavoro con una rete virtuale gestita che consente solo comunicazioni in uscita approvate per le distribuzioni. Infine, verrà creata una distribuzione che utilizza gli endpoint privati della rete virtuale gestita dell'area di lavoro per le comunicazioni in uscita.

Per esempi che usano il metodo legacy per l'isolamento della rete, vedere i file di distribuzione deploy-moe-vnet-legacy.sh (per la distribuzione con un modello generico) e deploy-moe-vnet-mlflow-legacy.sh (per la distribuzione con un modello MLflow) nel repository GitHub azureml-examples.

Prerequisiti

Per iniziare, è necessario avere una sottoscrizione di Azure, un'interfaccia della riga di comando o un SDK, per interagire con l'area di lavoro di Azure Machine Learning e le entità correlate, oltre che l'autorizzazione appropriata.

  • Per usare Azure Machine Learning, è necessario avere una sottoscrizione di Azure. Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare. Provare la versione gratuita o a pagamento di Azure Machine Learning.

  • Installare e configurare la Interfaccia della riga di comando di Azure e l'estensione ml dell'interfaccia della riga di comando di Azure. Per altre informazioni, vedere Installare, configurare e usare l'interfaccia della riga di comando (v2).

    Suggerimento

    La rete virtuale gestita di Azure Machine Learning è stata introdotta il 23 maggio 2023. Se si ha una versione precedente dell'estensione ml, potrebbe essere necessario aggiornarla affinché gli esempi riportati in questo articolo funzionino. Per aggiornare l'estensione, usare il comando seguente dell'interfaccia della riga di comando di Azure:

    az extension update -n ml
    
  • Gli esempi dell'interfaccia della riga di comando in questo articolo presuppongono l'uso della shell Bash (o compatibile). Ad esempio, di un sistema Linux o sottosistema Windows per Linux.

  • Si deve avere un gruppo di risorse di Azure, al quale l'utente (o l'entità servizio) deve avere l'accesso Contributor. Se l'estensione ml è stata configurata, sarà possibile avere tale gruppo di risorse.

  • Se si desidera usare un'identità gestita assegnata dall'utente per creare e gestire gli endpoint online e le distribuzioni online, l'identità deve disporre delle autorizzazioni appropriate. Per informazioni dettagliate sulle autorizzazioni necessarie, vedere Configurare l'autenticazione del servizio. Ad esempio, è necessario assegnare all'identità l'autorizzazione appropriata di controllo degli accessi in base al ruolo per Azure Key Vault.

Limiti

  • Il flag v1_legacy_mode deve essere disabilitato (false) nell'area di lavoro di Azure Machine Learning. Se è abilitato, non sarà possibile creare un endpoint online gestito. Per altre informazioni, vedere Isolamento di rete con l'API v2.

  • Se l'area di lavoro di Azure Machine Learning ha un endpoint privato creato prima del 24 maggio 2022, è necessario ricreare l'endpoint privato dell'area di lavoro, prima di configurare gli endpoint online per utilizzare un endpoint privato. Per altre informazioni sulla creazione di un endpoint privato per l'area di lavoro, vedere Come configurare un endpoint privato per l'area di lavoro di Azure Machine Learning.

    Suggerimento

    Per verificare la data di creazione di un'area di lavoro, è possibile controllare le proprietà dell'area di lavoro.

    In Studio passare alla sezione Directory + Subscription + Workspace (in alto a destra in Studio), quindi selezionare View all properties in Azure Portal. Selezionare la vista JSON in alto a destra nella pagina "Panoramica", quindi scegliere la versione API più recente. Da questa pagina è possibile controllare il valore di properties.creationTime.

    In alternativa, usare az ml workspace show con CLI, my_ml_client.workspace.get("my-workspace-name") con SDK, o curl in un'area di lavoro con API REST.

  • Quando si usa l'isolamento di rete con gli endpoint online, è possibile usare le risorse associate all'area di lavoro (Registro Azure Container (ACR), l'account di archiviazione, Key Vault e Application Insights) da un gruppo di risorse diverso da quello dell'area di lavoro. Tuttavia, queste risorse devono appartenere alla stessa sottoscrizione e allo stesso tenant dell'area di lavoro.

Nota

L'isolamento di rete descritto in questo articolo si applica alle operazioni del piano dati, ovvero alle operazioni che derivano dalle richieste di punteggio (o dalla gestione del modello). Le operazioni del piano di controllo (ad esempio le richieste di creazione, aggiornamento, eliminazione o recupero delle chiavi di autenticazione) vengono inviate ad Azure Resource Manager tramite la rete pubblica.

Preparare il sistema

  1. Creare le variabili di ambiente usate in questo esempio, eseguendo i comandi seguenti. Sostituire <YOUR_WORKSPACE_NAME> con il nome che si desidera usare per l'area di lavoro. Sostituire <YOUR_RESOURCEGROUP_NAME> con il gruppo di risorse che contiene l'area di lavoro.

    Suggerimento

    Prima di creare una nuova area di lavoro, è necessario creare un gruppo di risorse di Azure che la contenga. Per altre informazioni, vedere Gestire i gruppi di risorse di Azure.

    export RESOURCEGROUP_NAME="<YOUR_RESOURCEGROUP_NAME>"
    export WORKSPACE_NAME="<YOUR_WORKSPACE_NAME>"
    
  2. Creare l'area di lavoro. Il parametro -m allow_only_approved_outbound configura una rete virtuale gestita per l'area di lavoro e blocca il traffico in uscita, escluse le destinazioni approvate.

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

    In alternativa, se si vuole consentire alla distribuzione di inviare il traffico in uscita a Internet, rimuovere il commento dal codice seguente ed eseguirlo.

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

    Per altre informazioni sulla creazione di una nuova area di lavoro o per aggiornare l'area di lavoro esistente per utilizzare una rete virtuale gestita, vedere Configurare una rete virtuale gestita per consentire Internet in uscita.

    Quando l'area di lavoro viene configurata con un endpoint privato, è necessario configurare Registro Azure Container per l'area di lavoro per il livello Premium al fine di consentire l'accesso tramite l'endpoint privato. Per altre informazioni, vedere Livelli di servizio di Registro Azure Container. Inoltre, l'area di lavoro deve essere impostata con la proprietà image_build_compute, perché la creazione della distribuzione comporta la compilazione di immagini. Per altre informazioni, vedere Configurare compilazioni di immagini.

  3. Configurare le impostazioni predefinite per l'interfaccia della riga di comando per evitare di trasmettere più volte i valori per l'area di lavoro e il gruppo di risorse.

    az configure --defaults workspace=$WORKSPACE_NAME group=$RESOURCEGROUP_NAME
    
  4. Clonare il repository di esempi per ottenere i file di esempio per l'endpoint e la distribuzione, quindi passare alla directory /cli del repository.

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

I comandi di questa esercitazione si trovano nel file deploy-managed-online-endpoint-workspacevnet.sh, nella directory cli, mentre i file di configurazione YAML si trovano nella sottodirectory endpoints/online/managed/sample/.

Creare un endpoint online gestito protetto

Per creare un endpoint online gestito protetto, creare l'endpoint nell'area di lavoro e impostare l'endpoint public_network_access su disabled per controllare le comunicazioni in ingresso. Pertanto, l'endpoint dovrà usare l'endpoint privato dell'area di lavoro per le comunicazioni in ingresso.

Poiché l'area di lavoro è stata configurata per avere una rete virtuale gestita, tutte le distribuzioni dell'endpoint useranno gli endpoint privati della rete virtuale gestita per le comunicazioni in uscita.

  1. Impostare il nome dell'endpoint.

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    
  2. Creare un endpoint disabilitando public_network_access per bloccare il traffico in ingresso.

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

    Se si disabilita l'accesso alla rete pubblica per l'endpoint, l'unico modo per richiamare l'endpoint consiste nell'uso di un endpoint privato, che possa accedere all'area di lavoro nella rete virtuale. Per altre informazioni, vedere Richieste di assegnazione dei punteggi in ingresso e configurare un endpoint privato per un'area di lavoro di Azure Machine Learning.

    In alternativa, se si desidera consentire all'endpoint di ricevere richieste di assegnazione dei punteggi da Internet, rimuovere il commento dal codice seguente ed eseguirlo.

    # az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
    
  3. Creare una distribuzione nella rete virtuale gestita dell'area di lavoro.

    az ml online-deployment create --name blue --endpoint $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment.yml --all-traffic
    
  4. Ottenere lo stato della distribuzione.

    az ml online-endpoint show -n $ENDPOINT_NAME
    
  5. Testare l'endpoint con una richiesta di assegnazione dei punteggi tramite l'interfaccia della riga di comando.

    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
    
  6. Ottenere i log di distribuzione.

    az ml online-deployment get-logs --name blue --endpoint $ENDPOINT_NAME
    
  7. Se non è più necessario, eliminare l'endpoint.

    az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait
    
  8. Eliminare tutte le risorse create in base a questo articolo. Sostituire <resource-group-name> con il nome del gruppo di risorse usato in questo esempio:

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

Risoluzione dei problemi

La creazione dell'endpoint online ha esito negativo con un messaggio V1LegacyMode == true

L'area di lavoro di Azure Machine Learning può essere configurata per v1_legacy_mode, questo disabilita le API v2. Gli endpoint online gestiti sono una funzionalità della piattaforma API v2 e non funzionano se v1_legacy_mode è abilitato per l'area di lavoro.

Importante

Rivolgersi al team della sicurezza di rete prima di disabilitare v1_legacy_mode. Potrebbe essere stato abilitato dal team della sicurezza di rete per un motivo preciso.

Per informazioni su come disabilitare v1_legacy_mode, vedere Isolamento rete con v2.

La creazione dell'endpoint online con l'autenticazione basata su chiavi ha esito negativo

Usare il comando seguente per elencare le regole di rete di Azure Key Vault per l'area di lavoro. Sostituire <keyvault-name> con il nome dell'insieme di credenziali delle chiavi:

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

La risposta di questo comando è simile al documento JSON seguente:

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

Se il valore di bypass non è AzureServices, seguire le istruzioni riportate in Configurare le impostazioni di rete dell'insieme di credenziali delle chiavi per impostarlo su AzureServices.

Le distribuzioni online hanno esito negativo con un errore di download dell'immagine

Nota

Questo problema si verifica quando si usa il metodo di isolamento rete legacy per gli endpoint online gestiti, in cui Azure Machine Learning crea una rete virtuale gestita per ciascuna distribuzione in un endpoint.

  1. Controllare se il flag egress-public-network-access è disabilitato per la distribuzione. Se questo flag è abilitato e la visibilità del registro contenitori è privata, è previsto questo errore.

  2. Usare il comando seguente per controllare lo stato della connessione all'endpoint privato. Sostituire <registry-name> con il nome del Registro Azure Container per la propria area di lavoro:

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

    Nel documento di risposta verificare che il campo status sia impostato su Approved. Se non è approvato, usare il comando seguente per approvarlo. Sostituire <private-endpoint-name> con il nome restituito dal comando precedente:

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

L'endpoint di assegnazione dei punteggi non può essere risolto

  1. Verificare che il client che emette la richiesta di punteggio sia una rete virtuale in grado di accedere all'area di lavoro di Azure Machine Learning.

  2. Usare il comando nslookup nel nome host dell'endpoint per recuperare le informazioni sull'indirizzo IP:

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

    La risposta contiene un indirizzo. Questo indirizzo deve trovarsi nell'intervallo specificato dalla rete virtuale

    Nota

    Per un endpoint online Kubernetes, il nome host dell'endpoint deve essere il CName (nome di dominio) specificato nel cluster Kubernetes. Se si tratta di un endpoint HTTP, l'indirizzo IP sarà contenuto nell'URI dell'endpoint che si può ottenere direttamente nell'interfaccia utente di Studio. Altri modi per ottenere l'indirizzo IP dell'endpoint sono disponibili in Endpoint online Kubernetes sicuro.

  3. Se il nome host non viene risolto dal comando nslookup:

    Per l'endpoint online gestito,

    1. Controllare se esiste un record A nella zona DNS privata per la rete virtuale.

      Per controllare i record, usare il comando seguente:

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

      I risultati devono contenere una voce simile a *.<GUID>.inference.<region>.

    2. Se non viene restituito alcun valore di inferenza, eliminare l'endpoint privato per l'area di lavoro, quindi ricrearlo. Per altre informazioni, vedere Come configurare un endpoint privato.

    3. Se l'area di lavoro con un endpoint privato viene configurata usando un DNS personalizzato (Come usare l'area di lavoro con un server DNS personalizzato), usare il comando seguente per verificare se la risoluzione funziona correttamente dal DNS personalizzato.

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

    Per l'endpoint online Kubernetes,

    1. Controllare la configurazione DNS nel cluster Kubernetes.

    2. Inoltre, per verificare se azureml-fe funziona come previsto, usare il comando seguente:

      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"
      

      Per HTTP, usare

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

    Se curl HTTP ha esito negativo (ad esempio, timeout) ma HTTP funziona, controllare la validità del certificato.

    Se il problema non viene risolto per il record A, verificare se la risoluzione funziona dal DNS di Azure(168.63.129.16).

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

    Se l'operazione ha esito positivo, è possibile risolvere i problemi relativi al server d'inoltro condizionale per il collegamento privato nel DNS personalizzato.

Non è possibile assegnare punteggi alle distribuzioni online

  1. Usare il comando seguente per verificare se la distribuzione è stata eseguita correttamente:

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

    Se la distribuzione è stata completata correttamente, il valore di state sarà Succeeded.

  2. Se la distribuzione ha avuto esito positivo, usare il comando seguente per verificare che il traffico venga assegnato alla distribuzione. Sostituire <endpointname> con il nome dell'endpoint:

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

    Suggerimento

    Questo passaggio non è necessario se si usa l'intestazione azureml-model-deployment nella richiesta per specificare come destinazione questa distribuzione.

    La risposta di questo comando deve riportare la percentuale di traffico assegnato alle distribuzioni.

  3. Se le assegnazioni di traffico (o l'intestazione della distribuzione) sono impostate correttamente, usare il comando seguente per ottenere i log per l'endpoint. Sostituire <endpointname> con il nome dell'endpoint e <deploymentname> con la distribuzione:

    az ml online-deployment get-logs  -e <endpointname> -n <deploymentname> 
    

    Quando si invia una richiesta alla distribuzione, esaminare i log per controllare se si è verificato un problema durante l'esecuzione del codice di assegnazione dei punteggi.

Passaggi successivi