Créer un principal du service Azure à l’aide d’Azure CLI

Les outils automatisés qui utilisent les services Azure doivent toujours avoir des autorisations restreintes. Plutôt que de faire se connecter des applications en tant qu’utilisateur entièrement privilégié, Azure offre des principaux du service.

Qu’est-ce qu’un principal de service Azure ?

Un principal de service Azure est une identité créée pour une utilisation avec les applications, des services hébergés et des outils automatisés permettant d’accéder aux ressources Azure. Cet accès est limité par les rôles assignés au principal du service, ce qui vous permet de contrôler quelles ressources sont accessibles et à quel niveau. Pour des raisons de sécurité, il est toujours recommandé d’utiliser les principaux du service avec des outils automatisés, plutôt que de leur permettre de se connecter avec une identité d’utilisateur.

Cet article vous explique les étapes à suivre pour créer, réinitialiser et obtenir des informations sur un principal de service Azure avec l’interface Azure CLI.

1. Créer un principal de service

Créez un principal de service Azure avec la commande az ad sp create-for-rbac.

Les clés appId et tenant s’affichent dans la sortie de az ad sp create-for-rbac et sont utilisés dans l’authentification du principal du service. Enregistrez leurs valeurs, mais elles peuvent être récupérées à tout moment avec la liste az ad sp.

Lorsque vous créez un principal de service, vous choisissez le type d’authentification de connexion qu’il utilise. Il existe deux types d’authentification pour les principaux de service Azure : l’authentification par mot de passe et l’authentification par certificat.

Avertissement

Lorsque vous créez un principal de service Azure avec la commande az ad sp create-for-rbac, la sortie contient les informations d’identification que vous devez protéger. Veillez à ne pas inclure ces informations d’identification dans votre code ou vérifiez les informations d’identification dans votre contrôle de code source. Vous pouvez aussi utiliser des identités managées, si elles sont disponibles, pour éviter d’avoir à utiliser les informations d’identification.

Pour réduire le risque d’un principal de service compromis, attribuez un rôle plus spécifique, et limitez les étendues à une ressource ou à un groupe de ressources. Pour plus d’informations, consultez Étapes pour ajouter une attribution de rôle.

L’authentification basée sur un mot de passe

Avec l’authentification par mot de passe, un mot de passe aléatoire est créé pour vous. Si vous ne spécifiez pas de valeur pour le paramètre --name, un nom contenant un horodatage est créé pour vous. Vous devez spécifier un paramètre --scopes, car il n’a pas de valeur par défaut. Si vous préférez, vous pouvez définir l’attribution de rôle ultérieurement en utilisant az role assignment create.

# Create a service principal with required parameter
az ad sp create-for-rbac --scopes /subscriptions/mySubscriptionID

# Create a service principal for a resource group using a preferred name and role
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role reader \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName

Vous pouvez aussi créer un principal de service en utilisant des variables.

let "randomIdentifier=$RANDOM*$RANDOM"  
servicePrincipalName="msdocs-sp-$randomIdentifier"
roleName="azureRoleName"
subscriptionID=$(az account show --query id -o tsv)
# Verify the ID of the active subscription
echo "Using subscription ID $subscriptionID"
resourceGroup="myResourceGroupName"

echo "Creating SP for RBAC with name $servicePrincipalName, with role $roleName and in scopes /subscriptions/$subscriptionID/resourceGroups/$resourceGroup"
az ad sp create-for-rbac --name $servicePrincipalName --role $roleName --scopes /subscriptions/$subscriptionID/resourceGroups/$resourceGroup

La sortie d’un principal de service avec l’authentification par mot de passe comprend la clé password. Veillez à copier cette valeur, car elle ne pourra pas être récupérée. Si vous perdez le mot de passe, effectuez une réinitialisation des informations d’identification du principal de service.

Authentification par certificat

Pour l’authentification basée sur un certificat, utilisez le paramètre --cert. Cet argument nécessite la détention d’un certificat existant. Assurez-vous que n’importe quel outil qui utilise ce principal de service a accès à la clé privée du certificat. Les certificats doivent être au format ASCII tel que PEM, CER ou DER. Transmettez le certificat sous forme de chaîne, ou utilisez le format @path pour charger le certificat depuis un fichier.

Notes

Quand un fichier PEM est utilisé, un CERTIFICAT doit être ajouté à la CLÉ PRIVÉE dans le fichier.

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert "-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----"
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert @/path/to/cert.pem

Le paramètre --keyvault peut être ajouté pour utiliser un certificat dans Azure Key Vault. Dans ce cas, la valeur --cert fait référence au nom du certificat.

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert certificateName \
                         --keyvault vaultName

Pour créer un certificat auto-signé pour l’authentification, utilisez le paramètre --create-cert :

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --create-cert

Sortie de la console :

Creating a role assignment under the scopes of "/subscriptions/myId"
Please copy C:\myPath\myNewFile.pem to a safe place.
When you run 'az login', provide the file path in the --password parameter
{
  "appId": "myAppId",
  "displayName": "myDisplayName",
  "fileWithCertAndPrivateKey": "C:\\myPath\\myNewFile.pem",
  "name": "http://myName",
  "password": null,
  "tenant": "myTenantId"
}

Contenu du nouveau fichier PEM :

-----BEGIN PRIVATE KEY-----
myPrivateKeyValue
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
myCertificateValue
-----END CERTIFICATE-----

Notes

La commande az ad sp create-for-rbac --create-cert crée le principal du service et un fichier PEM. Le fichier PEM contient une CLÉ PRIVÉE correctement mise en forme et un CERTIFICAT.

Le paramètre --keyvault peut être ajouté pour stocker le certificat dans Azure Key Vault. Lors de l’utilisation de --keyvault, le paramètre --cert est obligatoire.

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --create-cert \
                         --cert certificateName \
                         --keyvault vaultName

À moins que vous ne stockiez le certificat dans Key Vault, la sortie comprend la clé fileWithCertAndPrivateKey. La valeur de cette clé vous indique l’emplacement dans lequel le certificat généré est stocké. Assurez-vous d’avoir copié le certificat à un emplacement sécurisé ou vous ne pourrez pas vous connecter avec ce principal de service.

Si vous perdez l’accès à la clé privée d’un certificat, effectuez la réinitialisation des informations d’identification du principal du service.

Récupérer un certificat à partir de Key Vault

Pour les certificats stockés dans Key Vault, vous devez récupérer le certificat et sa clé privée avec az keyvault secret show, puis le convertir au format PEM. Dans Key Vault, le nom du secret du certificat est identique au nom du certificat.

az keyvault secret download --file /path/to/cert.pfx --vault-name VaultName --name CertName --encoding base64
openssl pkcs12 -in cert.pfx -passin pass: -out cert.pem -nodes

2. Obtenir un principal de service existant

Une liste des principaux de service dans un locataire peut être récupérée avec la liste az ad sp. Par défaut, la commande retourne les cents premiers principaux de service de votre locataire. Pour obtenir tous les principaux de service d’un locataire, utilisez le paramètre --all. Obtenir cette liste peut prendre beaucoup de temps : il est donc recommandé de filtrer la liste avec un des paramètres suivants :

  • --display-name demande les principaux de service ayant un préfixe qui correspond au nom fourni. Le nom d’affichage d’un principal de service est la valeur définie avec le paramètre --name lors de la création. Si vous n’avez pas défini --name lors de la création du principal de service, le nom du préfixe est azure-cli-.
  • --spn filtre la correspondance exacte de nom de principal du service. Le nom de principal du service commence toujours par https://. si la valeur que vous avez utilisé pour --name n’était pas un URI, cette valeur est https:// suivie du nom d’affichage.
  • --show-mine demande uniquement les principaux du service créés par l’utilisateur connecté.
  • --filter utilise un filtre OData et effectue un filtrage côté serveur. Cette méthode est préférable au filtrage côté client avec le paramètre --query de l’interface de ligne de commande. Pour en savoir plus sur les filtres OData, consultez syntaxe d’expression de filtres OData.

Les informations retournées pour les objets de principaux du service sont détaillées. Pour obtenir uniquement les informations nécessaires pour vous connecter, utilisez la chaîne de requête [].{id:appId, tenant:appOwnerTenantId}. Par exemple, pour obtenir les informations de connexion de tous les principaux du service créés par l’utilisateur actuellement connecté :

az ad sp list --show-mine --query "[].{id:appId, tenant:appOwnerTenantId}"

Important

az ad sp list ou affichage az ad sp permettent d’obtenir l’utilisateur et le locataire, mais pas les secrets d’authentification ou la méthode d’authentification. Les secrets des certificats dans Key Vault peuvent être récupérés avec affichage du secret du coffre de clés az, mais aucun autre secret n’est stocké par défaut. Si vous oubliez une méthode d’authentification ou un secret, effectuez la réinitialisation des informations d’identification du principal du service.

3. Gérer les rôles du principal de service

L’interface de ligne de commande Azure fournit les commandes suivantes de gestion d’attributions de rôle :

Le rôle Contributeur dispose des autorisations complètes de lecture et d’écriture dans un compte Azure. Le rôle de Lecteur est plus restrictif avec un accès en lecture seule. Pour plus d’informations sur les rôles et le contrôle d’accès en fonction du rôle, consultez RBAC : rôles intégrés pour les ressources Azure.

Cet exemple ajoute le rôle Lecteur et supprime le rôle Contributeur :

az role assignment create --assignee appID \
                          --role Reader \
                          --scope /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName

az role assignment delete --assignee appID \
                          --role Contributor \
                          --scope /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName

L’ajout d’un rôle ne restreint pas les autorisations précédemment assignées. Lors de la restriction des autorisations du principal de service, le rôle Contributeur doit être supprimé s’il avait été attribué précédemment.

Les modifications peuvent être vérifiées en répertoriant les rôles attribués :

az role assignment list --assignee appID

4. Se connecter en utilisant un principal de service

Testez les informations d’identification et les autorisations du nouveau principal du service en vous connectant. Pour vous connecter avec un principal de service, vous avez besoin de appId, tenant ainsi que des informations d’identification.

Pour vous connecter avec un principal du service utilisant un mot de passe :

az login --service-principal --username appID --password PASSWORD --tenant tenantID

Pour vous connecter avec un certificat, celui-ci doit être disponible localement sous forme de fichier PEM ou DER, ou au format ASCII. Quand un fichier PEM est utilisé, la CLÉ PRIVÉE et le CERTIFICAT doivent être ajoutés ensemble dans le fichier.

az login --service-principal --username appID --tenant tenantID --password /path/to/cert

Pour en savoir plus sur la connexion avec un principal du service, consultez Se connecter avec l’interface de ligne de commande Azure.

5. Créer une ressource en utilisant un principal de service

La section suivante fournit un exemple de création d’une ressource pour le Stockage Azure avec un principal de service, en utilisant les commandes suivantes :

Pour vous connecter avec un principal de service, vous avez besoin que appID, tenantID et password soient retournés comme réponse lorsque vous avez créé votre principal de service.

  1. Connectez-vous en tant que principal du service.

    az login --service-principal --username appID --password PASSWORD --tenant tenantID
    
  2. Créez un groupe de ressources pour y mettre toutes les ressources utilisées pour le même démarrage rapide, le même tutoriel ou le même projet de développement.

    az group create --location westus --name myResourceGroupName
    
  3. Créez un compte de stockage.

    Pour Stockage Azure, les valeurs valides du paramètre <KIND> sont les suivantes :

    • BlobStorage
    • BlockBlobStorage
    • FileStorage
    • Stockage
    • StorageV2
    az storage account create --name myStorageAccountName --resource-group myResourceGroupName --kind <KIND> --sku F0 --location westus --yes
    
  4. Récupérez les clés de ressource que vous utilisez dans votre code pour vous authentifier auprès du compte de stockage Azure.

    az storage account keys list --name myStorageAccountName --resource-group myResourceGroupName
    

6. Réinitialiser les informations d’identification

Si vous avez perdu les informations d’identification d’un principal de service, utilisez la az ad sp credential reset. La commande de réinitialisation prend les mêmes arguments que az ad sp create-for-rbac.

az ad sp credential reset --name myServicePrincipal_appID_or_name

7. Résolution de problèmes

Privilèges insuffisants

Si votre compte ne dispose pas d’autorisations pour créer un principal de service, az ad sp create-for-rbac va retourner un message d’erreur contenant « Privilèges insuffisants pour effectuer l’opération ». Contactez votre administrateur Azure Active Directory pour créer un principal de service.

Locataire non valide

Si vous avez spécifié un ID d’abonnement non valide, le message d’erreur suivant s’affiche : « La demande n’a pas d’abonnement ou de fournisseur de ressources de niveau locataire valide. » Si vous utilisez des variables, utilisez la commande Bash echo pour voir la valeur passée à la commande de référence. Utilisez az account set pour changer votre abonnement ou découvrez Comment gérer les abonnements Azure avec Azure CLI.

Groupe de ressources introuvable

Si vous avez spécifié un nom de groupe de ressources non valide, le message d’erreur suivant s’affiche : « Le groupe de ressources 'nom' est introuvable. » Si vous utilisez des variables, utilisez la commande Bash echo pour voir la valeur passée aux commandes d’abonnement et de référence. Utilisez az group list pour voir les groupes de ressources de l’abonnement actuel, ou découvrez Comment gérer les groupes de ressources Azure avec Azure CLI.

Autorisation d’effectuer l’action

Si votre compte ne dispose pas d’autorisations pour assigner un rôle, un message d’erreur vous indiquera que votre compte « n’est pas autorisé à effectuer l’action ’Microsoft.Authorization/roleAssignments/write’ ». Contactez votre administrateur Azure Active Directory pour gérer les rôles.

Voir aussi