Compartilhar via


Use o TLS para proteger um serviço Web por meio do Azure Machine Learning

APLICA-SE A: SDK do Python azureml v1

Este artigo mostra como proteger um serviço Web que é implantado por meio do Azure Machine Learning.

Você usa o HTTPS para restringir o acesso aos serviços da 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 o TLS (Transport Layer Security). Às vezes, o TLS ainda é mencionado como SSL (Secure Sockets Layer), que foi o predecessor do TLS.

Dica

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

Especificamente, os serviços Web implantados por meio do Azure Machine Learning suportam o TLS versão 1.2 para AKS e ACI. Para implantações do ACI, se você estiver na versão mais antiga do TLS, recomendamos reimplantar para obter a versão mais recente do TLS.

O TLS versão 1.3 para a inferência AKS do Azure Machine Learning não tem suporte.

O TLS e o SSL dependem de certificados digitais, que ajudam com a criptografia e a 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 usar HTTPS para o serviço Web, os dados enviados de e para o serviço poderão estar visíveis para outras pessoas na Internet.

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

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

  1. Obter um nome de domínio.

  2. Obter um certificado digital.

  3. Implantar ou atualizar o serviço da Web com o TLS ativado.

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

Importante

Se estiver implantando no AKS (Serviço de Kubernetes do Azure), você 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 um 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 os destinos de implantação.

Importante

Alguns comandos da CLI do Azure neste artigo usam a extensão azure-cli-ml ou v1 do Azure Machine Learning. O suporte à 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 extensão ml ou v2, antes de 30 de setembro de 2025. Para obter mais informações sobre a extensão v2, confira Extensão da CLI do Azure ML e SDK do Python v2.

Obter um nome de domínio

Se você ainda não tem um nome de domínio, pode comprar um de um registrador de nomes de domínio. O processo e o preço são diferentes entre os registradores. O registrador fornece ferramentas para gerenciar o nome de domínio. Você usa essas ferramentas para mapear um FQDN (nome de domínio totalmente qualificado) (como www.contoso.com) para o endereço IP que hospeda o serviço Web.

Obter um certificado TLS/SSL

Há várias maneiras de obter um certificado TLS/SSL (certificado digital). A mais comum é comprar um de uma CA (autoridade de certificação). Independentemente de onde você obtém o certificado, é necessário ter os seguintes arquivos:

  • Um certificado. O certificado deve conter a cadeia de certificado completa e deve ser "codificado em 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 identificado no certificado e o endereço usado pelos clientes são comparados na hora de validar a identidade do serviço Web. Se esses endereços não corresponderem, o cliente receberá uma mensagem de erro.

Dica

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 OpenSSL para alterar o formato.

Aviso

Certificados autoassinados devem ser usados apenas para desenvolvimento. Não os use em ambientes de produção. Certificados autoassinados podem causar problemas nos aplicativos clientes. Para obter mais informações, consulte a documentação das bibliotecas de rede usadas no aplicativo cliente.

Habilitar TLS e implantar

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

Para a implantação do 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 de Kubernetes do Azure

Observação

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 está familiarizado com o uso do SDK do Python, consulte O que é o SDK do Azure Machine Learning para o Python?.

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

Você pode habilitar o TLS com o certificado da Microsoft ou com um certificado personalizado adquirido da AC.

  • Ao usar um certificado da Microsoft, você deve usar o parâmetro leaf_domain_label. Esse parâmetro gera o nome DNS para o serviço. Por exemplo, um valor "contoso" cria um nome de domínio "contoso<seis-caracteres-aleatórios>.<regiãodoazure>.cloudapp.azure.com", em que <regiãodoazure> é a região que contém o serviço. Opcionalmente, você pode usar o parâmetro overwrite_existing_domain para substituir o leaf_domain_labelexistente. O exemplo a seguir demonstra como criar uma configuração que habilita um TLS com o 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

    Ao usar um certificado da Microsoft, você não precisa comprar seu próprio certificado ou nome de domínio.

  • Ao usar um certificado personalizado que você comprou, use os parâmetros ssl_cert_pem_file, ssl_key_pem_filee ssl_cname. Não há suporte para arquivo PEM com proteção por frase secreta. 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().

Implantar nas Instâncias de Contêiner do Azure

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().

Atualizar o DNS

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

Importante

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

Você pode seguir as etapas a seguir 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 de pontuação, 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 fornecidas pelo registrador de nome 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 serviço.

    Dica

    A Microsoft não é responsável por atualizar o DNS de seu certificado ou nome DNS personalizado. 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.

    Dependendo do registrador e da TTL (vida útil) configurados para o nome de domínio, pode levar vários minutos a várias horas até que os clientes possam resolver o nome de domínio.

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

Atualizar o certificado TLS/SSL

Os certificados TLS/SSL expiram e devem ser renovados. Normalmente, isso 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 de 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 você quiser renová-lo manualmente, use um dos exemplos a seguir 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. Essa operação levará cerca de cinco horas para entrar em vigor.
  • Quando o serviço foi implantado originalmente, 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 leaf_domain_label original. 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)

Usar a CLI

APLICA-SE A: Extensão ML da CLI do Azure 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, confira as seguintes arquiteturas de referência:

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

    Usar a CLI

    APLICA-SE A: Extensão ML da CLI do 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"
    

Para obter mais informações, confira as seguintes arquiteturas de referência:

Desabilitar o TLS

Para desabilitar o TLS para um modelo implantado no Serviço de Kubernetes do Azure, crie um SslConfiguration com status="Disabled" e, em seguida, 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óximas etapas

Saiba como: