Configurar um ponto de extremidade online seguro com TLS/SSL

Este artigo mostra como proteger um ponto de extremidade online do Kubernetes criado por meio do Azure Machine Learning.

Você usa HTTPS para restringir o acesso a pontos de extremidade online e ajudar a proteger os dados enviados pelos clientes. O HTTPS encripta as comunicações entre um cliente e um ponto final online através do TLS (Transport Layer Security). TLS às vezes ainda é chamado de Secure Sockets Layer (SSL), que foi o antecessor do TLS.

Gorjeta

  • Especificamente, os pontos de extremidade online do Kubernetes oferecem suporte ao TLS versão 1.2 para o Serviço Kubernetes do Azure (AKS) e o Kubernetes habilitado para Azure Arc.
  • A versão 1.3 do TLS para inferência do Kubernetes do Azure Machine Learning não é suportada.

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 Wikipedia public_key_infrastructure.

Aviso

Se você não usa HTTPS para seus endpoints online, os dados enviados de e para o serviço podem ficar 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 .

Veja a seguir o processo geral para proteger um ponto final online:

  1. Obter um nome de domínio.

  2. Obter um certificado digital.

  3. Configurar o TLS/SSL na extensão do Azure Machine Learning.

  4. Atualizar o DNS com um nome de domínio completamente qualificado (FQDN) para apontar para o ponto final online.

Importante

Você precisa comprar seu próprio certificado para obter um nome de domínio ou certificado TLS/SSL e, em seguida, configurá-los na extensão do Azure Machine Learning. Para obter informações mais detalhadas, consulte as seções a seguir deste artigo.

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 FQDN (como www.contoso.com) para o endereço IP que hospeda seu ponto de extremidade online.

Para obter mais informações sobre como obter o endereço IP de seus pontos de extremidade online, consulte a seção Atualizar seu DNS com um FQDN deste artigo.

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. Independentemente de onde você obtém o certificado, você precisa dos seguintes arquivos:

  • Um certificado que contém toda a cadeia de certificados e é codificado pelo PEM
  • Uma chave codificada por PEM

Nota

Uma chave SSL em um arquivo PEM com proteção por frase secreta não é suportada.

Ao solicitar um certificado, você deve fornecer o FQDN do endereço que planeja usar para o ponto de extremidade online (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 ponto de extremidade online. Se esses endereços não corresponderem, o cliente receberá uma mensagem de erro.

Para obter mais informações sobre como configurar a banda IP com um FQDN, consulte a seção Atualizar seu DNS com um FQDN deste artigo.

Gorjeta

Se a autoridade de certificação não puder fornecer o certificado e a chave como arquivos codificados em PEM, você poderá usar uma ferramenta como 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.

Configurar o TLS/SSL na extensão do Azure Machine Learning

Para um ponto de extremidade online do Kubernetes definido para usar HTTPS de inferência para conexões seguras, você pode habilitar a terminação TLS com definições de configuração de implantação ao implantar a extensão do Aprendizado de Máquina do Azure em um cluster do Kubernetes.

No momento da implantação da extensão do Azure Machine Learning, a definição de allowInsecureConnections configuração é False por padrão. Para garantir uma implantação de extensão bem-sucedida, você precisa especificar a sslSecret definição de configuração ou uma combinação de sslKeyPemFile configurações protegidas por sslCertPemFile configuração. Caso contrário, você pode definir allowInsecureConnections=True para suportar HTTP e desabilitar a terminação TLS.

Nota

Para suportar o ponto de extremidade online HTTPS, allowInsecureConnections deve ser definido como False.

Para habilitar um ponto de extremidade HTTPS para inferência em tempo real, você precisa fornecer um certificado e uma chave TLS/SSL codificados em PEM. Há duas maneiras de especificar o certificado e a chave no momento da implantação para a extensão do Azure Machine Learning:

  • Especifique a definição de sslSecret configuração.
  • Especifique uma combinação de configurações protegidas por sslCertPemFile slKeyPemFile configuração.

Configurar sslSecret

A prática recomendada é salvar o certificado e a chave em um segredo do Kubernetes no azureml namespace.

Para configurar sslSecreto , você precisa salvar um segredo do Kubernetes em seu cluster Kubernetes no azureml namespace para armazenar cert.pem (certificado TLS/SSL codificado em PEM) e key.pem (chave TLS/SSL codificada em PEM).

O código a seguir é uma definição YAML de exemplo de um segredo TLS/SSL:

apiVersion: v1
data:
  cert.pem: <PEM-encoded SSL certificate> 
  key.pem: <PEM-encoded SSL key>
kind: Secret
metadata:
  name: <secret name>
  namespace: azureml
type: Opaque

Depois de salvar o segredo em seu cluster, você pode usar o seguinte comando da CLI do Azure para especificar sslSecret como o nome desse segredo do Kubernetes. (Este comando funcionará somente se você estiver usando o AKS.)

   az k8s-extension create --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config inferenceRouterServiceType=LoadBalancer sslSecret=<Kubernetes secret name> sslCname=<ssl cname> --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster

Configurar sslCertPemFile e sslKeyPemFile

Você pode especificar a sslCertPemFile definição de configuração como o caminho para o arquivo de certificado TLS/SSL codificado em PEM e a sslKeyPemFile definição de configuração como o caminho para o arquivo de chave TLS/SSL codificado em PEM.

O exemplo a seguir demonstra como usar a CLI do Azure para especificar arquivos PEM para a extensão do Azure Machine Learning que usa um certificado TLS/SSL que você comprou. O exemplo pressupõe que você esteja usando o AKS.

   az k8s-extension create --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config enableInference=True inferenceRouterServiceType=LoadBalancer sslCname=<ssl cname> --config-protected sslCertPemFile=<file-path-to-cert-PEM> sslKeyPemFile=<file-path-to-cert-KEY> --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster

Nota

  • Não é suportado um ficheiro PEM com proteção por frase de acesso.
  • Ambos sslCertPemFIle e sslKeyPemFIle usar parâmetros protegidos por configuração. Eles não configuram sslSecret e sslCertPemFile/sslKeyPemFile ao mesmo tempo.

Atualize seu DNS com um FQDN

Para a implementação de modelos num ponto final online do Kubernetes com um certificado personalizado, tem de atualizar o registo DNS para apontar para o endereço IP do ponto final online. O serviço de roteador de inferência do Azure Machine Learning (azureml-fe) fornece esse endereço IP. Para obter mais informações sobre azureml-feo , consulte Roteador de inferência do Managed Azure Machine Learning.

Para atualizar o registo DNS para o seu nome de domínio personalizado:

  1. Obtenha o endereço IP do ponto de extremidade online a partir do URI 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.

    Depois de configurar seu nome de domínio personalizado, ele substitui o endereço IP no URI de pontuação. Para clusters Kubernetes que usam LoadBalancer como o serviço de roteador de inferência, azureml-fe é exposto externamente por meio do balanceador de carga de um provedor de nuvem e terminação TLS/SSL. O endereço IP do ponto de extremidade online do Kubernetes é o endereço IP externo do azureml-fe serviço implantado no cluster.

    Se você usa o AKS, pode obter o endereço IP do portal do Azure. Vá para a página de recursos do AKS, vá para Serviço e entradas e encontre o serviço azureml-fe no namespace azuerml . Em seguida, você pode encontrar o endereço IP na coluna IP externo.

    Captura de ecrã a mostrar a adição de uma nova extensão ao cluster Kubernetes ativado para Azure Arc a partir do portal do Azure.

    Além disso, você pode executar o comando kubectl describe svc azureml-fe -n azureml Kubernetes em seu cluster para obter o endereço IP do LoadBalancer Ingress parâmetro na saída.

    Nota

    Para clusters Kubernetes que usam um ou nodePort clusterIP como o serviço de roteador de inferência, você precisa configurar sua própria solução de balanceamento de carga e terminação TLS/SSL para azureml-fe. Você também precisa obter o azureml-fe endereço IP do serviço no escopo do cluster.

  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 online.

    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 nslookup custom-domain-name comando. Se o registro DNS for atualizado corretamente, o nome de domínio personalizado apontará para o endereço IP do ponto de extremidade online.

    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, isso acontece todos os anos. Use as informações nas etapas a seguir para atualizar e renovar seu certificado para modelos implantados no Kubernetes (AKS e Kubernetes habilitados para Azure Arc):

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

  2. Atualize sua extensão do Azure Machine Learning e especifique os novos arquivos de certificado usando o az k8s-extension update comando.

    Se você usou um segredo do Kubernetes para configurar o TLS/SSL antes, primeiro precisará atualizar o segredo do Kubernetes com a nova configuração cert.pem e key.pem no cluster do Kubernetes. Em seguida, execute o comando extension update para atualizar o certificado:

       az k8s-extension update --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config inferenceRouterServiceType=LoadBalancer sslSecret=<Kubernetes secret name> sslCname=<ssl cname> --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster
    

    Se você configurou diretamente os arquivos PEM no comando extension deployment antes, precisará executar o comando extension update e especificar o caminho do novo arquivo PEM:

       az k8s-extension update --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config sslCname=<ssl cname> --config-protected sslCertPemFile=<file-path-to-cert-PEM> sslKeyPemFile=<file-path-to-cert-KEY> --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster
    

Desativar TLS

Para desabilitar o TLS para um modelo implantado no Kubernetes:

  1. Atualize a extensão do Azure Machine Learning com allowInsercureconnection definido como True.

  2. Remova a definição de sslCname configuração, juntamente com as definições de sslSecret configuração ou sslPem .

  3. Execute o seguinte comando da CLI do Azure no cluster do Kubernetes e execute uma atualização. Este comando pressupõe que você esteja usando o AKS.

       az k8s-extension update --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config enableInference=True inferenceRouterServiceType=LoadBalancer allowInsercureconnection=True --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster
    

Aviso

Por padrão, a implantação da extensão do Azure Machine Learning espera definições de configuração para suporte a HTTPS. Recomendamos suporte HTTP apenas para fins de desenvolvimento ou teste. A allowInsecureConnections=True definição de configuração fornece suporte HTTP.

Próximos passos

Aprenda a: