TLS/SSL を使用してセキュリティで保護されたオンライン エンドポイントを構成する

この記事では、Azure Machine Learning で作成された Kubernetes オンライン エンドポイントをセキュリティで保護する方法について説明します。

HTTPS を使用してオンライン エンドポイントへのアクセスを制限し、クライアントが送信するデータをセキュリティで保護できます。 HTTPS では、トランスポート層セキュリティ (TLS) を使用して、クライアントとオンライン エンドポイント間の通信が暗号化されます。 TLS は、現在も、TLS の前身である Secure Sockets Layer (SSL) と呼ばれることがあります。

ヒント

  • 具体的には、Kubernetes オンライン エンドポイントでは、Azure Kubernetes Service (AKS) と Azure Arc 対応 Kubernetes 向けの TLS バージョン 1.2 がサポートされています。
  • Azure Machine Learning Kubernetes 推論の TLS バージョン 1.3 はサポートされていません。

TLS と SSL の両方とも、"デジタル証明書" に依存しています。デジタル証明書は、暗号化の実行と ID の検証に役立ちます。 デジタル証明書のしくみの詳細については、ウィキペディアの「public_key_infrastructure (公開鍵基盤)」のトピックを参照してください。

警告

オンライン エンドポイントに HTTPS を使用しない場合は、そのサービスとの間で送受信されるデータがインターネット上の他のユーザーに表示される場合があります。

HTTPS により、接続先のサーバーの信頼性をクライアントから確認することもできます。 この機能は、中間者攻撃からクライアントを保護します。

オンライン エンドポイントをセキュリティで保護する一般的なプロセスは次のとおりです。

  1. ドメイン名を取得します

  2. デジタル証明書を取得します

  3. Azure Machine Learning 拡張機能で TLS/SSL を構成します

  4. オンライン エンドポイントを指す完全修飾ドメイン名 (FQDN) で DNS を更新します

重要

ドメイン名または TLS/SSL 証明書を取得し、Azure Machine Learning 拡張機能で構成するには、独自の証明書を購入する必要があります。 詳細については、この記事の次のセクションを参照してください。

ドメイン名を取得する

ドメイン名をまだ所有していない場合は、ドメイン名レジストラー から購入します。 プロセスと価格は、レジストラーによって異なります。 レジストラーは、ドメイン名を管理するためのツールを提供します。 これらのツールを使用して、オンライン エンドポイントをホストする IP アドレスに FQDN (www.contoso.com など) をマップします。

オンライン エンドポイントの IP アドレスを取得する方法の詳細については、この記事の「FQDN を使用して DNS を更新する」のセクションを参照してください。

TLS/SSL 証明書を取得する

TLS/SSL 証明書 (デジタル証明書) を取得する方法はたくさんあります。 最も一般的な方法は、証明機関から購入することです。 証明書の取得場所に関係なく、次のファイルが必要です。

  • 完全な証明書チェーンが含まれ、PEM でエンコードされている証明書
  • PEM でエンコードされているキー

Note

パスフレーズ保護を使用した PEM ファイル内の SSL キーはサポートされていません。

証明書を要求するときは、オンライン エンドポイントに使用する予定のアドレスの FQDN を指定する必要があります (たとえば、www.contoso.com)。 オンライン エンドポイントの ID を検証するときに、証明書に記載されているアドレスとクライアントが使用するアドレスが比較されます。 これらのアドレスが一致しない場合、クライアントにはエラー メッセージが返されます。

FQDN を使用して IP バンディングを構成する方法の詳細については、この記事の「FQDN を使用して DNS を更新する」のセクションを参照してください。

ヒント

証明機関が証明書とキーを PEM でエンコードされたファイルとして提供できない場合は、OpenSSL などのユーティリティを使用してフォーマットを変更できます。

警告

自己署名証明書は開発時にのみ使用します。 運用環境では使用しないでください。 自己署名証明書により、お使いのクライアント アプリケーションで問題が発生する可能性があります。 詳しくは、お使いのクライアント アプリケーションで使用されているネットワーク ライブラリに関するドキュメントをご覧ください。

Azure Machine Learning 拡張機能で TLS/SSL を構成する

セキュリティで保護された接続に推論 HTTPS を使用するように設定されている Kubernetes オンライン エンドポイントの場合、Kubernetes クラスターに Azure Machine Learning 拡張機能をデプロイするときに、デプロイ構成の設定で TLS 終了を有効にすることができます。

allowInsecureConnections 構成は、Azure Machine Learning 拡張機能のデプロイ時に既定で False に設定されます。 拡張機能のデプロイを確実に成功させるには、sslSecret 構成の設定または sslKeyPemFile 構成と sslCertPemFile 構成で保護された設定の組み合わせを指定する必要があります。 それ以外の場合は、HTTP がサポートされるように allowInsecureConnections=True を設定し、TLS 終端を無効にすることができます。

Note

HTTPS オンライン エンドポイントをサポートするには、allowInsecureConnectionsFalse に設定する必要があります。

リアルタイム推論のために HTTPS エンドポイントを有効にするには、PEM でエンコードされた TLS/SSL 証明書とキーを指定する必要があります。 Azure Machine Learning 拡張機能のデプロイ時に証明書とキーを指定するには、次の 2 つの方法があります。

  • sslSecret 構成の設定を指定します。
  • sslCertPemFile 構成と slKeyPemFile 構成で保護された設定の組み合わせを指定します。

sslSecret の構成

ベスト プラクティスは、証明書とキーを azureml 名前空間の Kubernetes シークレットに保存することです。

sslSecret を構成するには、Kubernetes クラスターの Kubernetes シークレットを azureml 名前空間に保存して、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 コマンドを使用して、この Kubernetes シークレットの名前として sslSecret を指定できます (このコマンドは、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 を使用して、購入した 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

Note

  • パスフレーズ保護を使用した PEM ファイルはサポートされていません。
  • sslCertPemFIlesslKeyPemFIle の両方で、構成で保護されたパラメーターが使用されます。 sslSecretsslCertPemFile/sslKeyPemFile は同時に構成されません。

FQDN を使用して DNS を更新する

カスタム証明書を使用して Kubernetes オンライン エンドポイントにモデルをデプロイする場合は、オンライン エンドポイントの IP アドレスを指すように DNS レコードを更新する必要があります。 Azure Machine Learning 推論ルーター サービス (azureml-fe) では、この IP アドレスが提供されます。 azureml-fe の詳細については、マネージド Azure Machine Learning 推論ルーターに関するページを参照してください。

カスタム ドメイン名の DNS レコードを更新するには、次の手順に従います。

  1. オンライン エンドポイントの IP アドレスをスコアリング URI から取得します。通常、この形式は 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 portal から IP アドレスを取得できます。 AKS リソース ページに移動し、サービスとイングレスに移動してから、azuerml 名前空間の下にある azureml-fe サービスを探します。 その後、[外部 IP] 列に IP アドレスが表示されます。

    Azure portal での Azure Arc 対応 Kubernetes クラスターへの新しい拡張機能の追加を示すスクリーンショット。

    さらに、クラスターで Kubernetes コマンド kubectl describe svc azureml-fe -n azureml を実行して、出力の LoadBalancer Ingress パラメーターから IP アドレスを取得できます。

    Note

    推論ルーター サービスとして nodePort または clusterIP を使用する 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 アドレスを指します。

    レジストラーと、ドメイン名に対して構成された Time to Live (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.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. allowInsercureconnectionTrue に設定して Azure Machine Learning 拡張機能を更新します。

  2. sslSecret 構成または sslPem 構成の設定と共に、sslCname 構成の設定を削除します。

  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 がサポートされています。

次のステップ

具体的には、次の方法を学習します。