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-lhe como proteger um serviço Web implementado através do Azure Machine Learning.

Utiliza HTTPS para restringir o acesso aos serviços Web e proteger os dados que os clientes submetem. O HTTPS ajuda a proteger as comunicações entre um cliente e um serviço Web ao encriptar as comunicações entre os dois. A encriptação utiliza o Transport Layer Security (TLS). Por vezes, o TLS ainda é referido como Secure Sockets Layer (SSL), que foi o antecessor do TLS.

Dica

O SDK do Azure Machine Learning utiliza o termo "SSL" para propriedades relacionadas com comunicações seguras. Isto não significa que o seu serviço Web não utilize TLS. SSL é apenas um termo mais reconhecido.

Especificamente, os serviços Web implementados através do Azure Machine Learning suportam a versão TLS 1.2 para o AKS e o ACI. Para implementações do ACI, se estiver na versão mais antiga do TLS, recomendamos que implemente novamente para obter a versão mais recente do TLS.

A versão 1.3 do TLS para o Azure Machine Learning – Inferência do AKS não é suportada.

O TLS e o SSL dependem ambos de certificados digitais, que ajudam na encriptação e verificação de identidade. Para obter mais informações sobre como funcionam os certificados digitais, veja o tópico Wikipédia Infraestrutura de chaves públicas.

Aviso

Se não utilizar HTTPS para o seu 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 ao cliente verificar a autenticidade do servidor ao qual se está a ligar. Esta funcionalidade 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 estiver a implementar no Azure Kubernetes Service (AKS), pode comprar o seu próprio certificado ou utilizar um certificado fornecido pela Microsoft. Se utilizar um certificado da Microsoft, não precisa de obter um nome de domínio ou certificado TLS/SSL. Para obter mais informações, consulte a secção Ativar TLS e implementar este artigo.

Existem ligeiras diferenças quando protege entre destinos de implementação.

Importante

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

Recomendamos que 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, veja Extensão da CLI do Azure ML e SDK Python v2.

Obter um nome de domínio

Se ainda não tiver um nome de domínio, compre um a partir de uma entidade de registo de nomes de domínio. O processo e o preço diferem entre as entidades de registo. A entidade de registo fornece ferramentas para gerir o nome de domínio. Utilize estas ferramentas para mapear um nome de domínio completamente qualificado (FQDN) (como www.contoso.com) para o endereço IP que aloja o seu serviço Web.

Obter um certificado TLS/SSL

Existem várias formas de obter um certificado TLS/SSL (certificado digital). O mais comum é comprar um a uma autoridade de certificação (AC). Independentemente do local onde obtém o certificado, precisa dos seguintes ficheiros:

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

Quando pede um certificado, tem de fornecer o FQDN do endereço que planeia utilizar para o serviço Web (por exemplo, www.contoso.com). O endereço carimbado no certificado e o endereço que os clientes utilizam são comparados para verificar a identidade do serviço Web. Se esses endereços não corresponderem, o cliente recebe uma mensagem de erro.

Dica

Se a autoridade de certificação não conseguir fornecer o certificado e a chave como ficheiros codificados por PEM, pode utilizar um utilitário como o OpenSSL para alterar o formato.

Aviso

Utilize certificados autoassinados apenas para desenvolvimento. Não os utilize em ambientes de produção. Os certificados autoassinados podem causar problemas nas aplicações cliente. Para obter mais informações, veja a documentação das bibliotecas de rede que a aplicação cliente utiliza.

Ativar o TLS e implementar

Para a implementação do AKS, pode ativar a terminação TLS quando cria ou anexa um cluster do AKS na área de trabalho do Azure Machine Learning. No momento da implementação do modelo do AKS, pode desativar a terminação do TLS com o objeto de configuração de implementação. Caso contrário, por predefinição, toda a implementação do modelo do AKS terá a terminação TLS ativada na criação ou hora de anexação do cluster do AKS.

Para a implementação do ACI, pode ativar a terminação do TLS no momento da implementação do modelo com o objeto de configuração de implementação.

Implementar no Azure Kubernetes Service

Nota

As informações nesta secção também se aplicam quando implementa um serviço Web seguro para o estruturador. Se não estiver familiarizado com a utilização do SDK python, consulte O que é o SDK do Azure Machine Learning para Python?.

Quando cria ou anexa um cluster do AKS na área de trabalho do Azure Machine Learning, pode ativar a terminação TLS com objetos de configuração AksCompute.provisioning_configuration() e AksCompute.attach_configuration( ). Ambos os métodos devolvem um objeto de configuração que tem um método enable_ssl e pode utilizar enable_ssl método para ativar o TLS.

Pode ativar o TLS com um certificado Microsoft ou um certificado personalizado comprado na AC.

  • Quando utiliza um certificado da Microsoft, tem de utilizar o parâmetro leaf_domain_label . Este parâmetro gera o nome DNS do serviço. Por exemplo, um valor de "contoso" cria um nome de domínio de "contoso<six-random-characters>".< azureregion.cloudapp.azure.com>", em <que azureregion> é a região que contém o serviço. Opcionalmente, pode utilizar o parâmetro overwrite_existing_domain para substituir o leaf_domain_label existente. O exemplo seguinte demonstra como criar uma configuração que permite 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.

  • Quando utiliza um certificado personalizado que comprou, utiliza os parâmetros ssl_cert_pem_file, ssl_key_pem_file e ssl_cname . O ficheiro PEM com proteção de expressões pass não é suportado. O exemplo seguinte demonstra como utilizar ficheiros .pem para criar uma configuração que utiliza um certificado TLS/SSL que 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

Quando implementa no Azure Container Instances, fornece valores para parâmetros relacionados com TLS, como mostra o seguinte fragmento de código:

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 implementação do AKS com o certificado personalizado ou a implementação do ACI, tem de atualizar o registo DNS para apontar para o endereço IP do ponto final de classificação.

Importante

Quando utiliza um certificado da implementação do Microsoft para o AKS, não precisa de atualizar manualmente o valor DNS do cluster. O valor deve ser definido automaticamente.

Pode seguir os passos seguintes para atualizar o registo DNS para o seu nome de domínio personalizado:

  1. Obtenha o endereço IP do ponto final de classificação do URI do ponto final de classificação, que normalmente 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. Utilize as ferramentas da entidade de registo de nomes de domínio para atualizar o registo DNS do seu nome de domínio. O registo mapeia o FQDN (por exemplo, www.contoso.com) para o endereço IP. O registo tem de apontar para o endereço IP do ponto final de classificação.

    Dica

    A Microsoft não é responsável pela atualização do DNS para o seu nome ou certificado DNS personalizado. Tem de atualizá-lo com a sua entidade de registo de nomes de domínio.

  3. Após a atualização do registo DNS, pode validar a resolução de DNS com o comando nslookup custom-domain-name . Se o registo DNS for atualizado corretamente, o nome de domínio personalizado apontará para o endereço IP do ponto final de classificação.

    Pode haver um atraso de minutos ou horas até que os clientes possam resolver o nome de domínio, dependendo da entidade de registo e do "time to live" (TTL) que está configurado para o nome de domínio.

Para obter mais informações sobre a resolução de DNS com o Azure Machine Learning, veja Como utilizar a área 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. Utilize as informações nas secções seguintes para atualizar e renovar o certificado para modelos implementados no Azure Kubernetes Service:

Atualizar um certificado gerado pela Microsoft

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

Importante

  • Se o certificado existente ainda for válido, utilize 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 entrar em vigor.
  • Quando o serviço foi originalmente implementado, o leaf_domain_label é utilizado para criar um nome DNS com o padrão <leaf-domain-label>######.<azure-region>.cloudapp.azure.com. Para preservar o nome existente (incluindo os 6 dígitos gerados originalmente), utilize o valor original leaf_domain_label . Não inclua os 6 dígitos que foram gerados.

Utilizar 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:Extensão de 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, veja os seguintes documentos de referência:

Atualizar certificado personalizado

Se o certificado tiver sido gerado originalmente por uma autoridade de certificação, utilize os seguintes passos:

  1. Utilize a documentação fornecida pela autoridade de certificação para renovar o certificado. Este processo cria novos ficheiros de certificado.

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

    Utilizar 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:Extensão de 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, veja os seguintes documentos de referência:

Desativar o TLS

Para desativar o TLS para um modelo implementado no Azure Kubernetes Service, 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)

Passos seguintes

Aprenda a: