Verifiëren bij Azure-resources vanuit Python-apps die on-premises worden gehost

Apps die buiten Azure worden gehost (bijvoorbeeld on-premises of in een datacenter van derden), moeten een service-principal voor toepassingen gebruiken voor verificatie bij Azure bij het openen van Azure-resources. Toepassingsservice-principalobjecten worden gemaakt met behulp van het app-registratieproces in Azure. Wanneer een toepassingsservice-principal wordt gemaakt, worden er een client-id en clientgeheim gegenereerd voor uw app. De client-id, het clientgeheim en uw tenant-id worden vervolgens opgeslagen in omgevingsvariabelen, zodat ze kunnen worden gebruikt door de Azure SDK voor Python om uw app tijdens runtime bij Azure te verifiëren.

Er moet een andere app-registratie worden gemaakt voor elke omgeving waarin de app wordt gehost. Hierdoor kunnen omgevingsspecifieke resourcemachtigingen worden geconfigureerd voor elke service-principal en zorgt u ervoor dat een app die in één omgeving is geïmplementeerd, niet praat met Azure-resources die deel uitmaken van een andere omgeving.

1 - De toepassing registreren in Azure

Een app kan worden geregistreerd bij Azure met behulp van Azure Portal of de Azure CLI.

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

De uitvoer van de opdracht ziet er ongeveer als volgt uit. Noteer deze waarden of houd dit venster open, omdat u deze waarden nodig hebt in de volgende stappen en de waarde voor het wachtwoord (clientgeheim) niet meer kunt weergeven.

{
  "appId": "00000000-0000-0000-0000-000000000000",
  "displayName": "msdocs-python-sdk-auth-prod",
  "password": "abcdefghijklmnopqrstuvwxyz",
  "tenant": "33333333-3333-3333-3333-333333333333"
}

2 - Rollen toewijzen aan de service-principal van de toepassing

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

Aan een service-principal wordt een rol toegewezen in Azure met behulp van de opdracht az role assignment create .

az role assignment create --assignee {appId} \
    --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 service-principal wilt toestaan met de appId van 00000000-0000-0000-0000-000000000000 lees-, schrijf- en verwijdertoegang tot Azure Storage-blobcontainers en -gegevens in alle opslagaccounts in de resourcegroep msdocs-python-sdk-auth-auth-auth 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 00000000-0000-0000-0000-000000000000 \
    --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 - Omgevingsvariabelen configureren voor toepassing

U moet de AZURE_CLIENT_ID, AZURE_TENANT_IDen AZURE_CLIENT_SECRET omgevingsvariabelen instellen voor het proces waarmee uw Python-app wordt uitgevoerd om de referenties van de toepassingsservice-principal tijdens runtime beschikbaar te maken voor uw app. Het DefaultAzureCredential object zoekt naar de informatie van de service-principal in deze omgevingsvariabelen.

Wanneer u Gunicorn gebruikt om Python-web-apps uit te voeren in een UNIX-serveromgeving, kunnen omgevingsvariabelen voor een app worden opgegeven met behulp van de EnvironmentFile instructie in het gunicorn.server bestand, zoals hieronder wordt weergegeven.

[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

Het bestand dat in de EnvironmentFile richtlijn is opgegeven, moet een lijst met omgevingsvariabelen met hun waarden bevatten, zoals hieronder wordt weergegeven.

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

4 - DefaultAzureCredential implementeren in de toepassing

Als u Azure SDK-clientobjecten wilt verifiëren bij Azure, moet uw toepassing de DefaultAzureCredential klasse van het azure.identity pakket gebruiken.

Begin met het toevoegen van het pakket azure.identity 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 hiervan 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)

Wanneer de bovenstaande code het DefaultAzureCredential object instantieert, DefaultAzureCredential leest u de omgevingsvariabelen AZURE_TENANT_IDAZURE_CLIENT_IDen AZURE_CLIENT_SECRET leest u de informatie van de service-principal van de toepassing waarmee u verbinding maakt met Azure.