Uso de TLS para proteger un servicio web con Azure Machine Learning

SE APLICA A:SDK de Python azureml v1

En este artículo se muestra cómo proteger un servicio web implementado con Azure Machine Learning.

Se usa HTTPS para restringir el acceso a los servicios web y proteger los datos que los clientes envían. HTTPS le ayuda a proteger las comunicaciones entre un cliente y un servicio web mediante el cifrado de las comunicaciones entre los dos. El cifrado usa Seguridad de la capa de transporte (TLS). TLS se conoce a veces todavía como Capa de sockets seguros (SSL), que fue su predecesor.

Sugerencia

El SDK de Azure Machine Learning usa el término "SSL" para las propiedades relacionadas con las comunicaciones seguras. Esto no significa que su servicio web no use TLS. SSL es simplemente un término más comúnmente reconocido.

En concreto, los servicios web implementados a través de Azure Machine Learning admiten la versión 1.2 de TLS para AKS y ACI. En el caso de las implementaciones ACI, si está usando una versión anterior de TLS, se recomienda volver a realizar la implementación para obtener la versión más reciente de TLS.

La versión 1.3 de TLS para la inferencia entre Azure Machine Learning y AKS no es compatible.

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, vea el tema de Wikipedia Public key infrastructure (Infraestructura de clave pública).

Advertencia

Si no usa HTTPS para el servicio web, los datos que se envían hacia y desde el servicio podrían ser visibles para otros usuarios en Internet.

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.

Este es el proceso general para proteger un servicio web:

  1. Obtenga un nombre de dominio.

  2. Obtenga un certificado digital.

  3. Implemente o actualice el servicio web con el protocolo TLS habilitado.

  4. Actualice el DNS para que apunte al servicio web.

Importante

Si va a implementar en Azure Kubernetes Service (AKS), puede adquirir su propio certificado o usar un certificado proporcionado por Microsoft. Si usa un certificado de Microsoft, no es necesario obtener un nombre de dominio ni un certificado TLS/SSL. Para obtener más información, consulte la sección Habilitación de TLS e implementación de este artículo.

Hay ligeras diferencias al proteger los servicios web a través de los destinos de implementación.

Importante

Algunos de los comandos de la CLI de Azure de este artículo usan la extensión azure-cli-ml o v1 para Azure Machine Learning. La compatibilidad con la extensión v1 finalizará el 30 de septiembre de 2025. La extensión v1 se podrá instalar y usar hasta esa fecha.

Se recomienda pasar a la extensión ml, o v2, antes del 30 de septiembre de 2025. Para más información sobre la extensión v2, consulte Extensión de la CLI de Azure ML y SDK de Python v2.

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 nombre de dominio completo (FQDN) (como www.contoso.com) a la dirección IP que hospeda el servicio web.

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 (CA). Independientemente de dónde obtenga el certificado, se necesitan estos archivos:

  • Un certificado. El certificado debe contener la cadena de certificados completa y debe estar codificado en PEM.
  • Una clave. La clave debe estar codificada en PEM.

Cuando solicite un certificado, debe proporcionar el nombre de dominio completo (FQDN) de la dirección que quiere usar para el servicio web (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 servicio web. Si esas direcciones no coinciden, el cliente obtiene un mensaje de error.

Sugerencia

Si la entidad de certificación no puede proporcionar el certificado y la clave como archivos codificados en PEM, puede usar una utilidad 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.

Habilitación de TLS e implementación

En el caso de la implementación de Azure Container Service, puede habilitar la terminación de Seguridad de la capa de transporte al crear o adjuntar un clúster de Azure Container Service en el área de trabajo de Azure Machine Learning. En el momento de implementar el modelo de Azure Container Service, se puede deshabilitar la terminación de Seguridad de la capa de transporte con el objeto de configuración de implementación; de lo contrario, todas las implementaciones de modelos de Azure Container Service de forma predeterminada tendrán la terminación de Seguridad de la capa de transporte habilitada en el momento de conexión o creación de Azure Kubernetes Service.

Para la implementación de ACI, puede habilitar la terminación TLS en el momento de implementación del modelo con el objeto de configuración de implementación.

Implementación en Azure Kubernetes Service

Nota

La información de esta sección también se aplica al implementar un servicio web seguro para el diseñador. Si no está familiarizado con el uso del SDK para Python, consulte What is the Azure Machine Learning SDK for Python? (¿Qué es el SDK de Azure Machine Learning para Python?).

Cuando se crea o conecta un clúster de AKS en el área de trabajo de Azure Machine Learning, se puede habilitar la terminación de Seguridad de la capa de transporte con los objetos de configuración AksCompute.provisioning_configuration () y AksCompute.attach_configuration (). Ambos métodos devuelven un objeto de configuración que tiene un método enable_ssl y se puede usar el método enable_ssl para habilitar TLS.

TLS se puede habilitar con el certificado de Microsoft o con un certificado personalizado adquirido en una CA.

  • Cuando use un certificado de Microsoft, debe usar el parámetro leaf_domain_label. Este parámetro genera el nombre DNS para el servicio. Por ejemplo, el valor "contoso" crea el nombre de dominio "contoso<seis-caracteres-aleatorios>.<regiónAzure>.cloudapp.azure.com", donde <regiónAzure> es la región que contiene el servicio. Si lo desea, puede usar el parámetro overwrite_existing_domain para sobrescribir el leaf_domain_label existente. En el siguiente ejemplo se muestra cómo se crea una configuración que habilita una TLS con certificado de 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

    Si usa un certificado de Microsoft, no es necesario adquirir su propio nombre de dominio ni certificado.

  • Cuando use un certificado que haya comprado, emplee los parámetros ssl_cert_pem_file, ssl_key_pem_file y ssl_cname. No se admite el archivo PEM con protección de frase de contraseña. El ejemplo siguiente muestra cómo usar archivos .pem para crear una configuración que use un certificado TLS/SSL adquirido:

    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 más información acerca de enable_ssl, consulte AksProvisioningConfiguration.enable_ssl() y AksAttachConfiguration.enable_ssl().

Implementación en Azure Container Instances

Al implementar en Azure Container Instances, proporcione valores para los parámetros relacionados con TLS, como el siguiente 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 más información, consulte AciWebservice.deploy_configuration().

Actualización del DNS

Para realizar una implementación de Azure Container Service con un certificado o una implementación de ACI, debe actualizar el registro de DNS para que apunte a la dirección IP del punto de conexión de puntuación.

Importante

Cuando se usa un certificado de Microsoft para la implementación de Azure Container Service, no es preciso actualizar manualmente el valor de DNS para el clúster. El valor debe establecerse automáticamente.

Para actualizar el registro DNS para el nombre de dominio personalizado puede seguir estos pasos:

  1. Obtenga la dirección IP del punto de conexión de puntuación del identificador URI del punto de conexión 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.

  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 nombre de dominio completo (por ejemplo, www.contoso.com) a la dirección IP. El registro debe apuntar a la dirección IP del punto de conexión de puntuación.

    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 de puntuación.

    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 de las secciones siguientes para actualizar y renovar el certificado para los modelos implementados en Azure Kubernetes Service:

Actualización de un certificado generado por Microsoft

Si Microsoft ha generado el certificado originalmente (mediante leaf_domain_label para crear el servicio), se renueva automáticamente cuando resulta necesario. Si quiere renovarlo manualmente, use alguno de los ejemplos siguientes para actualizarlo:

Importante

  • Si el certificado existente sigue siendo válido, use renew=True (SDK) o --ssl-renew (CLI) para forzar que la configuración lo renueve. Esta operación tardará aproximadamente 5 horas en surtir efecto.
  • Cuando el servicio se implementó originalmente, leaf_domain_label se usa para crear un nombre DNS con el patrón <leaf-domain-label>######.<azure-region>.cloudapp.azure.com. Para conservar el nombre existente (incluidos los 6 dígitos generados originalmente), use el valor leaf_domain_label original. No incluya los 6 dígitos que se generaron.

Uso del 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)

Uso de la CLI

SE APLICA A:Extensión de ML de la CLI de 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 más información, consulte los siguientes documentos de referencia:

Actualización del certificado personalizado

Si una entidad de certificación generó originalmente el certificado, siga estos pasos:

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

  2. Use el SDK o la CLI para actualizar el servicio con el nuevo certificado:

    Uso del 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)
    

    Uso de la CLI

    SE APLICA A:Extensión de ML de la CLI de 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 más información, consulte los siguientes documentos de referencia:

Deshabilitación de TLS

Para deshabilitar TLS para un modelo implementado en Azure Kubernetes Service, cree un SslConfiguration con status="Disabled" y, a continuación, realice una actualización:

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)

Pasos siguientes

Obtenga información sobre cómo: