S’authentifier auprès des ressources Azure à partir d’applications Python hébergées localement

Les applications hébergées en dehors d’Azure (par exemple, localement ou dans un centre de données tiers) doivent utiliser un principal de service d’application pour s’authentifier auprès d’Azure lors de l’accès aux ressources Azure. Les objets principaux du service d’application sont créés à l’aide du processus d’inscription d’application dans Azure. Lorsqu’un principal de service d’application est créé, un ID client et une clé secrète client sont générés pour votre application. L’ID client, la clé secrète client et votre ID de locataire sont ensuite stockés dans des variables d’environnement afin qu’elles puissent être utilisées par le Kit de développement logiciel (SDK) Azure pour Python pour authentifier votre application auprès d’Azure au moment de l’exécution.

Une inscription d’application différente doit être créée pour chaque environnement dans lequel l’application est hébergée. Cela permet de configurer des autorisations de ressources spécifiques à l’environnement pour chaque principal de service et de s’assurer qu’une application déployée dans un environnement ne communique pas avec les ressources Azure qui font partie d’un autre environnement.

1. Enregistrement de l'application dans Azure AD

Une application peut être inscrite auprès d’Azure à l’aide du Portail Azure ou d’Azure CLI.

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

La sortie produite par cette commande est semblable à ce qui suit : Notez ces valeurs ou laissez cette fenêtre ouverte, car vous aurez besoin de ces valeurs dans les étapes suivantes et ne pourrez plus afficher la valeur de mot de passe (clé secrète client).

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

2 - Attribuer des rôles au principal du service d’application

Ensuite, vous devez déterminer les rôles (autorisations) dont votre application a besoin sur les ressources et affecter ces rôles à votre application. Les rôles peuvent se voir attribuer un rôle au niveau d’une ressource, d’un groupe de ressources ou d’une étendue d’abonnement. Cet exemple montre comment attribuer des rôles pour le principal de service à l’étendue du groupe de ressources, car la plupart des applications regroupent toutes leurs ressources Azure dans un seul groupe de ressources.

Un principal de service se voit attribuer un rôle dans Azure à l’aide de la commande az role assignment create.

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

Pour obtenir les noms de rôles auxquels un principal de service peut être affecté, utilisez la commande az role definition list.

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

Par exemple, pour autoriser le principal de service avec l’appId de 00000000-0000-0000-0000-000000000000 lecture, d’écriture et de suppression de l’accès à Stockage Azure conteneurs d’objets blob et aux données dans tous les comptes de stockage du groupe de ressources msdocs-python-sdk-auth-example dans l’abonnement avec l’ID11111111-1111-1111-1111-111111111111, vous devez affecter le principal du service d’application au rôle contributeur aux données blob Stockage à l’aide de la commande suivante.

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"

Pour plus d’informations sur l’attribution d’autorisations au niveau de la ressource ou de l’abonnement à l’aide d’Azure CLI, consultez l’article Attribuer des rôles Azure à l’aide d’Azure CLI.

3 - Configurer des variables d’environnement pour l’application

Vous devez définir les variables d’environnement AZURE_TENANT_IDet AZURE_CLIENT_SECRET les AZURE_CLIENT_IDvariables d’environnement du processus qui exécute votre application Python pour rendre les informations d’identification du principal du service d’application disponibles pour votre application au moment de l’exécution. L’objet DefaultAzureCredential recherche les informations du principal de service dans ces variables d’environnement.

Lorsque vous utilisez Gunicorn pour exécuter des applications web Python dans un environnement de serveur UNIX, les variables d’environnement d’une application peuvent être spécifiées à l’aide de la EnvironmentFile directive dans le gunicorn.server fichier, comme indiqué ci-dessous.

[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

Le fichier spécifié dans la EnvironmentFile directive doit contenir une liste de variables d’environnement avec leurs valeurs, comme indiqué ci-dessous.

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

4 - Implémenter DefaultAzureCredential dans l’application

Pour authentifier les objets clients du Kit de développement logiciel (SDK) Azure sur Azure, votre application doit utiliser la DefaultAzureCredential classe à partir du azure.identity package.

Commencez par ajouter le package azure.identity à votre application.

pip install azure-identity

Ensuite, pour tout code Python qui crée un objet client du Kit de développement logiciel (SDK) Azure dans votre application, vous devez :

  1. Importez la DefaultAzureCredential classe à partir du azure.identity module.
  2. Créez un objet DefaultAzureCredential.
  3. Transmettez l’objet DefaultAzureCredential au constructeur d’objet client du Kit de développement logiciel (SDK) Azure.

Un exemple de cela est illustré dans le segment de code suivant.

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)

Lorsque le code ci-dessus instancie l’objet DefaultAzureCredential , DefaultAzureCredential lit les variables AZURE_TENANT_IDd’environnement, AZURE_CLIENT_IDet AZURE_CLIENT_SECRET pour que les informations du principal du service d’application se connectent à Azure avec.