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. La création d’un principal de service d’application génère un ID client et une clé secrète client pour votre application. Vous stockez l’ID client, la clé secrète client et votre ID de locataire dans les variables d’environnement à utiliser 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. La création d’une inscription d’application différente permet la configuration des autorisations de ressources spécifiques à l’environnement pour chaque principal de service et garantit qu’une application déployée dans un environnement ne communique pas avec les ressources Azure qui font partie d’un autre environnement.

Inscrire l’application dans Azure

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

APP_NAME=<app-name>
az ad sp create-for-rbac --name $APP_NAME

La sortie de la commande est similaire à 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"
}

Ensuite, vous devez obtenir la appID valeur et la stocker dans une variable. Cette valeur est utilisée pour définir des variables d’environnement dans votre environnement de développement local afin que le Kit de développement logiciel (SDK) Azure pour Python puisse s’authentifier auprès d’Azure à l’aide du principal de service.

APP_ID=$(az ad sp create-for-rbac \
  --name $APP_NAME --query appId --output tsv)

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.

RESOURCE_GROUP_NAME=<resource-group-name>
SUBSCRIPTION_ID=$(az account show --query id --output tsv)
ROLE_NAME=<role-name>

az role assignment create \
  --assignee "$APP_ID" \
  --scope "./subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME" \
  --role "$ROLE_NAME"

![! REMARQUE] Pour empêcher Git Bash de traiter /subscriptions/... en tant que chemin de fichier, ajoutez ./ au début de la chaîne pour le paramètre scope et utilisez des guillemets doubles autour de toute la chaîne.

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.

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.

Lors de l’utilisation de 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. Consultez l’exemple qui suit.

[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 suit.

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

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 devez :

  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 cette approche 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)

À partir de cet exemple, lorsque le code instancie l’objet DefaultAzureCredential, DefaultAzureCredential lit les variables d’environnement AZURE_TENANT_ID, AZURE_CLIENT_ID et AZURE_CLIENT_SECRET pour obtenir les informations du principal du service de l’application permettant de se connecter à Azure.