Konfigurieren eines sicheren Onlineendpunkts mit TLS/SSL

In diesem Artikel erfahren Sie, wie Sie einen über Azure Machine Learning erstellten Kubernetes-Onlineendpunkt schützen.

HTTPS wird verwendet, um den Zugriff auf Onlineendpunkte einzuschränken und beim Schützen der von Clients übermittelten Daten zu helfen. HTTPS verschlüsselt die Kommunikation zwischen einem Client und einem Onlineendpunkt mithilfe von Transport Layer Security (TLS). In einigen Fällen wird TLS immer noch als Secure Sockets Layer (SSL) bezeichnet, der Vorgänger von TLS.

Tipp

  • Insbesondere unterstützen Kubernetes-Onlineendpunkte TLS-Version 1.2 für Azure Kubernetes Service (AKS) und Kubernetes mit Azure Arc-Unterstützung.
  • Die TLS-Version 1.3 für Kubernetes-Rückschlüsse von Azure Machine Learning wird nicht unterstützt.

Sowohl TLS als auch SSL beruhen auf digitalen Zertifikaten, die zur Verschlüsselung und Identitätsüberprüfung verwendet werden. Weitere Informationen zur Funktionsweise digitaler Zertifikate finden Sie im Wikipedia-Thema Public-Key-Infrastruktur.

Warnung

Wenn Sie HTTPS nicht für Ihre Onlineendpunkte verwenden, sind ein- und ausgehende Daten des Diensts möglicherweise für andere Benutzer im Internet sichtbar.

HTTPS ermöglicht dem Client auch, die Authentizität des Servers, mit dem eine Verbindung hergestellt wird, zu überprüfen. Dieses Feature schützt Clients vor Man-in-the-Middle-Angriffen.

Der allgemeine Prozess zum Schützen eines Onlineendpunkts sieht wie folgt aus:

  1. Rufen Sie einen Domänennamen ab.

  2. Rufen Sie ein digitales Zertifikat ab.

  3. Konfigurieren Sie TLS/SSL in der Azure Machine Learning-Erweiterung.

  4. Aktualisieren Sie Ihr DNS mit einem vollqualifizierten Domänennamen (FQDN), um auf den Onlineendpunkt zu verweisen.

Wichtig

Sie müssen ein eigenes Zertifikat erwerben, um einen Domänennamen oder ein TLS/SSL-Zertifikat zu erhalten, und diese dann in der Azure Machine Learning-Erweiterung konfigurieren. Ausführlichere Informationen finden Sie in den folgenden Abschnitten dieses Artikels.

Abrufen eines Domänennamens

Wenn Sie nicht bereits über einen Domänennamen verfügen, können Sie einen solchen von einer Domänennamen-Registrierungsstelle erwerben. Die Prozesse und Preise der Registrierungsstellen sind unterschiedlich. Die Registrierungsstelle bietet Tools zum Verwalten des Domänennamens. Sie verwenden diese Tools, um einen FQDN (z. B. www.contoso.com) der IP-Adresse zuzuordnen, die Ihren Onlineendpunkt hostet.

Weitere Informationen zum Abrufen der IP-Adresse Ihrer Onlineendpunkte finden Sie im Abschnitt Aktualisieren Ihres DNS mit einem FQDN dieses Artikels.

Abrufen eines TLS/SSL-Zertifikats

Es gibt viele Möglichkeiten, ein TLS/SSL-Zertifikat (digitales Zertifikat) zu erhalten. Die verbreitetste Methode ist der Erwerb eines Zertifikats von einer Zertifizierungsstelle. Unabhängig davon, wo Sie das Zertifikat abrufen, benötigen Sie die folgenden Dateien:

  • Ein Zertifikat, das die vollständige Zertifikatkette enthält und PEM-codiert ist.
  • Ein Schlüssel, der PEM-codiert ist

Hinweis

Ein SSL-Schlüssel in einer PEM-Datei mit Passphraseschutz wird nicht unterstützt.

Wenn Sie ein Zertifikat anfordern, müssen Sie den FQDN der Adresse angeben, die Sie für den Onlineendpunkt verwenden möchten (z. B. www.contoso.com). Die im Zertifikat hinterlegte Adresse und die von den Clients verwendete Adresse werden miteinander verglichen, um die Identität des Onlineendpunkts zu überprüfen. Wenn diese Adressen nicht übereinstimmen, erhält der Client eine Fehlermeldung.

Weitere Informationen zur Verknüpfung der IP-Adresse mit einem FQDN finden Sie im Abschnitt Aktualisieren Ihres DNS mit einem FQDN dieses Artikels.

Tipp

Wenn die Zertifizierungsstelle das Zertifikat und den Schlüssel nicht als PEM-codierte Dateien bereitstellen kann, können Sie ein Tool wie OpenSSL zum Ändern des Formats verwenden.

Warnung

Verwenden Sie selbstsignierte Zertifikate nur für die Entwicklung. Verwenden Sie sie nicht in Produktionsumgebungen. Selbstsignierte Zertifikate können Probleme in Ihren Clientanwendungen verursachen. Weitere Informationen finden Sie in der Dokumentation für die Netzwerkbibliotheken, die Ihre Clientanwendung verwendet.

Konfigurieren von TLS/SSL in der Azure Machine Learning-Erweiterung

Für einen Kubernetes-Onlineendpunkt, der für die Verwendung von rückschlussbasiertem HTTPS für sichere Verbindungen konfiguriert ist, können Sie beim Bereitstellen der Azure Machine Learning-Erweiterung in einem Kubernetes-Cluster den TLS-Abschluss mit Bereitstellungskonfigurationseinstellungen aktivieren.

Zum Zeitpunkt der Bereitstellung der Azure Machine Learning-Erweiterung lautet die Konfigurationseinstellung allowInsecureConnections standardmäßig False. Um eine erfolgreiche Erweiterungsbereitstellung sicherzustellen, müssen Sie entweder die Konfigurationseinstellung sslSecret oder eine Kombination aus den konfigurationsgeschützten Einstellungen sslKeyPemFile und sslCertPemFile angeben. Andernfalls können Sie allowInsecureConnections=True so festlegen, dass HTTP unterstützt und der TLS-Abschluss deaktiviert wird.

Hinweis

Zur Unterstützung des HTTPS-Onlineendpunkts muss allowInsecureConnections auf Falsefestgelegt werden.

Um echtzeitbasierte Rückschlüsse für einen HTTPS-Endpunkt zu ermöglichen, müssen Sie ein PEM-codiertes TLS/SSL-Zertifikat und einen Schlüssel bereitstellen. Es gibt zwei Möglichkeiten, das Zertifikat und den Schlüssel zum Zeitpunkt der Bereitstellung für die Azure Machine Learning-Erweiterung anzugeben:

  • Geben Sie die sslSecret-Konfigurationseinstellung an.
  • Legen Sie eine Kombination aus den konfigurationsgeschützten Einstellungen sslCertPemFile und slKeyPemFile fest.

Konfigurieren von „sslSecret“

Es hat sich bewährt, das Zertifikat und den Schlüssel in einem Kubernetes-Geheimnis im azureml-Namespace zu speichern.

Zum Konfigurieren von sslSecret müssen Sie ein Kubernetes-Geheimnis in Ihrem Kubernetes-Cluster im Namespace azureml speichern, um cert.pem (PEM-codiertes TLS/SSL-Zertifikat) und key.pem (PEM-codierter TLS/SSL-Schlüssel) zu speichern.

Der folgende Code ist eine YAML-Beispieldefinition eines TLS/SSL-Geheimnisses:

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

Nachdem Sie das Geheimnis in Ihrem Cluster gespeichert haben, können Sie den folgenden Azure CLI-Befehl verwenden, um sslSecret als Namen dieses Kubernetes-Geheimnisses anzugeben. (Dieser Befehl funktioniert nur, wenn Sie AKS verwenden.)

   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

Konfigurieren von „sslCertPemFile“ und „sslKeyPemFile“

Sie können die Konfigurationseinstellung sslCertPemFile als Pfad zur PEM-codierten TLS/SSL-Zertifikatdatei und die Konfigurationseinstellung sslKeyPemFile als Pfad zur PEM-codierten TLS/SSL-Schlüsseldatei angeben.

Das folgende Beispiel zeigt, wie Sie die Azure CLI verwenden, um PEM-Dateien für die Azure Machine Learning-Erweiterung anzugeben, die ein TLS/SSL-Zertifikat verwendet, das Sie erworben haben. Im Beispiel wird davon ausgegangen, dass Sie AKS verwenden.

   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

Hinweis

  • Eine PEM-Datei mit Passphraseschutz wird nicht unterstützt.
  • Sowohl sslCertPemFIle als auch sslKeyPemFIle verwenden konfigurationsgeschützte Parameter. Sie konfigurieren sslSecret und sslCertPemFile/sslKeyPemFile nicht gleichzeitig.

Aktualisieren Ihres DNS mit einem FQDN

Für die Modellimplementierung an einem Kubernetes-Onlineendpunkt mit einem benutzerdefinierten Zertifikat müssen Sie Ihren DNS-Eintrag aktualisieren, sodass er auf die IP-Adresse des Onlineendpunkts verweist. Der Azure Machine Learning-Rückschlussrouterdienst (azureml-fe) stellt diese IP-Adresse bereit. Weitere Informationen zu azureml-fe finden Sie unter Verwalteter Azure Machine Learning-Rückschlussrouter.

So aktualisieren Sie den DNS-Eintrag für Ihren benutzerdefinierten Domänennamen

  1. Rufen Sie die IP-Adresse des Onlineendpunkts vom Bewertungs-URI ab. Dieser hat in der Regel das Format http://104.214.29.152:80/api/v1/service/<service-name>/score. In diesem Beispiel lautet die IP-Adresse 104.214.29.152.

    Nachdem Sie Ihren benutzerdefinierten Domänennamen konfiguriert haben, ersetzt er die IP-Adresse im Bewertungs-URI. Für Kubernetes-Cluster, die LoadBalancer als Rückschlussrouterdienst verwenden, wird azureml-fe extern über den Lastenausgleich eines Cloudanbieters und den TLS/SSL-Abschluss verfügbar gemacht. Die IP-Adresse des Kubernetes-Onlineendpunkts ist die externe IP-Adresse des im Cluster bereitgestellten azureml-fe-Diensts.

    Bei Verwendung von AKS können Sie die IP-Adresse über das Azure-Portal ermitteln. Rufen Sie Ihre AKS-Ressourcenseite auf, wechseln Sie zu Dienste und eingehende Elemente, und suchen Sie den Dienst azureml-fe unter dem Namespace azuerml. Anschließend finden Sie die IP-Adresse in der Spalte Externe IP-Adresse.

    Screenshot: Hinzufügen einer neuen Erweiterung zum Kubernetes-Cluster mit Azure Arc-Unterstützung über das Azure-Portal

    Darüber hinaus können Sie den Kubernetes-Befehl kubectl describe svc azureml-fe -n azureml in Ihrem Cluster ausführen, um die IP-Adresse anhand des Parameters LoadBalancer Ingress in der Ausgabe zu ermitteln.

    Hinweis

    Für Kubernetes-Cluster, die entweder nodePort oder clusterIP als Rückschlussrouterdienst verwenden, müssen Sie eine eigene Lastenausgleichslösung und einen TLS/SSL-Abschluss für azureml-fe einrichten. Sie müssen auch die IP-Adresse des Diensts azureml-fe im Clusterbereich abrufen.

  2. Verwenden Sie die Tools von Ihrer Domänennamen-Registrierungsstelle, um den DNS-Eintrag für Ihren Domänennamen zu aktualisieren. Der Eintrag ordnet den FQDN (z. B. www.contoso.com) der IP-Adresse zu. Der Eintrag muss auf die IP-Adresse des Onlineendpunkts verweisen.

    Tipp

    Microsoft ist nicht für die Aktualisierung des DNS für Ihren benutzerdefinierten DNS-Namen oder Ihr Zertifikat verantwortlich. Sie müssen es mit Ihrer Domänennamenregistrierungsstelle aktualisieren.

  3. Nach der Aktualisierung des DNS-Eintrags können Sie die DNS-Auflösung mithilfe des Befehls nslookup custom-domain-name überprüfen. Wenn der DNS-Eintrag ordnungsgemäß aktualisiert wurde, verweist der benutzerdefinierte Domänenname auf die IP-Adresse des Onlineendpunkts.

    Abhängig von der Registrierungsstelle und dem TTL-Wert (Time-to-Live), der für den Domänennamen konfiguriert ist, kann es einige Minuten bis mehrere Stunden dauern, bevor Clients den Domänennamen auflösen können.

Weitere Informationen zur DNS-Auflösung mit Azure Machine Learning finden Sie unter Verwenden Ihres Arbeitsbereichs mit einem benutzerdefinierten DNS-Server.

Aktualisieren des TSL/SSL-Zertifikats

TLS/SSL-Zertifikate laufen ab und müssen erneuert werden. In der Regel erfolgt dies jedes Jahr. Verwenden Sie die Informationen in den folgenden Schritten, um Ihr Zertifikat für in Kubernetes (AKS und Kubernetes mit Azure Arc-Unterstützung) bereitgestellte Modelle zu aktualisieren und zu verlängern:

  1. Verwenden Sie die Dokumentation von der Zertifizierungsstelle, um das Zertifikat zu erneuern. Bei diesem Vorgang werden neue Zertifikatsdateien erstellt.

  2. Aktualisieren Sie Ihre Azure Machine Learning-Erweiterung, und geben Sie die neuen Zertifikatdateien mithilfe des Befehls az k8s-extension update an.

    Wenn Sie zuvor ein Kubernetes-Geheimnis zur Konfiguration von TLS/SSL verwendet haben, müssen Sie zunächst das Kubernetes-Geheimnis mit der neuen cert.pem- und key.pem-Konfiguration in Ihrem Kubernetes-Cluster aktualisieren. Führen Sie dann den Befehl zum Aktualisieren der Erweiterung aus, um das Zertifikat zu aktualisieren:

       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
    

    Wenn Sie zuvor die PEM-Dateien direkt im Befehl für die Erweiterungsbereitstellung konfiguriert haben, müssen Sie den Erweiterungsaktualisierungsbefehl ausführen und den neuen Pfad der PEM-Datei angeben:

       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
    

Deaktivieren von TLS

So deaktivieren Sie TLS für ein in Kubernetes bereitgestelltes Modell

  1. Aktualisieren Sie die Azure Machine Learning-Erweiterung mit allowInsercureconnection, das auf True festgelegt ist.

  2. Entfernen Sie die Konfigurationseinstellung sslCname zusammen mit den Konfigurationseinstellungen sslSecret oder sslPem.

  3. Führen Sie den folgenden Azure CLI-Befehl in Ihrem Kubernetes-Cluster aus, und führen Sie dann ein Update durch. Bei diesem Befehl wird davon ausgegangen, dass Sie AKS verwenden.

       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
    

Warnung

Standardmäßig erwartet die Bereitstellung der Azure Machine Learning-Erweiterung Konfigurationseinstellungen für die HTTPS-Unterstützung. HTTP-Unterstützung wird nur zu Entwicklungs- oder Testzwecken empfohlen. Die Konfigurationseinstellung allowInsecureConnections=True bietet HTTP-Unterstützung.

Nächste Schritte

In diesem Artikel werden folgende Themen erläutert: