Partilhar via


Utilizar o TLS para proteger um serviço Web através do Azure Machine Learning

APLICA-SE A: Python SDK azureml v1

Este artigo mostra como proteger um serviço Web implantado por meio do Aprendizado de Máquina do Azure.

Você usa HTTPS para restringir o acesso a serviços Web e proteger os dados que os clientes enviam. O HTTPS ajuda a proteger as comunicações entre um cliente e um serviço Web criptografando as comunicações entre os dois. A criptografia usa Transport Layer Security (TLS). TLS às vezes ainda é referido como Secure Sockets Layer (SSL), que foi o antecessor do TLS.

Gorjeta

O SDK do Azure Machine Learning usa o termo "SSL" para propriedades relacionadas a comunicações seguras. Isso não significa que seu serviço Web não use TLS. SSL é apenas um termo mais comumente reconhecido.

Especificamente, os serviços Web implementados através do Azure Machine Learning suportam TLS versão 1.2 para AKS e ACI. Para implantações ACI, se você estiver em uma versão TLS mais antiga, recomendamos reimplantar para obter a versão TLS mais recente.

TLS versão 1.3 para Azure Machine Learning - AKS Inference não é suportado.

TLS e SSL dependem de certificados digitais, que ajudam na criptografia e verificação de identidade. Para obter mais informações sobre como os certificados digitais funcionam, consulte o tópico da Wikipédia Infraestrutura de chave pública.

Aviso

Se você não usa HTTPS para seu serviço Web, os dados enviados de e para o serviço podem estar visíveis para outras pessoas na Internet.

O HTTPS também permite que o cliente verifique a autenticidade do servidor ao qual está se conectando. Esse recurso protege os clientes contra ataques man-in-the-middle .

Este é o processo geral para proteger um serviço Web:

  1. Obtenha um nome de domínio.

  2. Obtenha um certificado digital.

  3. Implemente ou atualize o serviço Web com o TLS ativado.

  4. Atualize o DNS para apontar para o serviço Web.

Importante

Se você estiver implantando no Serviço Kubernetes do Azure (AKS), poderá comprar seu próprio certificado ou usar um certificado fornecido pela Microsoft. Se você usar um certificado da Microsoft, não precisará obter um nome de domínio ou certificado TLS/SSL. Para obter mais informações, consulte a seção Habilitar TLS e implantar deste artigo.

Há pequenas diferenças quando você protege entre destinos de implantação.

Importante

Alguns dos comandos da CLI do Azure neste artigo usam a extensão , ou v1, para o azure-cli-mlAzure Machine Learning. O suporte para a extensão v1 terminará em 30 de setembro de 2025. Você poderá instalar e usar a extensão v1 até essa data.

Recomendamos que você faça a transição para a mlextensão , ou v2, antes de 30 de setembro de 2025. Para obter mais informações sobre a extensão v2, consulte Extensão CLI do Azure ML e Python SDK v2.

Obter um nome de domínio

Se você ainda não possui um nome de domínio, compre um de um registrador de nomes de domínio. O processo e o preço diferem entre os agentes de registo. O registrar fornece ferramentas para gerenciar o nome de domínio. Você usa essas ferramentas para mapear um nome de domínio totalmente qualificado (FQDN) (como www.contoso.com) para o endereço IP que hospeda seu serviço Web.

Obter um certificado TLS/SSL

Há muitas maneiras de obter um certificado TLS/SSL (certificado digital). O mais comum é comprar um de uma autoridade de certificação (CA). Independentemente de onde você obtém o certificado, você precisa dos seguintes arquivos:

  • Um certificado. O certificado deve conter a cadeia de certificados completa e deve ser "codificado por PEM".
  • Uma chave. A chave também deve ser codificada em PEM.

Ao solicitar um certificado, você deve fornecer o FQDN do endereço que planeja usar para o serviço Web (por exemplo, www.contoso.com). O endereço carimbado no certificado e o endereço que os clientes usam são comparados para verificar a identidade do serviço Web. Se esses endereços não corresponderem, o cliente receberá uma mensagem de erro.

Gorjeta

Se a autoridade de certificação não puder fornecer o certificado e a chave como arquivos codificados em PEM, você poderá usar um utilitário como o OpenSSL para alterar o formato.

Aviso

Use certificados autoassinados apenas para desenvolvimento. Não os utilize em ambientes de produção. Os certificados autoassinados podem causar problemas em seus aplicativos cliente. Para obter mais informações, consulte a documentação para as bibliotecas de rede que seu aplicativo cliente usa.

Habilite o TLS e implante

Para a implantação do AKS, você pode habilitar a terminação TLS ao criar ou anexar um cluster AKS no espaço de trabalho do Azure Machine Learning. No momento da implantação do modelo AKS, você pode desativar a terminação TLS com o objeto de configuração de implantação, caso contrário, toda a implantação do modelo AKS por padrão terá a terminação TLS habilitada no tempo de criação ou anexação do cluster AKS.

Para implantação ACI, você pode habilitar a terminação TLS no momento da implantação do modelo com o objeto de configuração de implantação.

Implantar no Serviço Kubernetes do Azure

Nota

As informações nesta seção também se aplicam quando você implanta um serviço Web seguro para o designer. Se você não estiver familiarizado com o uso do SDK do Python, consulte O que é o SDK do Azure Machine Learning para Python?.

Ao criar ou anexar um cluster AKS no espaço de trabalho do Azure Machine Learning, você pode habilitar a terminação TLS com objetos de configuração AksCompute.provisioning_configuration() e AksCompute.attach_configuration(). Ambos os métodos retornam um objeto de configuração que tem um método enable_ssl e você pode usar enable_ssl método para habilitar o TLS.

Você pode habilitar o TLS com o certificado da Microsoft ou um certificado personalizado adquirido da autoridade de certificação.

  • Quando você usa um certificado da Microsoft, você deve usar o parâmetro leaf_domain_label . Este parâmetro gera o nome DNS para o serviço. Por exemplo, um valor de "contoso" cria um nome de domínio de "contoso<de seis caracteres aleatórios>.<azureregion.cloudapp.azure.com>", onde <azureregion> é a região que contém o serviço. Opcionalmente, você pode usar o parâmetro overwrite_existing_domain para substituir o leaf_domain_label existente. O exemplo a seguir demonstra como criar uma configuração que habilita um TLS com certificado da 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 utiliza um certificado da Microsoft, não precisa de comprar o seu próprio certificado ou nome de domínio.

  • Ao usar um certificado personalizado comprado, você usa os parâmetros ssl_cert_pem_file, ssl_key_pem_file e ssl_cname . O arquivo PEM com proteção por frase secreta não é suportado. O exemplo a seguir demonstra como usar arquivos .pem para criar uma configuração que usa um certificado TLS/SSL que você comprou:

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

Para obter mais informações sobre enable_ssl, consulte AksProvisioningConfiguration.enable_ssl() e AksAttachConfiguration.enable_ssl().

Implementar no Azure Container Instances

Ao implantar em Instâncias de Contêiner do Azure, você fornece valores para parâmetros relacionados a TLS, como mostra o trecho de código a seguir:

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

Para obter mais informações, consulte AciWebservice.deploy_configuration().

Atualize o seu DNS

Para implantação do AKS com certificado personalizado ou implantação ACI, você deve atualizar seu registro DNS para apontar para o endereço IP do ponto de extremidade de pontuação.

Importante

Quando você usa um certificado da Microsoft para implantação do AKS, não precisa atualizar manualmente o valor DNS do cluster. O valor deve ser definido automaticamente.

Você pode seguir as seguintes etapas para atualizar o registro DNS para seu nome de domínio personalizado:

  1. Obtenha o endereço IP do ponto de extremidade de pontuação do URI do ponto de extremidade, que geralmente está no formato de http://104.214.29.152:80/api/v1/service/<service-name>/score. Neste exemplo, o endereço IP é 104.214.29.152.

  2. Use as ferramentas do seu registrador de nomes de domínio para atualizar o registro DNS do seu nome de domínio. O registro mapeia o FQDN (por exemplo, www.contoso.com) para o endereço IP. O registro deve apontar para o endereço IP do ponto de extremidade de pontuação.

    Gorjeta

    A Microsoft não é responsável por atualizar o DNS do seu nome DNS personalizado ou certificado. Você deve atualizá-lo com seu registrador de nomes de domínio.

  3. Após a atualização do registro DNS, você pode validar a resolução DNS usando o comando nslookup custom-domain-name . Se o registro DNS for atualizado corretamente, o nome de domínio personalizado apontará para o endereço IP do ponto de extremidade de pontuação.

    Pode haver um atraso de minutos ou horas antes que os clientes possam resolver o nome de domínio, dependendo do registrador e do "tempo de vida" (TTL) configurado para o nome de domínio.

Para obter mais informações sobre resolução de DNS com o Azure Machine Learning, consulte Como usar seu espaço de trabalho com um servidor DNS personalizado.

Atualizar o certificado TLS/SSL

Os certificados TLS/SSL expiram e devem ser renovados. Normalmente, acontece todos os anos. Use as informações nas seções a seguir para atualizar e renovar seu certificado para modelos implantados no Serviço Kubernetes do Azure:

Atualizar um certificado gerado pela Microsoft

Se o certificado foi originalmente gerado pela Microsoft (ao usar o leaf_domain_label para criar o serviço), ele será renovado automaticamente quando necessário. Se quiser renová-lo manualmente, use um dos seguintes exemplos para atualizar o certificado:

Importante

  • Se o certificado existente ainda for válido, use renew=True (SDK) ou --ssl-renew (CLI) para forçar a configuração a renová-lo. Esta operação demorará cerca de 5 horas a fazer efeito.
  • Quando o serviço foi originalmente implantado, o leaf_domain_label é usado para criar um nome DNS usando o padrão <leaf-domain-label>######.<azure-region>.cloudapp.azure.com. Para preservar o nome existente (incluindo os 6 dígitos originalmente gerados), use o valor original leaf_domain_label . Não inclua os 6 dígitos que foram gerados.

Usar o 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)

Utilizar a CLI

APLICA-SE A: Azure CLI ml extension v1

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

Para obter mais informações, consulte os seguintes documentos de referência:

Atualizar certificado personalizado

Se o certificado foi originalmente gerado por uma autoridade de certificação, use as seguintes etapas:

  1. Use a documentação fornecida pela autoridade de certificação para renovar o certificado. Esse processo cria novos arquivos de certificado.

  2. Use o SDK ou a CLI para atualizar o serviço com o novo certificado:

    Usar o 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)
    

    Utilizar a CLI

    APLICA-SE A: Azure CLI ml extension 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"
    

Para obter mais informações, consulte os seguintes documentos de referência:

Desativar TLS

Para desabilitar o TLS para um modelo implantado no Serviço Kubernetes do Azure, crie um SslConfiguration com status="Disabled"e execute uma atualização:

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)

Próximos passos

Aprenda a: