Authentifizieren von Azure gehosteten Apps bei Azure-Ressourcen mit dem Azure SDK für Python

Wenn Sie eine App in Azure mithilfe von Diensten wie Azure App Service, Azure Virtual Machines oder Azure Container Instances hosten, besteht das empfohlene Verfahren zur Authentifizierung einer App für Azure-Ressourcen in der Verwendung einer verwalteten Identität.

Eine verwaltete Identität stellt eine Identität für Ihre App bereit, sodass sie eine Verbindung mit anderen Azure-Ressourcen herstellen kann, ohne einen geheimen Schlüssel oder ein anderes Anwendungsgeheimnis verwenden zu müssen. Intern kennt Azure die Identität Ihrer App und die Ressourcen, mit der eine Verbindung hergestellt werden darf. Azure verwendet diese Informationen, um automatisch Microsoft Entra-Token für die App abzurufen, damit sie eine Verbindung mit anderen Azure-Ressourcen herstellen kann, ohne dass Sie Anwendungsgeheimnisse verwalten müssen.

Hinweis

Apps, die in Azure Kubernetes Service (AKS) ausgeführt werden, können eine Workloadidentität verwenden, um sich bei Azure-Ressourcen zu authentifizieren. In AKS stellt eine Workloadidentität eine Vertrauensstellung zwischen einer verwalteten Identität und einem Kubernetes-Dienstkonto dar. Wenn eine für AKS bereitgestellte Anwendung mit einem Kubernetes-Dienstkonto in einer solchen Beziehung konfiguriert ist, authentifiziert DefaultAzureCredential die App mithilfe der verwalteten Identität bei Azure. Die Authentifizierung mithilfe einer Workloadidentität wird unter Verwenden der Microsoft Entra-Workload-ID mit Azure Kubernetes Service (AKS) erläutert. Schritte zum Konfigurieren der Workloadidentität finden Sie unter Bereitstellen und Konfigurieren der Workloadidentität in einem Azure Kubernetes Service (AKS)-Cluster.

Arten von verwalteten Identitäten

Es gibt zwei Arten von verwalteten Identitäten:

  • Vom System zugewiesene verwaltete Identitäten : Diese Art von verwalteter Identität wird von einer Azure-Ressource bereitgestellt und direkt an sie gebunden. Wenn Sie die verwaltete Identität für eine Azure-Ressource aktivieren, erhalten Sie eine systemseitig zugewiesene verwaltete Identität für diese Ressource. Eine systemseitig zugewiesene verwaltete Identität ist an den Lebenszyklus der Azure-Ressource gebunden, der sie zugeordnet ist. Azure löscht automatisch die Identität, wenn die Ressource gelöscht wird. Da Sie lediglich die verwaltete Identität für die Azure-Ressource aktivieren müssen, die Ihren Code hostet, ist dieses Verfahren der am einfachsten zu verwendende Typ verwalteter Identität.
  • Vom Benutzer zugewiesene verwaltete Identitäten - Sie können eine verwaltete Identität auch als eigenständige Azure-Ressource erstellen. Dieses Konzept wird am häufigsten verwendet, wenn Ihre Lösung über mehrere Workloads verfügt, die auf mehreren Azure-Ressourcen ausgeführt werden, die alle dieselbe Identität und dieselben Berechtigungen aufweisen müssen. Wenn Ihre Lösung beispielsweise über Komponenten verfügt, die auf mehreren App Service- und VM-Instanzen ausgeführt werden, die alle Zugriff auf denselben Satz von Azure-Ressourcen benötigen, ist eine vom Benutzer zugewiesene verwaltete Identität, die für diese Ressourcen verwendet wird, sinnvoll.

In diesem Artikel werden die Schritte zum Aktivieren und Verwenden einer vom System zugewiesenen verwalteten Identität für eine App beschrieben. Wenn Sie eine benutzerseitig zugewiesene verwaltete Identität verwenden müssen, lesen Sie den Artikel Verwalten benutzerseitig zugewiesener verwalteter Identitäten , um zu erfahren, wie Sie eine benutzerseitig zugewiesene verwaltete Identität erstellen.

1: Aktivieren der verwalteten Identität in der Azure-Ressource, die die App hosten

Der erste Schritt besteht darin, die verwaltete Identität in Azure-Ressourcen zu aktivieren, die Ihre App hosten. Wenn Sie beispielsweise eine Django-Anwendung mit Azure App Service hosten, müssen Sie die verwaltete Identität für die App Service-Web-App aktivieren, die Ihre App hostet. Wenn Sie einen virtuellen Computer zum Hosten Ihrer App verwenden, aktivieren Sie diesen für die Verwendung der verwalteten Identität.

Sie können die Verwendung der verwalteten Identität für eine Azure-Ressource mithilfe der Azure-Portal oder der Azure CLI aktivieren.

Azure CLI-Befehle können in der Azure Cloud Shell oder auf einer Workstation mit installierter Azure CLI ausgeführt werden.

Die Azure CLI-Befehle, die zum Aktivieren der verwalteten Identität für eine Azure-Ressource verwendet werden, haben das Format az <command-group> identity --resource-group <resource-group-name> --name <resource-name>. Spezifische Befehle für beliebte Azure-Dienste sind unten dargestellt.

az webapp identity assign --resource-group <resource-group-name> -name <web-app-name>

Die Ausgabe sieht dann wie folgt aus:

{
  "principalId": "99999999-9999-9999-9999-999999999999",
  "tenantId": "33333333-3333-3333-3333-333333333333",
  "type": "SystemAssigned",
  "userAssignedIdentities": null
}

Der principalId Wert ist die eindeutige ID der verwalteten Identität. Behalten Sie eine Kopie dieser Ausgabe bei, da Sie diese Werte im nächsten Schritt benötigen.

2 - Zuweisen einer Rolle zur verwalteten Identität

Als Nächstes müssen Sie ermitteln, welche Rollen (Berechtigungen) Ihre App benötigt, und die verwaltete Identität diesen Rollen in Azure zuweisen. Einer verwalteten Identität können Rollen in einem Ressourcen-, Ressourcengruppen- oder Abonnementbereich zugewiesen werden. In diesem Beispiel wird gezeigt, wie Sie Rollen auf der Ebene der Ressourcengruppe zuweisen, da die meisten Anwendungen alle ihre Azure-Ressourcen in einer einzigen Ressourcengruppe zusammenfassen.

Eine verwaltete Identität wird mithilfe des Befehls az role assignment create in Azure einer Rolle zugewiesen. Verwenden Sie für den Zugewiesenen die in Schritt 1 kopierte principalId.

az role assignment create --assignee {managedIdentityprincipalId} \
    --scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
    --role "{roleName}" 

Verwenden Sie den Befehl az role definition list , um die Rollennamen abzurufen, denen ein Dienstprinzipal zugewiesen werden kann.

az role definition list \
    --query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
    --output table

Um beispielsweise der verwalteten Identität mit der ID 99999999-9999-9999-9999-999999999999 Lese-, Schreib- und Lösch-Zugang zu Azure Storage-Blob-Containern und Daten in allen Speicherkonten in der Ressourcengruppe msdocs-python-sdk-auth-example im Rahmen des Abonnements mit der ID 11111111-1111-1111-1111-111111111111 zu gewähren, weisen Sie den Anwendungsdienstprinzipal mithilfe des folgenden Befehls der Rolle Storage Blob Data Contributor zu.

az role assignment create --assignee 99999999-9999-9999-9999-999999999999 \
    --scope /subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/msdocs-python-sdk-auth-example \
    --role "Storage Blob Data Contributor"

Informationen zum Zuweisen von Berechtigungen auf Ressourcen- oder Abonnementebene mithilfe der Azure CLI finden Sie im Artikel Zuweisen von Azure-Rollen mithilfe der Azure CLI.

3 - Implementieren von DefaultAzureCredential in Ihrer Anwendung

Wenn Ihr Code in Azure ausgeführt wird und die verwaltete Identität auf der Azure-Ressource aktiviert wurde, die Ihre App hostet, bestimmt die DefaultAzureCredential die Anmeldeinformationen, die in der folgenden Reihenfolge zu verwenden sind:

  1. Überprüfen Sie die Umgebung auf einen Dienstprinzipal gemäß der Definition der Umgebungsvariablen AZURE_CLIENT_ID, AZURE_TENANT_ID und entweder AZURE_CLIENT_SECRET oder AZURE_CLIENT_CERTIFICATE_PATH und (optional) AZURE_CLIENT_CERTIFICATE_PASSWORD.
  2. Überprüfen Sie Schlüsselwortparameter auf eine vom Benutzer zugewiesene verwaltete Identität. Sie können eine vom Benutzer zugewiesene verwaltete Identität übergeben, indem Sie ihre Client-ID im managed_identity_client_id-Parameter angeben.
  3. Überprüfen Sie die Umgebungsvariable AZURE_CLIENT_ID auf die Client-ID einer vom Benutzer zugewiesenen verwalteten Identität.
  4. Verwenden Sie die vom System zugewiesene verwaltete Identität für die Azure-Ressource, wenn sie aktiviert ist.

Sie können verwaltete Identitäten aus den Anmeldeinformationen ausschließen, indem Sie den exclude_managed_identity_credential-Schlüsselwortparameter True festlegen.

In diesem Artikel verwenden wir die vom System zugewiesene verwaltete Identität für eine Azure App Service-Web-App, daher müssen wir keine verwaltete Identität in der Umgebung konfigurieren oder als Parameter übergeben. Die folgenden Schritte veranschaulichen die Verwendung der DefaultAzureCredential.

Fügen Sie Ihrer Anwendung zunächst das Paket azure.identity hinzu.

pip install azure-identity

Danach sollten Sie für jeden Python-Code, der ein Azure SDK-Clientobjekt in Ihrer App erstellt, Folgendes ausführen:

  1. Importieren Sie die DefaultAzureCredential-Klasse aus dem azure.identity-Modul.
  2. Erstellen eines DefaultAzureCredential-Objekts
  3. Übergeben Sie das DefaultAzureCredential-Objekt an den Azure SDK-Clientobjektkonstruktor.

Ein Beispiel für diese Schritte wird im folgenden Codeausschnitt gezeigt.

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

# Acquire a credential object
token_credential = DefaultAzureCredential()

blob_service_client = BlobServiceClient(
        account_url="https://<my_account_name>.blob.core.windows.net",
        credential=token_credential)

Wie im Artikel Azure SDK for Python-Authentifizierung – Übersicht erläutert, unterstützt DefaultAzureCredential mehrere Authentifizierungsverfahren und legt zur Laufzeit fest, welches Authentifizierungsverfahren verwendet wird. Der Vorteil dieser Vorgehensweise liegt darin, dass Ihre App unterschiedliche Authentifizierungsmethoden in verschiedenen Umgebungen (lokal gegenüber Produktion) verwenden kann, ohne umgebungsspezifischen Code zu implementieren. Wenn der vorangehende Code bei der lokalen Entwicklung auf Ihrer Arbeitsstation ausgeführt wird, verwendet DefaultAzureCredential entweder einen Anwendungsdienstprinzipal, wie durch Umgebungseinstellungen festgelegt, oder Anmeldeinformationen des Entwicklertools, um sich bei anderen Azure-Ressourcen zu authentifizieren. Daher kann derselbe Code verwendet werden, um Ihre App bei Azure-Ressourcen sowohl während der lokalen Entwicklung als auch bei der Bereitstellung in Azure zu authentifizieren.