使用 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

警告

如果您的線上端點未使用 HTTPS,則網際網路上的其他人可能會看到來往該服務的資料。

HTTPS 也可讓用戶端驗證其所連線之伺服器的真確性。 這項功能可保護用戶端抵禦中間人攻擊。

以下是用來保護線上端點的一般程序:

  1. 取得網域名稱

  2. 取得數位憑證

  3. 在 Azure Machine Learning 延伸模組中設定 TLS/SSL

  4. 使用完整網域名稱 (FQDN) 更新 DNS,以指向線上端點

重要

您必須購買自己的憑證以取得網域名稱或 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 組態設定或 sslKeyPemFilesslCertPemFile 組態保護設定的組合。 否則,您可以設定 allowInsecureConnections=True 以支援 HTTP 並停用 TLS 終止。

注意

若要支援 HTTPS 線上端點,必須將 allowInsecureConnections 設定為 False

若要啟用 HTTPS 端點以進行即時推斷,您必須提供 PEM 編碼的 TLS/SSL 憑證和金鑰。 有兩個方式可在部署階段指定 Azure Machine Learning 延伸模組的憑證和金鑰:

  • 指定 sslSecret 組態設定。
  • 指定 sslCertPemFileslKeyPemFile 組態保護設定的組合。

設定 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 檔案。
  • sslCertPemFIlesslKeyPemFIle 都使用受設定保護的參數。 其不會同時設定 sslSecretsslCertPemFile/sslKeyPemFile

使用 FQDN 更新您的 DNS

若要使用自訂憑證在 Kubernetes 線上端點上進行模型部署,您必須更新 DNS 記錄,以指向線上端點的 IP 位址。 Azure Machine Learning 推斷路由器服務 (azureml-fe) 提供此 IP 位址。 如需 azureml-fe 的詳細資訊,請參閱受控 Azure Machine Learning 推斷路由器

若要更新您的自訂網域名稱的 DNS 記錄:

  1. 從評分端點 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 位址。

    Screenshot of adding a new extension to the Azure Arc-enabled Kubernetes cluster from the Azure portal.

    此外,您可以在叢集中執行 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 Machine Learning 的 DNS 解析,請參閱如何搭配自訂 DNS 伺服器使用工作區

更新 TLS/SSL 憑證

TLS/SSL 憑證過期,必須更新。 通常每年都會發生。 使用下列步驟中的資訊,針對部署至 Kubernetes (AKS 和啟用 Azure Arc 的 Kubernetes) 的模型更新和續約憑證:

  1. 使用來自憑證授權單位的文件來更新憑證。 此程序會建立新的憑證檔案。

  2. 更新您的 Azure Machine Learning 延伸模組,並使用 az k8s-extension update 命令來指定新的憑證檔案。

    如果您之前使用 Kubernetes 祕密來設定 TLS/SSL,必須先使用 Kubernetes 叢集中的新 cert.pemkey.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 Machine Learning 延伸模組。

  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 Machine Learning 延伸模組部署需要 HTTPS 支援的組態設定。 建議僅針對開發或測試目的提供 HTTP 支援。 allowInsecureConnections=True 組態設定提供 HTTP 支援。

下一步

了解如何: