Utiliser un principal de service Azure à l’aide de l’interface 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 à des ressources. Les rôles attribués au principal de service limitent l’accès. Vous pouvez ainsi contrôler les ressources qui sont accessibles et à quel niveau. Pour des raisons de sécurité, il est toujours recommandé d’utiliser les principaux de 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 without a role assignment
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
Convertir le fichier PKCS12 existant
Si vous disposez déjà d’un fichier PKCS#12, vous pouvez le convertir au format PEM à l’aide d’OpenSSL. Si vous avez un mot de passe, modifiez l’argument passin
.
openssl pkcs12 -in fileName.p12 -clcerts -nodes -out fileName.pem -passin pass:
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 estazure-cli-
.--spn
filtre la correspondance exacte de nom de principal du service. Le nom de principal du service commence toujours parhttps://
. si la valeur que vous avez utilisé pour--name
n’était pas un URI, cette valeur esthttps://
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 vous utilisez un fichier PEM, la CLÉ PRIVÉE et le CERTIFICAT doivent être ajoutés 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 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.
Connectez-vous en tant que principal de service.
az login --service-principal --username appID --password PASSWORD --tenant tenantID
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
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
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
retourne 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 transmise à 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 transmise 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.