Partager via


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, le secret client et l'ID de votre locataire sont ensuite stockés dans des variables d'environnement afin qu'ils puissent être utilisés par le 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 permissions 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 parle pas à des 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 gardez cette fenêtre ouverte car vous aurez besoin de ces valeurs dans les étapes suivantes et vous ne pourrez plus voir la valeur du mot de passe (secret client).

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

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 au principal de service au niveau 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 dont l'appId est 00001111-aaaa-2222-bbbb-3333cccc4444 à accéder en lecture, écriture et suppression aux conteneurs et données de blob d'Azure Storage dans tous les comptes de stockage du groupe de ressources msdocs-python-sdk-auth-example dans l'abonnement dont l'ID est aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e, vous devez affecter le principal de service de l'application au rôle Contributeur de données de blob de stockage à l'aide de la commande suivante.

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"

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_CLIENT_ID, AZURE_TENANT_ID et AZURE_CLIENT_SECRET pour le processus qui exécute votre application Python afin que les informations d'identification principales du service d'application soient disponibles pour votre application au moment de l'exécution. L'objet DefaultAzureCredential recherche les informations relatives au principal du service dans ces variables d'environnement.

Lorsque vous utilisez Gunicorn pour exécuter des applications Web Python dans un environnement serveur UNIX, les variables d'environnement pour une application peuvent être spécifiées en utilisant la directive EnvironmentFile dans le fichier gunicorn.server 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 directive EnvironmentFile 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 SDK Azure auprès d'Azure, votre application doit utiliser la classe DefaultAzureCredential du package azure.identity.

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

pip install azure-identity

Ensuite, pour tout code Python qui crée un objet client Azure SDK dans votre application, vous devrez :

  1. Importez la classe DefaultAzureCredential du module azure.identity.
  2. Créez un objet DefaultAzureCredential.
  3. Transmettez l'objet DefaultAzureCredential au constructeur de l'objet client du 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 d'environnement AZURE_TENANT_ID, AZURE_CLIENT_ID et AZURE_CLIENT_SECRET pour obtenir les informations sur le principal du service d'application avec lequel se connecter à Azure.