Door Azure gehoste apps verifiëren bij Azure-resources met de Azure SDK voor Python

Wanneer u een app in Azure host met behulp van services zoals Azure-app Service, Azure Virtual Machines of Azure Container Instances, is de aanbevolen methode voor het verifiëren van een app voor Azure-resources met beheerde identiteit.

Een beheerde identiteit biedt een identiteit voor uw app, zodat deze verbinding kan maken met andere Azure-resources zonder dat u een geheime sleutel of een ander toepassingsgeheim hoeft te gebruiken. Intern kent Azure de identiteit van uw app en met welke resources verbinding mag worden gemaakt. Azure gebruikt deze informatie om automatisch Microsoft Entra-tokens voor de app te verkrijgen, zodat deze verbinding kan maken met andere Azure-resources, allemaal zonder dat u toepassingsgeheimen hoeft te beheren.

Typen beheerde identiteiten

Er zijn twee typen beheerde identiteit:

  • Door het systeem toegewezen beheerde identiteiten : dit type beheerde identiteit wordt geleverd door en rechtstreeks gekoppeld aan een Azure-resource. Wanneer u beheerde identiteit inschakelt voor een Azure-resource, krijgt u een door het systeem toegewezen beheerde identiteit voor die resource. Een door het systeem toegewezen beheerde identiteit is gekoppeld aan de levenscyclus van de Azure-resource waaraan deze is gekoppeld. Als de resource wordt verwijderd, wordt de identiteit automatisch verwijderd. Omdat u alleen beheerde identiteit moet inschakelen voor de Azure-resource die als host fungeert voor uw code, is deze benadering het eenvoudigste type beheerde identiteit dat moet worden gebruikt.
  • Door de gebruiker toegewezen beheerde identiteiten : u kunt ook een beheerde identiteit maken als een zelfstandige Azure-resource. Deze benadering wordt het vaakst gebruikt wanneer uw oplossing meerdere workloads heeft die worden uitgevoerd op meerdere Azure-resources die allemaal dezelfde identiteit en dezelfde machtigingen moeten delen. Als uw oplossing bijvoorbeeld onderdelen had die worden uitgevoerd op meerdere App Service- en virtuele-machine-exemplaren die allemaal toegang nodig hebben tot dezelfde set Azure-resources, is een door de gebruiker toegewezen beheerde identiteit die in deze resources wordt gebruikt logisch.

In dit artikel worden de stappen beschreven voor het inschakelen en gebruiken van een door het systeem toegewezen beheerde identiteit voor een app. Als u een door de gebruiker toegewezen beheerde identiteit wilt gebruiken, raadpleegt u het artikel Door de gebruiker toegewezen beheerde identiteiten beheren om te zien hoe u een door de gebruiker toegewezen beheerde identiteit maakt.

1 - Beheerde identiteit inschakelen in de Azure-resource die als host fungeert voor de app

De eerste stap is het inschakelen van een beheerde identiteit in Azure-resource die als host fungeert voor uw app. Als u bijvoorbeeld een Django-toepassing host met behulp van Azure-app Service, moet u beheerde identiteit inschakelen voor de App Service-web-app die als host fungeert voor uw app. Als u een virtuele machine gebruikt om uw app te hosten, stelt u uw VIRTUELE machine in staat om beheerde identiteit te gebruiken.

U kunt een beheerde identiteit inschakelen voor een Azure-resource met behulp van De Azure-portal of de Azure CLI.

Azure CLI-opdrachten kunnen worden uitgevoerd in Azure Cloud Shell of op een werkstation waarop de Azure CLI is geïnstalleerd.

De Azure CLI-opdrachten die worden gebruikt om beheerde identiteit voor een Azure-resource in te schakelen, zijn van het formulier az <command-group> identity --resource-group <resource-group-name> --name <resource-name>. Hieronder ziet u specifieke opdrachten voor populaire Azure-services.

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

De uitvoer ziet er als volgt uit.

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

De principalId waarde is de unieke id van de beheerde identiteit. Bewaar een kopie van deze uitvoer omdat u deze waarden nodig hebt in de volgende stap.

2 - Rollen toewijzen aan de beheerde identiteit

Vervolgens moet u bepalen welke rollen (machtigingen) uw app nodig heeft en de beheerde identiteit toewijzen aan die rollen in Azure. Aan een beheerde identiteit kunnen rollen worden toegewezen voor een resource, resourcegroep of abonnementsbereik. In dit voorbeeld ziet u hoe u rollen toewijst aan het bereik van de resourcegroep, omdat de meeste toepassingen al hun Azure-resources groeperen in één resourcegroep.

Aan een beheerde identiteit wordt een rol in Azure toegewezen met behulp van de opdracht az role assignment create . Gebruik voor de toegewezen gebruiker de principalId die u in stap 1 hebt gekopieerd.

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

Gebruik de opdracht az role definition list om de rolnamen op te halen waaraan een service-principal kan worden toegewezen.

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

Als u bijvoorbeeld de beheerde identiteit wilt toestaan met de id van 99999999-9999-9999-9999-999999999999 lees-, schrijf- en verwijdertoegang tot Azure Storage-blobcontainers en -gegevens in alle opslagaccounts in de resourcegroep msdocs-python-sdk-auth-auth-example in het abonnement met id 11111111-1111-1111-1111-111111111111, wijst u de service-principal van de toepassing toe aan de rol Inzender voor opslagblobgegevens met behulp van de volgende opdracht.

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"

Zie het artikel Azure-rollen toewijzen met behulp van de Azure CLI voor informatie over het toewijzen van machtigingen op resource- of abonnementsniveau met behulp van de Azure CLI.

3 - DefaultAzureCredential implementeren in uw toepassing

Wanneer uw code wordt uitgevoerd in Azure en beheerde identiteit is ingeschakeld voor de Azure-resource die als host fungeert voor uw app, bepaalt de DefaultAzureCredential referenties die u in de volgende volgorde wilt gebruiken:

  1. Controleer de omgeving op een service-principal zoals gedefinieerd door de omgevingsvariabelen AZURE_CLIENT_ID, AZURE_TENANT_IDen of AZURE_CLIENT_SECRET ( AZURE_CLIENT_CERTIFICATE_PATH optioneel) AZURE_CLIENT_CERTIFICATE_PASSWORD.
  2. Controleer trefwoordparameters voor een door de gebruiker toegewezen beheerde identiteit. U kunt een door de gebruiker toegewezen beheerde identiteit doorgeven door de client-id in de managed_identity_client_id parameter op te geven.
  3. Controleer de AZURE_CLIENT_ID omgevingsvariabele voor de client-id van een door de gebruiker toegewezen beheerde identiteit.
  4. Gebruik de door het systeem toegewezen beheerde identiteit voor de Azure-resource als deze is ingeschakeld.

U kunt beheerde identiteiten uitsluiten van de referentie door de exclude_managed_identity_credential parameter Truevoor trefwoorden in te stellen.

In dit artikel gebruiken we de door het systeem toegewezen beheerde identiteit voor een Azure-app Service-web-app. Daarom hoeven we geen beheerde identiteit in de omgeving te configureren of door te geven als parameter. De volgende stappen laten zien hoe u deze kunt gebruiken DefaultAzureCredential.

Voeg eerst het azure.identity pakket toe aan uw toepassing.

pip install azure-identity

Vervolgens wilt u voor elke Python-code die een Azure SDK-clientobject maakt in uw app het volgende doen:

  1. Importeer de DefaultAzureCredential klasse uit de azure.identity module.
  2. Maak een DefaultAzureCredential object.
  3. Geef het DefaultAzureCredential object door aan de objectconstructor van de Azure SDK-client.

Een voorbeeld van deze stappen wordt weergegeven in het volgende codesegment.

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)

Zoals beschreven in het overzichtsartikel over Azure SDK voor Python-verificatie, DefaultAzureCredential ondersteunt u meerdere verificatiemethoden en bepaalt u de verificatiemethode die tijdens runtime wordt gebruikt. Het voordeel van deze aanpak is dat uw app verschillende verificatiemethoden in verschillende omgevingen kan gebruiken zonder omgevingsspecifieke code te implementeren. Wanneer de voorgaande code wordt uitgevoerd op uw werkstation tijdens lokale ontwikkeling, DefaultAzureCredential gebruikt u een toepassingsservice-principal, zoals wordt bepaald door de omgevingsinstellingen of de referenties van het hulpprogramma voor ontwikkelaars om te verifiëren met andere Azure-resources. Daarom kan dezelfde code worden gebruikt om uw app te verifiëren bij Azure-resources tijdens zowel lokale ontwikkeling als wanneer deze wordt geïmplementeerd in Azure.