Authentifizieren von Python-Apps bei Azure-Services bei der lokalen Entwicklung mithilfe von Entwicklerkonten

Wenn Entwickler Cloudanwendungen erstellen, debuggen und testen sie sie in der Regel auf ihrer lokalen Workstation. Wenn eine Anwendung während der lokalen Entwicklung auf der Arbeitsstation eines Entwicklers ausgeführt wird, muss sie sich weiterhin bei allen von der App verwendeten Azure-Diensten authentifizieren. In diesem Artikel wird beschrieben, wie Sie die Azure-Anmeldeinformationen eines Entwicklers verwenden, um die App während der lokalen Entwicklung bei Azure zu authentifizieren.

Ein Diagramm, das zeigt, wie eine Python-App bei der lokalen Entwicklung die Anmeldeinformationen der Entwickler verwendet, um eine Verbindung mit Azure herzustellen, indem diese Anmeldeinformationen von lokal installierten Entwicklungstools abgerufen werden.

Damit sich eine App bei der lokalen Entwicklung mit den Azure-Anmeldeinformationen des Entwicklers bei Azure authentifizieren kann, muss der Entwickler über die Azure-CLI, Azure PowerShell oder Azure Developer-CLI bei Azure angemeldet sein. Das Azure SDK für Python kann erkennen, dass der Entwickler über eines dieser Tools angemeldet ist, und dann die erforderlichen Anmeldeinformationen aus dem Anmeldeinformationscache abrufen, um die App bei Azure als angemeldeter Benutzer zu authentifizieren.

Dieser Ansatz ist am einfachsten für ein Entwicklungsteam einzurichten, da es die Vorteile der vorhandenen Azure-Konten der Entwickler nutzt. Das Konto eines Entwicklers verfügt jedoch wahrscheinlich über mehr Berechtigungen als für die Anwendung erforderlich, weshalb die Berechtigungen überschritten werden, mit denen die App in der Produktion ausgeführt wird. Alternativ können Sie Anwendungsdienstprinzipale für die Verwendung während der lokalen Entwicklung erstellen, die nur den Zugriff haben können, der von der App benötigt wird.

1 – Erstellen einer Microsoft Entra-Sicherheitsgruppe für die lokale Entwicklung

Da fast immer mehrere Entwickler an einer Anwendung arbeiten, wird empfohlen, zuerst eine Microsoft Entra-Sicherheitsgruppe zu erstellen, um die Rollen (Berechtigungen) einzuschließen, die die App bei der lokalen Entwicklung benötigt. Diese Vorgehensweise bietet die folgenden Vorteile.

  • Jedem Entwickler wird sichergestellt, dass dieselben Rollen zugewiesen werden, da Rollen auf Gruppenebene zugewiesen werden.
  • Wenn eine neue Rolle für die App benötigt wird, muss sie nur der Microsoft Entra-Gruppe für die App hinzugefügt werden.
  • Wenn ein neuer Entwickler dem Team beitritt, muss er lediglich der richtigen Microsoft Entra-Gruppe hinzugefügt werden, um die erforderlichen Berechtigungen für die Arbeit an der App zu erhalten.

Wenn Sie über eine vorhandene Microsoft Entra-Sicherheitsgruppe für Ihr Entwicklungsteam verfügen, können Sie diese Gruppe verwenden. Gehen Sie andernfalls wie folgt vor, um eine Microsoft Entra-Sicherheitsgruppe zu erstellen.

Der Befehl az ad group create wird verwendet, um Gruppen in Microsoft Entra ID zu erstellen. Die --display-name- und --main-nickname-Parameter sind erforderlich. Der der Gruppe angegebene Name sollte auf dem Namen der Anwendung basieren. Es ist auch hilfreich, eine Zeichenfolge wie local-dev in den Namen der Gruppe aufzunehmen, um den Zweck der Gruppe anzugeben.

az ad group create \
    --display-name MyDisplay \
    --mail-nickname MyDisplay  \
    --description "<group-description>"

Kopieren Sie den Wert der id-Eigenschaft in die Ausgabe des Befehls. Dies ist die Objekt-ID für die Gruppe. Sie benötigen sie in späteren Schritten. Sie können auch den Befehl az ad group show zum Abrufen dieser Eigenschaft verwenden.

Um der Gruppe Mitglieder hinzuzufügen, benötigen Sie die Objekt-ID des Azure-Benutzers. Verwenden Sie die az ad user list , um die verfügbaren Dienstprinzipale aufzulisten. Der --filter Parameterbefehl akzeptiert OData-Formatfilter und kann verwendet werden, um die Liste wie gezeigt nach dem Anzeigenamen des Benutzers zu filtern. Der Parameter --query beschränkt die Ausgabe auf Spalten von Interesse.

az ad user list \
    --filter "startswith(displayName, 'Bob')" \
    --query "[].{objectId:id, displayName:displayName}" \
    --output table

Der Befehl az ad group member add kann dann verwendet werden, um Gruppen Mitglieder hinzuzufügen.

az ad group member add \
    --group <group-name> \
    --member-id <object-id>

Hinweis

Standardmäßig ist die Erstellung von Microsoft Entra-Sicherheitsgruppen auf bestimmte privilegierte Rollen in einem Verzeichnis beschränkt. Wenn Sie keine Gruppe erstellen können, wenden Sie sich an einen Administrator für Ihr Verzeichnis. Wenn Sie einer vorhandenen Gruppe keine Mitglieder hinzufügen können, wenden Sie sich an den Gruppenbesitzer oder einen Verzeichnisadministrator. Weitere Informationen finden Sie unter Verwalten von Microsoft Entra-Gruppen und -Gruppenmitgliedschaften.

2: Zuweisen von Rollen zur Microsoft Entra-Gruppe

Als Nächstes müssen Sie bestimmen, welche Rollen (Berechtigungen) Ihre App für welche Ressourcen benötigt, und diese Rollen Ihrer App zuweisen. In diesem Beispiel werden die Rollen der Microsoft Entra-Gruppe zugewiesen, die in Schritt 1 erstellt wurde. Rollen können 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.

Einem Benutzer, einer Gruppe oder einem Anwendungsdienstprinzipal wird in Azure mit dem Befehl az role assignment create eine Rolle zugewiesen. Sie können eine Gruppe mit ihrer Objekt-ID angeben.

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

Verwenden Sie den Befehl az role definition list, um die Rollennamen abzurufen, die zugewiesen werden können.

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

Um beispielsweise den Mitgliedern einer Gruppe mit der Objekt-ID 00000000-0000-0000-0000-000000000000 Lese-, Schreib- und Lösch-Zugriff auf Azure Storage-Blob-Container 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 die Rolle Storage Blob Data Contributor mithilfe des folgenden Befehls der Gruppe zu.

az role assignment create --assignee 00000000-0000-0000-0000-000000000000 \
    --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 – Anmeldung mit Azure-CLI, Azure PowerShell, Azure Developer-CLI oder in einem Browser bei Azure

Öffnen Sie ein Terminal auf Ihrer Entwicklerarbeitsstation, und melden Sie sich über die Azure CLI bei Azure an.

az login

4. Implementieren von DefaultAzureCredential in Ihrer Anwendung

Um Azure SDK-Clientobjekte für Azure zu authentifizieren, sollte Ihre Anwendung die DefaultAzureCredential-Klasse aus dem azure.identity-Paket verwenden. In diesem Szenario prüft DefaultAzureCredential sequenziell, ob sich der Entwickler mit der Azure-CLI, Azure PowerShell oder der Azure Developer-CLI bei Azure angemeldet hat. Wenn sich der Entwickler mit einem dieser Tools bei Azure angemeldet hat, werden die für die Anmeldung bei dem Tool verwendeten Anmeldeinformationen von der App zur Authentifizierung bei Azure verwendet.

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)