Compartir vía


Configuración de un punto de conexión en línea seguro con TLS/SSL

En este artículo se muestra cómo proteger un punto de conexión en línea de Kubernetes creado mediante Azure Machine Learning.

Se usa HTTPS para restringir el acceso a los puntos de conexión en línea y ayudar a proteger los datos enviados por los clientes. HTTPS cifra las comunicaciones entre un cliente y un punto de conexión en línea con la Seguridad de la capa de transporte (TLS). A veces, a TLS se la denomina todavía Capa de sockets seguros (SSL), que fue su predecesor.

Sugerencia

  • En concreto, los puntos de conexión en línea de Kubernetes admiten la versión 1.2 de TLS para Azure Kubernetes Service (AKS) y Kubernetes habilitado para Azure Arc.
  • La versión 1.3 de TLS no es compatible con la inferencia de Kubernetes en Azure Machine Learning.

TLS y SSL dependen ambos de los certificados digitales, que ayudan con la comprobación de la identidad y el cifrado. Para obtener más información sobre cómo funcionan los certificados digitales, consulte el tema de Wikipedia public_key_infrastructure (Infraestructura de clave pública).

Advertencia

Si no usa HTTPS para los puntos de conexión en línea, otros usuarios de internet podrían ver los datos enviados o recibidos por el servicio.

HTTPS también permite al cliente comprobar la autenticidad del servidor al que se está conectando. Esta característica protege a los clientes contra ataques de tipo Man in the middle.

El siguiente proceso general es para proteger un punto de conexión en línea:

  1. Obtenga un nombre de dominio.

  2. Obtenga un certificado digital.

  3. Configure TLS/SSL en la extensión de Azure Machine Learning.

  4. Actualice el DNS con un nombre de dominio completo (FQDN) para que apunte al punto de conexión en línea.

Importante

Debe comprar su propio certificado para obtener un nombre de dominio o un certificado TLS/SSL y, después, configurarlos en la extensión de Azure Machine Learning. Para una información más detallada, consulte las siguientes secciones de este artículo.

Obtención de un nombre de dominio

Si todavía no tiene un nombre de dominio, compre uno en un registrador de nombres de dominio. El proceso y los precios difieren entre los registradores. El registrador proporciona herramientas para administrar el nombre de dominio. Estas herramientas se usan para asignar un FQDN (como www.contoso.com) a la dirección IP que hospeda el punto de conexión en línea.

Para más información sobre cómo obtener la dirección IP de los puntos de conexión en línea, consulte la sección Actualización de DNS con un FQDN que se encuentra en este artículo.

Obtención de un certificado TLS/SSL

Hay muchas maneras de obtener un certificado TLS/SSL (certificado digital). La más común es comprar uno en una entidad de certificación. Independientemente de dónde obtenga el certificado, se necesitan estos archivos:

  • Un certificado que contiene la cadena de certificados completa y está codificado en PEM
  • Una clave codificada en PEM

Nota

No se admite una clave SSL en un archivo PEM con protección de frase de contraseña.

Cuando solicite un certificado, debe proporcionar el FQDN de la dirección que pretende usar para el punto de conexión en línea (por ejemplo, www.contoso.com). La dirección que aparece en el certificado y la que usan los clientes se comparan para comprobar la identidad del punto de conexión en línea. Si esas direcciones no coinciden, el cliente obtiene un mensaje de error.

Para más información sobre cómo configurar la banda IP con un FQDN, consulte la sección Actualización de DNS con un FQDN que se encuentra en este artículo.

Sugerencia

Si la entidad de certificación no puede proporcionar el certificado y la clave como archivos codificados en PEM, puede usar una herramienta como OpenSSL para cambiar el formato.

Advertencia

Use certificados autofirmados solo para desarrollo. No deben usarse en entornos de producción. Los certificados autofirmados pueden provocar problemas en las aplicaciones cliente. Para más información, consulte la documentación de las bibliotecas de red utilizadas en la aplicación cliente.

Configure TLS/SSL en la extensión de Azure Machine Learning

En el caso de un punto de conexión en línea de Kubernetes que se establece para usar HTTPS de inferencia para conexiones seguras, puede habilitar la terminación TLS con opciones de configuración de implementación al implementar la extensión de Azure Machine Learning en un clúster de Kubernetes.

En el momento de la implementación de la extensión de Azure Machine Learning, el valor de configuración allowInsecureConnections es False de forma predeterminada. Para garantizar una implementación correcta de la extensión, debe especificar el valor de configuración sslSecret o una combinación de sslKeyPemFile y sslCertPemFile, que son opciones protegidas por la configuración. De lo contrario, puede establecer allowInsecureConnections=True para admitir HTTP y deshabilitar la terminación TLS.

Nota

Para admitir el punto de conexión en línea de HTTPS, allowInsecureConnections debe establecerse en False.

Para habilitar el punto de conexión HTTPS para la inferencia en tiempo real, debe proporcionar un certificado TLS/SSL codificado en PEM con la clave. Hay dos maneras de especificar el certificado y la clave en el momento de la implementación de la extensión de Azure Machine Learning:

  • Especifique el valor de configuración sslSecret.
  • Especifique una combinación de valores sslCertPemFile y slKeyPemFile, protegidos por la configuración.

Configuración de sslSecret

El procedimiento recomendado es guardar el certificado y la clave en un secreto de Kubernetes en el espacio de nombres azureml.

Para configurar sslSecret, debe guardar un secreto de Kubernetes en el clúster de Kubernetes en el espacio de nombres azureml para almacenar cert.pem (certificado TLS/SSL codificado en PEM) y key.pem (clave TLS/SSL codificada en PEM).

El código siguiente es una definición YAML de ejemplo de un secreto 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

Después de guardar el secreto en el clúster, puede usar el siguiente comando de la CLI de Azure para especificar sslSecret como nombre de este secreto de Kubernetes. (Este comando solo funcionará si está usando 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

Configuración de sslCertPemFile y sslKeyPemFile

Puede especificar el valor de configuración sslCertPemFile para que sea la ruta de acceso al archivo de certificado TLS/SSL codificado en PEM y el valor de configuración sslKeyPemFile para que sea la ruta de acceso al archivo de clave TLS/SSL codificado en PEM.

En el ejemplo siguiente se muestra cómo usar la CLI de Azure para especificar archivos .PEM en la extensión de Azure Machine Learning que usa un certificado TLS/SSL que compró. En el ejemplo se presupone que está usando 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

  • No se admite un archivo PEM con protección de frase de contraseña.
  • Tanto sslCertPemFIle como sslKeyPemFIle usan parámetros protegidos por la configuración. No configuran sslSecret y sslCertPemFile/sslKeyPemFile al mismo tiempo.

Actualización de DNS con un FQDN

Para la implementación de modelos en un punto de conexión en línea de Kubernetes con un certificado personalizado, debe actualizar el registro DNS para que apunte a la dirección IP del punto de conexión en línea. El servicio de enrutador de inferencia de Azure Machine Learning (azureml-fe) proporciona esta dirección IP. Para más información sobre azureml-fe, consulte Enrutador de inferencia de Azure Machine Learning administrado.

Para actualizar el registro DNS del nombre de dominio personalizado:

  1. Obtenga la dirección IP del punto de conexión en línea del identificador URI de puntuación, que normalmente tiene el formato http://104.214.29.152:80/api/v1/service/<service-name>/score. En este ejemplo, la dirección IP es 104.214.29.152.

    Después de configurar el nombre de dominio personalizado, reemplaza la dirección IP en el URI de puntuación. En el caso de los clústeres de Kubernetes que usan LoadBalancer como servicio de enrutador de inferencia, azureml-fe se expone externamente a través del equilibrador de carga de un proveedor de nube y la terminación TLS/SSL. La dirección IP del punto de conexión en línea de Kubernetes es la dirección IP externa del servicio azureml-fe implementado en el clúster.

    Si usa AKS, puede obtener la dirección IP de Azure Portal. Diríjase a la página del recurso de AKS, vaya a Servicio y entradas y busque el servicio azureml-fe en el espacio de nombres azuerml. Ahí puede encontrar la dirección IP en la columna IP externa.

    Captura de pantalla que muestra la adición de una nueva extensión al clúster de Kubernetes habilitado para Arc en Azure Portal.

    Además, puede ejecutar el comando kubectl describe svc azureml-fe -n azureml de Kubernetes en el clúster para obtener la dirección IP del parámetro LoadBalancer Ingress en la salida.

    Nota

    En el caso de los clústeres de Kubernetes que usan nodePort o clusterIP como servicio de enrutador de inferencia, debe configurar su propia solución de equilibrio de carga y la terminación TLS/SSL de azureml-fe. También debe obtener la dirección IP del servicio azureml-fe en el ámbito del clúster.

  2. Use las herramientas del registrador de nombres de dominio para actualizar el registro de DNS de su nombre de dominio. El registro asigna el FQDN (por ejemplo, www.contoso.com) a la dirección IP. El registro debe apuntar a la dirección IP del punto de conexión en línea.

    Sugerencia

    Microsoft no es responsable de actualizar el DNS para el nombre DNS o certificado personalizados. Debe actualizarlo con el registrador de nombres de dominio.

  3. Después de la actualización del registro de DNS, puede validar la resolución de DNS mediante el comando nslookup custom-domain-name. Si el registro de DNS se actualiza correctamente, el nombre de dominio personalizado apuntará a la dirección IP del punto de conexión en línea.

    Puede haber una demora de varios minutos o de horas antes de que los clientes puedan resolver el nombre de dominio, en función del registrador y del período de vida (TTL) configurado para el nombre de dominio.

Para obtener más información sobre la resolución DNS con Azure Machine Learning, consulte Uso del área de trabajo con un servidor DNS personalizado.

Actualización del certificado TLS/SSL

Los certificados TLS/SSL expiran y se deben renovar. Normalmente esto sucede cada año. Utilice la información que aparece en los siguientes pasos para actualizar y renovar el certificado de los modelos implementados en Kubernetes (AKS y Kubernetes habilitado para Azure Arc):

  1. Use la documentación de la entidad de certificación para renovar el certificado. Este proceso crea nuevos archivos de certificado.

  2. Actualice la extensión de Azure Machine Learning y especifique los nuevos archivos de certificado mediante el comando az k8s-extension update.

    Si ha usado un secreto de Kubernetes para configurar TLS/SSL antes, debe actualizar primero el secreto de Kubernetes con la nueva configuración de cert.pem y key.pem en el clúster de Kubernetes. A continuación, ejecute el comando de actualización de extensión para actualizar el 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
    

    Si ya ha configurado directamente los archivos PEM en el comando de implementación de la extensión, debe ejecutar el comando de actualización de la extensión y especificar la nueva ruta de acceso de archivos 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
    

Deshabilitación de TLS

Para deshabilitar TLS en un modelo implementado en Kubernetes:

  1. Actualice la extensión de Azure Machine Learning con allowInsercureconnection establecido en True.

  2. Quite el valor de configuración sslCname, junto con los valores de configuración sslSecret o sslPem.

  3. Ejecute el siguiente comando de la CLI de Azure en el clúster de Kubernetes y, a continuación, realice una actualización. Este comando presupone que está usando 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
    

Advertencia

De forma predeterminada, la implementación de la extensión de Azure Machine Learning espera valores de configuración para la compatibilidad con HTTPS. Se recomienda admitir HTTP solo con fines de desarrollo o pruebas. El valor de configuración allowInsecureConnections=True proporciona compatibilidad con HTTP.

Pasos siguientes

Obtenga información sobre cómo: