使用 TLS/SSL 配置安全的联机终结点

本文介绍如何保护通过 Azure 机器学习创建的 Kubernetes 联机终结点。

使用 HTTPS 来限制对联机终结点的访问并帮助保护客户端提交的数据。 HTTPS 使用传输层安全性 (TLS) 来加密客户端和联机终结点之间的通信。 TLS 有时仍称为安全套接字层 (SSL),这是 TLS 的前身。

提示

  • 具体来说,Kubernetes 联机终结点支持适用于 Azure Kubernetes 服务 (AKS) 的 TLS 版本 1.2。
  • 不支持对 Azure 机器学习 Kubernetes 推理使用 TLS 版本 1.3。

TLS 和 SSL 均依赖数字证书,这有助于加密和身份验证。 有关数字证书工作原理的详细信息,请参阅维基百科主题:public_key_infrastructure

警告

如果联机终结点未使用 HTTPS,则服务上收发的数据可能对 Internet 上的其他人可见。

HTTPS 还允许客户端验证它连接到的服务器的真实性。 此功能可以防止客户端免受中间人攻击。

保护联机终结点的常规过程如下:

  1. 获取域名

  2. 获取数字证书

  3. 在 Azure 机器学习扩展中配置 TLS/SSL

  4. 使用完全限定的域名 (FQDN) 更新 DNS 以指向联机终结点

重要

你需要购买自己的证书以获取域名或 TLS/SSL 证书,然后在 Azure 机器学习扩展中对其进行配置。 有关更多详细信息,请参阅本文的后面部分。

获取域名

如果还没有属于自己的域名,请从域名注册机构购买一个。 各注册机构的购买过程和价格有所不同。 注册机构提供管理域名的工具。 可使用这些工具将 FQDN(例如 www.contoso.com)映射到托管联机终结点的 IP 地址。

有关如何获取联机终结点的 IP 地址的详细信息,请参阅本文的使用 FQDN 更新 DNS 部分。

获取 TLS/SSL 证书

可通过多种方式获取 TLS/SSL 证书(数字证书)。 最常用的方式是从证书颁发机构购买。 无论证书来自哪里,都需要以下文件:

  • 包含完整证书链并经过 PEM 编码的证书
  • PEM 编码的密钥

注意

不支持受通行短语保护的 PEM 文件中的 SSL 密钥。

请求证书时,必须提供计划用于联机终结点的地址的 FQDN(如 www.contoso.com)。 会对比证书上标记的地址和客户端使用的地址,以验证联机终结点的身份。 如果这两个地址不匹配,客户端会收到一条错误消息。

有关如何使用 FQDN 配置 IP 绑定的详细信息,请参阅本文的使用 FQDN 更新 DNS 部分。

提示

如果证书颁发机构不能以 PEM 编码文件的方式提供证书和密钥,可使用 OpenSSL 等工具来更改格式。

警告

自签名证书只能用于开发。 请勿在生产环境中使用这些证书。 自签名证书可能会导致客户端应用程序出现问题。 有关详细信息,请参阅客户端应用程序使用的网络库的文档。

在 Azure 机器学习扩展中配置 TLS/SSL

对于设置为使用推理 HTTPS 进行安全连接的 Kubernetes 联机终结点,你可以在 Kubernetes 群集中部署 Azure 机器学习扩展时使用部署配置设置启用 TLS 终止。

在部署 Azure 机器学习扩展时,allowInsecureConnections 配置设置默认为 False。 为确保扩展部署成功,需要指定 sslSecret 配置设置,或指定 sslKeyPemFilesslCertPemFile 配置保护的设置组合。 否则,可以设置 allowInsecureConnections=True 以支持 HTTP 并禁用 TLS 终止。

注意

若要支持 HTTPS 联机终结点,必须将 allowInsecureConnections 设置为 False

若要启用 HTTPS 终结点进行实时推理,需要提供 PEM 编码的 TLS/SSL 证书和密钥。 在部署 Azure 机器学习扩展时,可通过两种方式指定证书和密钥:

  • 指定 sslSecret 配置设置。
  • 指定 sslCertPemFileslKeyPemFile 配置保护的设置组合。

配置 sslSecret

最佳做法是将证书和密钥保存在 azureml 命名空间中的 Kubernetes 机密中。

若要配置 sslSecret,需要在 azureml 命名空间的 Kubernetes 群集中保存一个 Kubernetes 机密,以存储 cert.pem(PEM 编码的 TLS/SSL 证书)和 key.pem(PEM 编码的 TLS/SSL 密钥)。

以下代码是 TLS/SSL 机密的示例 YAML 定义:

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

将机密保存在群集中后,可以使用以下 Azure CLI 命令将 sslSecret 指定为此 Kubernetes 机密的名称。 (仅当使用 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

配置 sslCertPemFile 和 sslKeyPemFile

可以将 sslCertPemFile 配置设置指定为 PEM 编码的 TLS/SSL 证书文件的路径,并将 sslKeyPemFile 配置设置指定为 PEM 编码的 TLS/SSL 密钥文件的路径。

以下示例演示了如何使用 Azure CLI 将 PEM 文件指定给使用你购买的 TLS/SSL 证书的 Azure 机器学习扩展。 该示例假设你正在使用 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

注意

  • 不支持受通行短语保护的 PEM 文件。
  • sslCertPemFIlesslKeyPemFIle 都使用配置保护的参数。 它们不会同时配置 sslSecretsslCertPemFile/sslKeyPemFile

使用 FQDN 更新 DNS

若要使用自定义证书在 Kubernetes 联机终结点上进行模型部署,必须更新 DNS 记录,使其指向联机终结点的 IP 地址。 Azure 机器学习推理路由器服务 (azureml-fe) 提供此 IP 地址。 有关 azureml-fe 的详细信息,请参阅托管的 Azure 机器学习推理路由器

若要更新自定义域名的 DNS 记录,请执行以下操作:

  1. 从评分 URI(其格式通常为 http://104.214.29.152:80/api/v1/service/<service-name>/score)获取联机终结点的 IP 地址。 在此示例中,IP 地址为 104.214.29.152。

    配置自定义域名后,它将替换评分 URI 中的 IP 地址。 对于使用 LoadBalancer 作为推理路由器服务的 Kubernetes 群集,将通过云提供商的负载均衡器和 TLS/SSL 终止向外部公开 azureml-fe。 Kubernetes 联机终结点的 IP 地址是群集中部署的 azureml-fe 服务的外部 IP 地址。

    如果使用 AKS,可以从 Azure 门户获取 IP 地址。 转到 AKS 资源页,转到“服务和入口”,在“azuerml”命名空间下找到“azureml-fe”服务。 然后可以在“外部 IP”列中找到所需的 IP 地址。

    从 Azure 门户向已启用 Azure Arc 的 Kubernetes 群集添加新扩展的屏幕截图。

    此外,可以在群集中运行 Kubernetes 命令 kubectl describe svc azureml-fe -n azureml,从输出中的 LoadBalancer Ingress 参数获取 IP 地址。

    注意

    对于使用 nodePortclusterIP 作为推理路由器服务的 Kubernetes 群集,需要为 azureml-fe 设置你自己的负载均衡解决方案和 TLS/SSL 终止。 还需要获取群集范围内的 azureml-fe 服务的 IP 地址。

  2. 使用域名注册机构的工具来更新域名的 DNS 记录。 该记录将 FQDN(如 www.contoso.com)映射到 IP 地址。 该记录必须指向联机终结点的 IP 地址。

    提示

    Microsoft 不负责更新自定义 DNS 名称或证书的 DNS。 必须用你的域名注册器来进行更新。

  3. 更新 DNS 记录后,可以使用 nslookup custom-domain-name 命令验证 DNS 解析。 如果 DNS 记录已正确更新,自定义域名将指向联机终结点的 IP 地址。

    可能延迟几分钟到几小时之后客户端才能解析域名,具体取决于注册机构和为域名配置的生存时间 (TTL)。

有关使用 Azure 机器学习进行 DNS 解析的详细信息,请参阅如何将工作区用于自定义 DNS 服务器

更新 TLS/SSL 证书

TLS/SSL 证书已过期,必须续订。 通常每年都会发生这种情况。 使用以下步骤中的信息为部署到 Kubernetes (AKS) 的模型更新和续订证书:

  1. 使用证书颁发机构提供的文档来续订证书。 此过程将创建新的证书文件。

  2. 使用 az k8s-extension update 命令更新 Azure 机器学习扩展并指定新的证书文件。

    如果你以前使用 Kubernetes 机密配置了 TLS/SSL,则需要先使用 Kubernetes 群集中的新 cert.pem 和 key.pem 配置更新 Kubernetes 机密。 然后运行扩展更新命令以更新证书:

       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
    

    如果你以前在扩展部署命令中直接配置了 PEM 文件,则需要运行扩展更新命令并指定新 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
    

禁用 TLS

若要为部署到 Kubernetes 的模型禁用 TLS,请执行以下操作:

  1. allowInsercureconnection 设置为 True,然后更新 Azure 机器学习扩展。

  2. 删除 sslCname 配置设置以及 sslSecretsslPem 配置设置。

  3. 在 Kubernetes 群集中运行以下 Azure CLI 命令,然后执行更新。 此命令假设你正在使用 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
    

警告

默认情况下,Azure 机器学习扩展部署要求为 HTTPS 支持提供配置设置。 我们建议仅将 HTTP 支持用于开发或测试目的。 allowInsecureConnections=True 配置设置提供 HTTP 支持。

后续步骤

了解如何: