使用 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。
保护联机终结点的常规过程如下:
重要
你需要购买自己的证书以获取域名或 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
配置设置,或指定 sslKeyPemFile
和 sslCertPemFile
配置保护的设置组合。 否则,可以设置 allowInsecureConnections=True
以支持 HTTP 并禁用 TLS 终止。
注意
若要支持 HTTPS 联机终结点,必须将 allowInsecureConnections
设置为 False
。
若要启用 HTTPS 终结点进行实时推理,需要提供 PEM 编码的 TLS/SSL 证书和密钥。 在部署 Azure 机器学习扩展时,可通过两种方式指定证书和密钥:
- 指定
sslSecret
配置设置。 - 指定
sslCertPemFile
和slKeyPemFile
配置保护的设置组合。
配置 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 文件。
sslCertPemFIle
和sslKeyPemFIle
都使用配置保护的参数。 它们不会同时配置sslSecret
和sslCertPemFile
/sslKeyPemFile
。
使用 FQDN 更新 DNS
若要使用自定义证书在 Kubernetes 联机终结点上进行模型部署,必须更新 DNS 记录,使其指向联机终结点的 IP 地址。 Azure 机器学习推理路由器服务 (azureml-fe
) 提供此 IP 地址。 有关 azureml-fe
的详细信息,请参阅托管的 Azure 机器学习推理路由器。
若要更新自定义域名的 DNS 记录,请执行以下操作:
从评分 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 地址。
此外,可以在群集中运行 Kubernetes 命令
kubectl describe svc azureml-fe -n azureml
,从输出中的LoadBalancer Ingress
参数获取 IP 地址。注意
对于使用
nodePort
或clusterIP
作为推理路由器服务的 Kubernetes 群集,需要为azureml-fe
设置你自己的负载均衡解决方案和 TLS/SSL 终止。 还需要获取群集范围内的azureml-fe
服务的 IP 地址。使用域名注册机构的工具来更新域名的 DNS 记录。 该记录将 FQDN(如
www.contoso.com
)映射到 IP 地址。 该记录必须指向联机终结点的 IP 地址。提示
Microsoft 不负责更新自定义 DNS 名称或证书的 DNS。 必须用你的域名注册器来进行更新。
更新 DNS 记录后,可以使用
nslookup custom-domain-name
命令验证 DNS 解析。 如果 DNS 记录已正确更新,自定义域名将指向联机终结点的 IP 地址。可能延迟几分钟到几小时之后客户端才能解析域名,具体取决于注册机构和为域名配置的生存时间 (TTL)。
有关使用 Azure 机器学习进行 DNS 解析的详细信息,请参阅如何将工作区用于自定义 DNS 服务器。
更新 TLS/SSL 证书
TLS/SSL 证书已过期,必须续订。 通常每年都会发生这种情况。 使用以下步骤中的信息为部署到 Kubernetes (AKS) 的模型更新和续订证书:
使用证书颁发机构提供的文档来续订证书。 此过程将创建新的证书文件。
使用
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,请执行以下操作:
将
allowInsercureconnection
设置为True
,然后更新 Azure 机器学习扩展。删除
sslCname
配置设置以及sslSecret
或sslPem
配置设置。在 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 支持。
后续步骤
了解如何: