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:
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
yslKeyPemFile
, 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
comosslKeyPemFIle
usan parámetros protegidos por la configuración. No configuransslSecret
ysslCertPemFile
/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:
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 servicioazureml-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.
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ámetroLoadBalancer Ingress
en la salida.Nota
En el caso de los clústeres de Kubernetes que usan
nodePort
oclusterIP
como servicio de enrutador de inferencia, debe configurar su propia solución de equilibrio de carga y la terminación TLS/SSL deazureml-fe
. También debe obtener la dirección IP del servicioazureml-fe
en el ámbito del clúster.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.
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):
Use la documentación de la entidad de certificación para renovar el certificado. Este proceso crea nuevos archivos de certificado.
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:
Actualice la extensión de Azure Machine Learning con
allowInsercureconnection
establecido enTrue
.Quite el valor de configuración
sslCname
, junto con los valores de configuraciónsslSecret
osslPem
.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: