使用 TLS/SSL 設定安全的線上端點
本文說明如何保護透過 Azure Machine Learning 建立的 Kubernetes 線上端點。
您可以使用 HTTPS 來限制對線上端點的存取,並協助保護用戶端提交的資料。 HTTPS 會使用傳輸層安全性 (TLS) 來加密用戶端與線上端點之間的通訊。 TLS 有時仍稱為安全通訊端層 (SSL),也就是 TLS 的前身。
提示
- 具體而言,Kubernetes 線上端點針對 Azure Kubernetes Service (AKS) 和已啟用 Azure Arc 的 Kubernetes 支援 TLS 版本 1.2。
- 不支援對 Azure Machine Learning Kubernetes 推斷使用 TLS 版本 1.3。
TLS 和 SSL 都依賴數位憑證,其可協助進行加密和身分識別驗證。 如需有關數位憑證如何運作的詳細資訊,請參閱 Wikipedia 主題 public_key_infrastructure。
以下是用來保護線上端點的一般程序:
重要
您必須購買自己的憑證以取得網域名稱或 TLS/SSL 憑證,然後在 Azure Machine Learning 延伸模組中加以設定。 如需詳細資訊,請參閱本文中下列各節。
取得網域名稱
如果您還沒有自己的網域名稱,請向網域名稱註冊機構購買。 註冊機構之間的流程和價格會有所不同。 註冊機構會提供管理網域名稱的工具。 您可以使用這些工具,將 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 Machine Learning 延伸模組中設定 TLS/SSL
針對設定為使用推斷 HTTPS 進行安全連線的 Kubernetes 線上端點,您可以在 Kubernetes 叢集中部署 Azure Machine Learning 延伸模組時,使用部署組態設定啟用 TLS 終止。
在 Azure Machine Learning 延伸模組的部署階段,allowInsecureConnections
組態設定預設為 False
。 若要確保延伸模組部署成功,您必須指定 sslSecret
組態設定或 sslKeyPemFile
與 sslCertPemFile
組態保護設定的組合。 否則,您可以設定 allowInsecureConnections=True
以支援 HTTP 並停用 TLS 終止。
注意
若要支援 HTTPS 線上端點,必須將 allowInsecureConnections
設定為 False
。
若要啟用 HTTPS 端點以進行即時推斷,您必須提供 PEM 編碼的 TLS/SSL 憑證和金鑰。 有兩個方式可在部署階段指定 Azure Machine Learning 延伸模組的憑證和金鑰:
- 指定
sslSecret
組態設定。 - 指定
sslCertPemFile
與slKeyPemFile
組態保護設定的組合。
設定 sslSecret
最佳做法是在 azureml
命名空間中儲存 Kubernetes 秘密中的憑證和金鑰。
若要設定 sslSecret
,您必須將 Kubernetes 祕密儲存在 azureml
命名空間的 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
您可以指定做為 PEM 編碼 TLS/SSL 憑證檔案路徑的 sslCertPemFile
組態設定,以及要做為 PEM 編碼 TLS/SSL 金鑰檔案路徑的 sslKeyPemFile
組態設定。
下列範例示範如何使用 Azure CLI 來指定使用您所購買 TLS/SSL 憑證的 Azure Machine Learning 延伸模組的 PEM 檔案。 該範例假設您使用 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 Machine Learning 推斷路由器服務 (azureml-fe
) 提供此 IP 位址。 如需 azureml-fe
的詳細資訊,請參閱受控 Azure Machine Learning 推斷路由器。
若要更新您的自訂網域名稱的 DNS 記錄:
從評分端點 URI 取得線上端點的 IP 位址,其格式通常為
http://104.214.29.152:80/api/v1/service/<service-name>/score
。 在此範例中,IP 位址是 104.214.29.152。設定自訂網域名稱之後,其會取代評分 URI 中的 IP 位址。 針對使用
LoadBalancer
做為推斷路由器服務的 Kubernetes 叢集,azureml-fe
會透過雲端提供者的負載平衡器和 TLS/SSL 終止向外部公開。 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 Machine Learning 的 DNS 解析,請參閱如何搭配自訂 DNS 伺服器使用工作區。
更新 TLS/SSL 憑證
TLS/SSL 憑證過期,必須更新。 通常每年都會發生。 使用下列步驟中的資訊,針對部署至 Kubernetes (AKS 和啟用 Azure Arc 的 Kubernetes) 的模型更新和續約憑證:
使用來自憑證授權單位的文件來更新憑證。 此程序會建立新的憑證檔案。
更新您的 Azure Machine Learning 延伸模組,並使用
az k8s-extension update
命令來指定新的憑證檔案。如果您之前使用 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 Machine Learning 延伸模組。移除
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 Machine Learning 延伸模組部署需要 HTTPS 支援的組態設定。 建議僅針對開發或測試目的提供 HTTP 支援。 allowInsecureConnections=True
組態設定提供 HTTP 支援。
下一步
了解如何: