Autorisierung in den Azure SDK-Bibliotheken für Python

Die Autorisierung in Azure bestimmt, welche Aktionen authentifizierte Benutzer oder Dienste für Ressourcen ausführen können. In diesem Artikel wird beschrieben, wie Sie die Autorisierung mithilfe des Azure SDK für Python implementieren, modelle, Implementierung, Problembehandlung und bewährte Methoden abdecken. Ausführliches Authentifizierungssetup finden Sie unter Authentifizieren von Python-Apps bei Azure.

Einleitung

Die Authentifizierung (AuthN) überprüft die Identität eines Benutzers oder Diensts, während die Autorisierung (AuthZ) definiert, was sie tun können. In Azure stellt die Autorisierung sicheren Zugriff auf Ressourcen sicher, entscheidend für den Schutz von Anwendungen und Daten. Entwickler können eine robuste Autorisierung mit dem Azure SDK für Python implementieren, um den Zugriff in verschiedenen Workflows zu steuern, von der Verwaltung von Ressourcen bis hin zum Zugriff auf dienstspezifische Daten.

Azure-Autorisierungsmodelle

Azure bietet mehrere Autorisierungsmechanismen zum Verwalten des Zugriffs. Das Verständnis dieser Modelle ist für eine effektive Zugriffssteuerung unerlässlich.

Azure Rollenbasierte Zugriffssteuerung

Azure Role-Based Access Control (RBAC) weist Identitäten in Bereichen wie Abonnements oder Ressourcengruppen Rollen zu. Integrierte Rollen umfassen Besitzer, Mitwirkender und Leser, während benutzerdefinierte Rollen maßgeschneiderte Berechtigungen zulassen. Wenn Sie eine Rolle in einem bestimmten Bereich zuweisen, erhält die Identität (z. B. ein Benutzer oder Dienst) Berechtigungen für alle Ressourcen innerhalb dieses Bereichs und seiner untergeordneten Bereiche. Beispielsweise ermöglicht das Zuweisen der Rolle "Mitwirkender" auf Abonnementebene die Verwaltung aller Ressourcen in diesem Abonnement. Siehe "Grundlegendes zum Umfang von Azure RBAC".

Dienstspezifische Mechanismen

Einige Azure-Dienste bieten eindeutige Autorisierungsmethoden:

  • Azure Storage: Verwendet Shared Access Signatures (SAS) und Zugriffssteuerungslisten (Access Control Lists, ACLs) für den Datenzugriff. Siehe Service-Specific Autorisierungshinweise für Azure Storage.
  • Azure Key Vault: Empfiehlt RBAC gegenüber älteren Zugriffsrichtlinien. Siehe Service-Specific Autorisierungsnotizen für Azure Key Vault.
  • Microsoft Graph: Verwendet OAuth 2.0-Bereiche und Anwendungsberechtigungen. Siehe Service-Specific Autorisierungshinweise für Microsoft Graph.

Verwenden der Autorisierung im Azure SDK für Python

Das Azure SDK für Python bietet integrierte Unterstützung für die Behandlung von Authentifizierung und Autorisierung über das azure-identity Paket. Die DefaultAzureCredential Klasse unterstützt verschiedene Authentifizierungsmechanismen, z. B. verwaltete Identitäten und Dienstprinzipale, die sich an verschiedene Umgebungen anpassen.

Beispiel: Ressourcengruppen auflisten

In diesem Beispiel wird gezeigt, wie das Azure SDK für Python eine Anmeldeinformationen (via DefaultAzureCredential) zur Authentifizierung verwendet und wie die Autorisierung bestimmt, ob die Identität Ressourcengruppen erfolgreich auflisten kann. Wenn für die Identität die Rolle "Leser" oder eine höhere Rolle im Abonnement- oder Ressourcengruppenbereich fehlt, gibt dieser Aufruf den Fehler "403 Verboten" zurück.

from azure.identity import DefaultAzureCredential
from azure.mgmt.resource import ResourceManagementClient

credential = DefaultAzureCredential()
client = ResourceManagementClient(credential, "<subscription-id>")
resource_groups = client.resource_groups.list()
for rg in resource_groups:
    print(rg.name)

Ersetzen Sie <subscription-id> durch Ihre Azure-Abonnement-ID, die in der Regel im Format von 00000000-0000-0000-0000-000000000000 ist.

Microsoft Graph mit Bereichen

Um auf Microsoft Graph zuzugreifen, verwenden Sie das offizielle Microsoft Graph SDK für Python, das delegierte und Anwendungsberechtigungen unterstützt.

In diesem Beispiel wird veranschaulicht, wie das SDK eine Anmeldeinformation verwendet, um ein Zugriffstoken mit dem erforderlichen Autorisierungsbereich https://graph.microsoft.com/.default anzufordern und auf Microsoft Graph-Ressourcen zuzugreifen. Die Identität muss in Microsoft Entra ID mit den entsprechenden Anwendungsberechtigungen (z. B. User.Read.All) autorisiert werden, um Benutzerdaten abzurufen. Andernfalls schlägt die Anforderung mit einem 403 Forbidden fehl.

Von Bedeutung

Stellen Sie sicher, dass Ihrer App oder Identität die User.Read.All oder andere erforderliche Berechtigungen in Microsoft Entra ID erteilt wurden.

from azure.identity import DefaultAzureCredential
from msgraph.core import GraphClient

credential = DefaultAzureCredential()
client = GraphClient(credential=credential, scopes=["https://graph.microsoft.com/.default"])

response = client.get("/users")
users = response.json().get("value", [])
for user in users:
    print(user["displayName"])

Erfahren Sie mehr über dieses SDK im offiziellen Build Python-Apps mit Microsoft Graph-Tutorial.

Diagnostizieren von Autorisierungsfehlern

Autorisierungsprobleme verursachen häufig HTTP 403 Verbotene Fehler, die auf unzureichende Berechtigungen hinweisen. So diagnostizieren Sie diese Probleme:

  • Überprüfen Sie Fehlermeldungen: Überprüfen Sie die Antwort auf Details zu fehlenden Berechtigungen.

  • Protokollierung aktivieren: Verwenden Sie Python Protokollierung, um Anforderungen und Antworten zu prüfen.

    import logging
    logging.basicConfig(level=logging.DEBUG)
    
  • Überprüfen Sie den Zugriff: Verwenden Sie Azure CLI oder das Azure Portal, um Rollenzuweisungen zu überprüfen.

    az role assignment list --assignee <principal-id> --scope <scope>
    

    Ersetzen Sie <principal-id> mit der Objekt-ID Ihres Benutzers, Dienstprinzipals oder der verwalteten Identität. Ersetzen Sie <scope> durch einen Azure-Ressourcenbereich, wie z. B. eine Abonnement-ID, einen Ressourcengruppennamen oder eine Ressource. Siehe Arbeiten mit Bereichen.

Arbeiten mit Bereichen

Häufig müssen Sie einen Bereich angeben, z. B. im folgenden Beispiel:

az role assignment list \
    --assignee <principal-id> \
    --scope <scope>

Hier sind einige gängige Bereichsformate:

Bereichsebene Beispielwert
Subscription /subscriptions/<subscription-id>
Ressourcengruppe /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>
Ressourcenname /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/<provider-namespace>/<resource-type>/<resource-name>

So können Sie beispielsweise alle Rollenzuweisungen für eine verwaltete Identität auf Ressourcengruppenebene auflisten:

az role assignment list \
  --assignee 12345678-90ab-cdef-1234-567890abcdef \
  --scope /subscriptions/<subscription-id>/resourceGroups/my-resource-group

Oder auf Abonnementebene:

az role assignment list \
  --assignee 12345678-90ab-cdef-1234-567890abcdef \
  --scope /subscriptions/<subscription-id>

Um die Objekt-ID (<principal-id>) eines Benutzers oder einer verwalteten Identität abzurufen, verwenden Sie Folgendes:

az ad user show --id <user-email> --query id
az identity show --name <identity-name> --resource-group <rg-name> --query principalId

Verwalten des Zugriffs

Verwalten des Zugriffs über Rollenzuweisungen mithilfe von:

  • Azure Portal: Hinzufügen von Rollen über das Zugriffssteuerungsmenü (IAM)

  • Azure CLI:

    az role assignment create --assignee <principal-id> --role <role-name> --scope <scope>
    

    Ersetzen Sie <principal-id> mit der Objekt-ID Ihres Benutzers, Dienstprinzipals oder der verwalteten Identität. Ersetzen Sie <scope> durch einen Azure-Ressourcenbereich, wie z. B. eine Abonnement-ID, einen Ressourcengruppennamen oder einen Ressourcennamen. Siehe Arbeiten mit Bereichen.

  • ARM-Vorlagen: Wird für die deklarative Verwaltung verwendet.

Weisen Sie bei verwalteten Identitäten der Identität, die Ressourcen wie virtuellen Computern zugeordnet ist, Rollen zu. Verwenden Sie das Feature "Zugriff überprüfen" des Azure Portals oder die Azure CLI, um effektive Berechtigungen zu überprüfen.

Dienstspezifische Autorisierungsnotizen

Im Abschnitt "Dienstspezifische Mechanismen" haben Sie gelernt, dass einige Azure Dienste eindeutige Autorisierungsmethoden bieten. Dieser Abschnitt enthält weitere Details für jeden der drei erwähnten Azure-Dienste.

Azure Storage

  • RBAC: Verwaltet Steuerungsebenenvorgänge.
  • SAS und ACLs: Steuern des Datenebenenzugriffs, wobei die Microsoft Entra-Authentifizierung ebenfalls unterstützt wird.

Beispiel: Zugreifen auf Blobs mit Microsoft Entra-ID

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

credential = DefaultAzureCredential()
client = BlobServiceClient(account_url="https://<account-name>.blob.core.windows.net", credential=credential)
containers = client.list_containers()
for container in containers:
    print(container.name)

Ersetzen Sie den <account-name> Namen Ihres Azure Storage-Kontos.

Azure Key Vault (ein Dienst zur sicheren Verwaltung kryptografischer Schlüssel)

Verwenden Sie RBAC anstelle von Legacyzugriffsrichtlinien zur Konsistenz. Zugriffsrichtlinien werden weiterhin unterstützt, aber nicht bevorzugt.

Beispiel: Abrufen eines Geheimnisses

from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient

credential = DefaultAzureCredential()
client = SecretClient(vault_url="https://<vault-name>.vault.azure.net", credential=credential)
secret = client.get_secret("my-secret")
print(secret.value)

Ersetzen Sie <vault-name> durch den Namen Ihrer Key Vault-Ressource.

Microsoft Graph

Verwendet OAuth 2.0-Bereiche für delegierte Berechtigungen und Anwendungsberechtigungen für Daemon-Apps. Geben Sie Bereiche an, wie im vorherigen Beispiel gezeigt.

Bewährte Methoden

  • Geringste Berechtigung: Weisen Sie nur erforderliche Berechtigungen zu, z. B. "Reader" anstelle von "Mitwirkender".
  • Bevorzugen Sie RBAC: Insbesondere für Key Vault, für einheitliche Zugriffssteuerung.
  • Verwaltete Identitäten verwenden: Vermeiden Sie die Verwaltung von Anmeldeinformationen im Code.
  • Einschränken von Graph-Berechtigungen: Fordern Sie bestimmte Bereiche an, um Risiken zu minimieren.

Nächste Schritte