Share via


Usare TLS per proteggere un servizio Web tramite Azure Machine Learning

SI APPLICA A:Python SDK azureml v1

Questo articolo illustra come proteggere un servizio Web distribuito tramite Azure Machine Learning.

È possibile usare HTTPS per limitare l'accesso ai servizi Web e proteggere i dati inviati dai client. HTTPS consente di proteggere le comunicazioni tra un client e un servizio Web crittografando le comunicazioni tra loro. Per la crittografia viene usato il protocollo TLS (Transport Layer Security). TLS viene talvolta definito Secure Sockets Layer (SSL), che era il predecessore di TLS.

Suggerimento

In Azure Machine Learning SDK viene usato il termine "SSL" per le proprietà correlate alle comunicazioni protette. Questo non significa che il servizio Web non usi TLS. SSL è solo un termine più comunemente noto.

In particolare, i servizi Web distribuiti tramite Azure Machine Learning supportano TLS versione 1.2 per il servizio Azure Kubernetes e Istanze di Azure Container. Per le distribuzioni di Istanze di Azure Container, se si usa una versione precedente di TLS, è consigliabile ripetere la distribuzione per ottenere la versione più recente di TLS.

L'inferenza tra TLS versione 1.3 per Azure Machine Learning e il servizio Azure Kubernetes non è supportata.

TLS e SSL si basano entrambi su certificati digitali, utili per la crittografia e la verifica dell'identità. Per altre informazioni sul funzionamento dei certificati digitali, vedere l'argomento di Wikipedia Infrastruttura a chiave pubblica.

Avviso

Se non si usa HTTPS per il servizio Web, i dati inviati da e verso il servizio potrebbero essere visibili per gli altri utenti su Internet.

HTTPS consente anche al client di verificare l'autenticità del server a cui si connette. Questa funzionalità protegge i client dagli attacchi man-in-the-middle.

Questo è il processo generale per proteggere un servizio Web:

  1. Immettere un nome di dominio.

  2. Ottenere un certificato digitale.

  3. Distribuire o aggiornare il servizio Web con TLS abilitato.

  4. Aggiornare il DNS in modo che punti al servizio Web.

Importante

Se si esegue la distribuzione nel servizio Azure Kubernetes, è possibile acquistare il proprio certificato o usare un certificato fornito da Microsoft. Se si usa un certificato fornito da Microsoft, non è necessario ottenere un nome di dominio o un certificato TLS/SSL. Per altre informazioni, vedere la sezione Abilitare TLS ed eseguire la distribuzione in questo articolo.

È possibile notare lievi differenze nella protezione tra destinazioni di distribuzione.

Importante

In alcuni comandi dell'interfaccia della riga di comando di Azure in questo articolo viene usata l'estensione azure-cli-ml, o v1, per Azure Machine Learning. Il supporto per l'estensione v1 terminerà il 30 settembre 2025. Sarà possibile installare e usare l'estensione v1 fino a tale data.

È consigliabile passare all'estensione ml, o v2, prima del 30 settembre 2025. Per ulteriori informazioni sull'estensione v2, vedere Estensione dell'interfaccia della riga di comando di Azure ML e Python SDK v2.

Immettere un nome di dominio

Se non si dispone ancora di un nome di dominio, acquistarne uno da un registrar di nomi di dominio. Il processo e il prezzo variano a seconda del registrar. Il registrar fornisce gli strumenti per gestire il nome di dominio. Questi strumenti consentono di eseguire il mapping di un nome di dominio completo (FQDN), ad esempio www.contoso.com, all'indirizzo IP che ospita il servizio Web.

Ottenere un certificato TLS/SSL

Esistono molti modi per ottenere un certificato TLS/SSL (certificato digitale). Quello più comune consiste nell'acquistare un certificato da un'autorità di certificazione (CA). Indipendentemente dal modo in cui si ottiene il certificato, sono necessari i file seguenti:

  • Un certificato. Il certificato deve contenere la catena di certificati completa e usare la "codifica PEM".
  • Una chiave. Anche la codifica della chiave deve essere PEM.

Quando si richiede un certificato, è necessario specificare il nome di dominio completo (FQDN) dell'indirizzo che si intende usare per il servizio Web, ad esempio www.contoso.com. L'indirizzo indicato nel certificato e l'indirizzo usato dai client vengono confrontati per verificare l'identità del servizio Web. Se tali indirizzi non corrispondono, nel client viene visualizzato un messaggio di errore.

Suggerimento

Se l'autorità di certificazione non può fornire il certificato e la chiave come file con codifica PEM, è possibile usare un'utilità come OpenSSL per modificare il formato.

Avviso

Usare certificati autofirmati solo per lo sviluppo. Evitare di usarle in un ambiente di produzione. I certificati autofirmati possono causare problemi nelle applicazioni client. Per altre informazioni, vedere la documentazione relativa alle librerie di rete usate dall'applicazione client.

Abilitare TLS ed eseguire la distribuzione

Per la distribuzione nel servizio Azure Kubernetes, è possibile abilitare la terminazione TLS quando si crea o si collega un cluster del servizio Azure Kubernetes nell'area di lavoro di Azure Machine Learning. Durante la distribuzione del modello nel servizio Azure Kubernetes, è possibile disabilitare la terminazione TLS con l'oggetto di configurazione della distribuzione. In caso contrario, per impostazione predefinita la terminazione TLS sarà abilitata in tutte le distribuzioni del modello nel servizio Azure Kubernetes durante la creazione o il collegamento del cluster del servizio Azure Kubernetes.

Per la distribuzione in Istanze di Azure Container, è possibile abilitare la terminazione TLS durante la distribuzione del modello con l'oggetto di configurazione della distribuzione.

Distribuire nel servizio Azure Kubernetes

Nota

Le informazioni contenute in questa sezione sono valide anche nei casi in cui si distribuisce un servizio Web protetto per la finestra di progettazione. Se non si ha familiarità con l'uso di Python SDK, vedere Che cos'è Azure Machine Learning SDK per Python?.

Quando si crea o si collega un cluster del servizio Azure Kubernetes nell'area di lavoro di Azure Machine Learning, è possibile abilitare la terminazione TLS con gli oggetti di configurazione AksCompute.provisioning_configuration() e AksCompute.attach_configuration(). Entrambi i metodi restituiscono un oggetto di configurazione con un metodo enable_ssl ed è possibile usare il metodo enable_ss per abilitare TLS.

È possibile abilitare TLS con il certificato Microsoft o con un certificato personalizzato acquistato dalla CA.

  • Quando si usa un certificato fornito da Microsoft, è necessario specificare il parametro leaf_domain_label. Questo parametro genera il nome DNS per il servizio. Ad esempio, con il valore "contoso" viene creato un nome di dominio "contoso<sei-caratteri-casuali>".<area_di_azure>.cloudapp.azure.com", in cui <area_di_azure> è l'area che contiene il servizio. Facoltativamente, è possibile usare il parametro overwrite_existing_domain per sovrascrivere il parametro leaf_domain_label esistente. L'esempio seguente illustra come creare una configurazione che abilita TLS con un certificato Microsoft:

    from azureml.core.compute import AksCompute
    
    # Config used to create a new AKS cluster and enable TLS
    provisioning_config = AksCompute.provisioning_configuration()
    
    # Leaf domain label generates a name using the formula
    #  "<leaf-domain-label>######.<azure-region>.cloudapp.azure.com"
    #  where "######" is a random series of characters
    provisioning_config.enable_ssl(leaf_domain_label = "contoso")
    
    
    # Config used to attach an existing AKS cluster to your workspace and enable TLS
    attach_config = AksCompute.attach_configuration(resource_group = resource_group,
                                          cluster_name = cluster_name)
    
    # Leaf domain label generates a name using the formula
    #  "<leaf-domain-label>######.<azure-region>.cloudapp.azure.com"
    #  where "######" is a random series of characters
    attach_config.enable_ssl(leaf_domain_label = "contoso")
    

    Importante

    Quando si usa un certificato fornito da Microsoft, non è necessario acquistare un certificato o un nome di dominio personale.

  • Quando si usa un certificato personalizzato acquistato, si specificano i parametri ssl_cert_pem_file, ssl_key_pem_file e ssl_cname. Il file PEM protetto da passphrase non è supportato. L'esempio seguente illustra come usare i file con estensione pem per creare una configurazione che usa un certificato TLS/SSL acquistato:

    from azureml.core.compute import AksCompute
    
    # Config used to create a new AKS cluster and enable TLS
    provisioning_config = AksCompute.provisioning_configuration()
    provisioning_config.enable_ssl(ssl_cert_pem_file="cert.pem",
                                        ssl_key_pem_file="key.pem", ssl_cname="www.contoso.com")
    
    # Config used to attach an existing AKS cluster to your workspace and enable SSL
    attach_config = AksCompute.attach_configuration(resource_group = resource_group,
                                         cluster_name = cluster_name)
    attach_config.enable_ssl(ssl_cert_pem_file="cert.pem",
                                        ssl_key_pem_file="key.pem", ssl_cname="www.contoso.com")
    

Per altre informazioni su enable_ssl, vedere AksProvisioningConfiguration.enable_ssl() e AksAttachConfiguration.enable_ssl().

Distribuire in Istanze di Azure Container

Quando si esegue la distribuzione in Istanze di Azure Container, si forniscono valori per i parametri correlati a TLS, come illustrato nel frammento di codice seguente:

from azureml.core.webservice import AciWebservice

aci_config = AciWebservice.deploy_configuration(
    ssl_enabled=True, ssl_cert_pem_file="cert.pem", ssl_key_pem_file="key.pem", ssl_cname="www.contoso.com")

Per altre informazioni, vedere AciWebservice.deploy_configuration().

Aggiorna DNS

Per la distribuzione nel servizio Azure Kubernetes con certificato personalizzato o la distribuzione in Istanze di Azure Container, è necessario aggiornare il record DNS in modo che punti all'indirizzo IP dell'endpoint di assegnazione dei punteggi.

Importante

Quando si usa un certificato fornito da Microsoft per la distribuzione nel servizio Azure Kubernetes, non è necessario aggiornare manualmente il valore di DNS per il cluster. Il valore viene impostato automaticamente.

È possibile seguire questa procedura per aggiornare il record DNS per il nome di dominio personalizzato:

  1. Ottenere l'indirizzo IP dell'endpoint di assegnazione dei punteggi dall'URI di tale endpoint, in genere in formato http://104.214.29.152:80/api/v1/service/<service-name>/score. In questo esempio l'indirizzo IP è 104.214.29.152.

  2. Usare gli strumenti del registrar del nome di dominio per aggiornare il record DNS per il nome di dominio. Il record esegue il mapping del nome di dominio completo (FQDN), ad esempio, www.contoso.com, all'indirizzo IP. Il record deve puntare all'indirizzo IP dell'endpoint di assegnazione dei punteggi.

    Suggerimento

    Microsoft non è responsabile dell'aggiornamento del DNS per il nome DNS o il certificato personalizzato. È necessario aggiornarlo con il registrar del nome di dominio.

  3. Dopo l'aggiornamento del record DNS, è possibile convalidare la risoluzione DNS usando il comando nslookup custom-domain-name. Se il record DNS viene aggiornato correttamente, il nome di dominio personalizzato punterà all'indirizzo IP dell'endpoint di assegnazione dei punteggi.

    A seconda del registrar e della durata (TTL) configurata per il nome di dominio, è possibile che si verifichi un ritardo di minuti o di ore prima che i client possano risolvere il nome di dominio.

Per altre informazioni sulla risoluzione DNS con Azure Machine Learning, vedere Come usare l'area di lavoro con un server DNS personalizzato.

Aggiornare il certificato TLS/SSL

I certificati TLS/SSL scadono e devono essere rinnovati. Questo avviene in genere ogni anno. Usare le informazioni nelle sezioni seguenti per aggiornare e rinnovare il certificato per i modelli distribuiti nel servizio Azure Kubernetes:

Aggiornare un certificato generato da Microsoft

Se il certificato è stato originariamente generato da Microsoft (quando si usa leaf_domain_label per creare il servizio), verrà rinnovato automaticamente quando necessario. Se si intende rinnovarlo manualmente, usare uno degli esempi seguenti per aggiornare il certificato:

Importante

  • Se il certificato esistente è ancora valido, usare renew=True (SDK) o --ssl-renew (interfaccia della riga di comando) per forzare la configurazione a rinnovarlo. L'effetto di questa operazione sarà visibile dopo circa cinque ore.
  • Durante la distribuzione iniziale del servizio, si usa leaf_domain_label per creare un nome DNS conforme al criterio <leaf-domain-label>######.<azure-region>.cloudapp.azure.com. Per mantenere il nome esistente (incluse le sei cifre generate in origine), usare il valore leaf_domain_label originale. Non includere le sei cifre generate.

Usare l'SDK

from azureml.core.compute import AksCompute
from azureml.core.compute.aks import AksUpdateConfiguration
from azureml.core.compute.aks import SslConfiguration

# Get the existing cluster
aks_target = AksCompute(ws, clustername)

# Update the existing certificate by referencing the leaf domain label
ssl_configuration = SslConfiguration(leaf_domain_label="myaks", overwrite_existing_domain=True, renew=True)
update_config = AksUpdateConfiguration(ssl_configuration)
aks_target.update(update_config)

Usare l'interfaccia della riga di comando

SI APPLICA A:Estensione per Machine Learning dell'interfaccia della riga di comando di Azure v1

az ml computetarget update aks -g "myresourcegroup" -w "myresourceworkspace" -n "myaks" --ssl-leaf-domain-label "myaks" --ssl-overwrite-domain True --ssl-renew

Per altre informazioni, vedere la documentazione di riferimento seguente:

Aggiornare il certificato personalizzato

Se il certificato è stato originariamente generato da un'autorità di certificazione, seguire questa procedura:

  1. Usare la documentazione fornita dall'autorità di certificazione per rinnovare il certificato. Questo processo consente di creare nuovi file di certificato.

  2. Usare l'SDK o l'interfaccia della riga di comando per aggiornare il servizio con il nuovo certificato:

    Usare l'SDK

    from azureml.core.compute import AksCompute
    from azureml.core.compute.aks import AksUpdateConfiguration
    from azureml.core.compute.aks import SslConfiguration
    
    # Read the certificate file
    def get_content(file_name):
        with open(file_name, 'r') as f:
            return f.read()
    
    # Get the existing cluster
    aks_target = AksCompute(ws, clustername)
    
    # Update cluster with custom certificate
    ssl_configuration = SslConfiguration(cname="myaks", cert=get_content('cert.pem'), key=get_content('key.pem'))
    update_config = AksUpdateConfiguration(ssl_configuration)
    aks_target.update(update_config)
    

    Usare l'interfaccia della riga di comando

    SI APPLICA A:Estensione per Machine Learning dell'interfaccia della riga di comando di Azure v1

    az ml computetarget update aks -g "myresourcegroup" -w "myresourceworkspace" -n "myaks" --ssl-cname "myaks"--ssl-cert-file "cert.pem" --ssl-key-file "key.pem"
    

Per altre informazioni, vedere la documentazione di riferimento seguente:

Disabilitare TLS

Per disabilitare TLS per un modello distribuito nel servizio Azure Kubernetes, creare un oggetto SslConfiguration con status="Disabled", quindi eseguire un aggiornamento:

from azureml.core.compute import AksCompute
from azureml.core.compute.aks import AksUpdateConfiguration
from azureml.core.compute.aks import SslConfiguration

# Get the existing cluster
aks_target = AksCompute(ws, clustername)

# Disable TLS
ssl_configuration = SslConfiguration(status="Disabled")
update_config = AksUpdateConfiguration(ssl_configuration)
aks_target.update(update_config)

Passaggi successivi

Scopri come: