Freigeben über


Authentifizieren bei Azure-Ressourcen mit lokal gehosteten Python-Apps

Apps, die außerhalb von Azure (z. B. lokal oder in einem Rechenzentrum eines Drittanbieters) gehostet werden, sollten einen Anwendungsdienstprinzipal verwenden, um sich beim Zugriff auf Azure-Ressourcen bei Azure zu authentifizieren. Anwendungsdienstprinzipalobjekte werden mithilfe des App-Registrierungsprozesses in Azure erstellt. Wenn ein Anwendungsdienstprinzipal erstellt wird, werden eine Client-ID und ein geheimer Clientschlüssel für Ihre App generiert. Die Client-ID, das Client-Secret und Ihre Mandanten-ID werden dann in Umgebungsvariablen gespeichert, sodass sie vom Azure SDK für Python verwendet werden können, um Ihre App zur Laufzeit bei Azure zu authentifizieren.

Für jede Umgebung, in der die App gehostet wird, sollte eine andere App-Registrierung erstellt werden. Auf diese Weise können umgebungsspezifische Ressourcenberechtigungen für jeden Dienstprinzipal konfiguriert werden, und es wird sichergestellt, dass eine App, die in einer Umgebung bereitgestellt wird, nicht mit Azure-Ressourcen kommuniziert, die Teil einer anderen Umgebung sind.

1 - Registrieren der Anwendung in Azure AD

Eine App kann entweder mit dem Azure-Portal oder der Azure CLI bei Azure registriert werden.

az ad sp create-for-rbac --name <app-name>

Der Befehl gibt eine Ausgabe ähnlich der folgenden zurück: Notieren Sie sich diese Werte, oder lassen Sie dieses Fenster geöffnet, da Sie diese Werte für die nächsten Schritte benötigen und der Wert des Kennworts (Client-Secret) nicht erneut angezeigt wird.

{
  "appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "displayName": "msdocs-python-sdk-auth-prod",
  "password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
  "tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}

2: Zuweisen von Rollen zum Anwendungsdienstprinzipal

Als Nächstes müssen Sie bestimmen, welche Rollen (Berechtigungen) Ihre App für welche Ressourcen benötigt, und diese Rollen Ihrer App zuweisen. Rollen können in einem Ressourcen-, Ressourcengruppen- oder Abonnementbereich eine Rolle zugewiesen werden. In diesem Beispiel wird gezeigt, wie Sie Rollen für den Dienstprinzipal auf der Ebene der Ressourcengruppe zuweisen, da die meisten Anwendungen alle ihre Azure-Ressourcen in einer einzigen Ressourcengruppe zusammenfassen.

Einem Anwendungsdienstprinzipal wird mithilfe des Befehls az role assignment create eine Rolle in Azure zugewiesen.

az role assignment create --assignee {appId} \
    --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 dem Dienstprinzipal mit der appId 00001111-aaaa-2222-bbbb-3333cccc4444 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 aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e zu gewähren, weisen Sie den Anwendungsdienstprinzipal mithilfe des folgenden Befehls der Rolle Storage Blob Data Contributor zu.

az role assignment create --assignee 00001111-aaaa-2222-bbbb-3333cccc4444 \
    --scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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. Konfigurieren von Umgebungsvariablen für die Anwendung

Sie müssen die Umgebungsvariablen AZURE_CLIENT_ID, AZURE_TENANT_ID und AZURE_CLIENT_SECRET für den Prozess festlegen, der Ihre Python-App ausführt, um die Anmeldeinformationen des Anwendungsdienstprinzipals zur Laufzeit für Ihre App verfügbar zu machen. Das DefaultAzureCredential-Objekt sucht in diesen Umgebungsvariablen nach den Dienstprinzipalinformationen.

Wenn Sie Gunicorn zum Ausführen von Python-Web-Apps in einer UNIX-Serverumgebung verwenden, können Umgebungsvariablen für eine App mithilfe der EnvironmentFile-Direktive in der gunicorn.server-Datei angegeben werden, wie nachfolgend gezeigt.

[Unit]
Description=gunicorn daemon
After=network.target  
  
[Service]  
User=www-user
Group=www-data
WorkingDirectory=/path/to/python-app
EnvironmentFile=/path/to/python-app/py-env/app-environment-variables
ExecStart=/path/to/python-app/py-env/gunicorn --config config.py wsgi:app
            
[Install]  
WantedBy=multi-user.target

Die in der EnvironmentFile-Direktive angegebene Datei sollte eine Liste von Umgebungsvariablen mit ihren Werten enthalten, wie nachfolgend gezeigt.

AZURE_CLIENT_ID=<value>
AZURE_TENANT_ID=<value>
AZURE_CLIENT_SECRET=<value>

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.

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 dafür 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)

Wenn der obige Code das DefaultAzureCredential-Objekt instanziiert, liest DefaultAzureCredential die Umgebungsvariablen AZURE_TENANT_ID, AZURE_CLIENT_ID und AZURE_CLIENT_SECRET für die Anwendungsdienstprinzipal-Informationen, mit denen eine Verbindung mit Azure hergestellt werden soll.