Provisionner des App Registrations dans Entra ID avec Azure CLI

Florian CAILLAUD
Publié par Florian CAILLAUD
Catégorie : Azure / DevOps / Entra ID
22/01/2025

Introduction

 

Afin de sécuriser une application ou une API, il est généralement nécessaire de mettre en place des rôles sur lesquels les clients de cette application ou API devront avoir les permissions.

Dans Entra ID, cela implique d’avoir :

  • une App Registration Serveur représentant l’application ou l’API avec un scope et des rôles
  • une App Registration Client représentant le consommateur avec un ClientID, un ClientSecret et des permissions sur les rôles de l’App Registration Serveur

La mise en place de ces éléments peut devenir consommatrice de temps en fonction du nombre d’applications/APIs ou de clients. Nous allons donc voir ici comment faire face à ce problème en automatisant la création des éléments décrits plus haut avec Azure CLI.

 

Création de l’App Registration Serveur

 

Ici, on vérifie d’abord si l’App Registration Serveur existe déjà, sinon nous la créons en récupérant son application id (aka client id).

 

$appServerName = "AppRegServer"
$appServerURI = "api://myapp.or.myapi"

$appServerId = az ad app list --display-name "$appServerName" --query [].appId --output tsv --only-show-errors

if (!$appServerId) {
    $appServerId = az ad app create --display-name $appServerName --identifier-uris $appServerURI --homepage $appServerURI --query 'appId' --output tsv --only-show-errors

    Write-Host "The App Registration Server '$appServerName' was created (appId: $appServerId)"
}
else {
    Write-Host "The App Registration Server '$appServerName' already exists (appId: $appServerId)"  
}

 

Creation des rôles

 

À nouveau, nous vérifions si le rôle voulu n’existe pas déjà, sinon il est créé au sein de l’App Registration Serveur.

 

$role = "reader"
$roleId = (New-Guid).ToString()

if (!(az ad app show --id $appServerId --query "appRoles[?value=='$role']" -o tsv --only-show-errors)) 
{
    $appRoles = "[{`"value`": `"$role`",`"displayName`": `"$role`",`"description`": `"myDesc`",`"id`": `"$roleId`",`"allowedMemberTypes`": [`"Application`"]}]"
    az ad app update --id $appServerId --app-roles $appRoles --only-show-errors
    Write-Host "The role '$role' was created"
}
else{
    Write-Host "The role '$role' already exists"
}

 

Création de l’App Registration Client

 

C’est ensuite au tour de l’App Registration Client d’être créée (si ce n’est pas déjà fait) :

 

$appClientName = "AppRegClient"

$appClient = az ad app list --display-name $appClientName --output json --only-show-errors | ConvertFrom-Json
if ($appClient.Count -eq 0) {   
    $appClient = az ad app create --display-name $appClientName --output json --only-show-errors | ConvertFrom-Json
    Write-Host "The App Registration Client '$appClientName' was created (appId: $($appClient.appId))"
}
else {
    Write-Host "The App Registration Client '$appClientName' already exists (appId: $($appClient.appId))"  
}

 

Création et sauvegarde du secret

 

Afin que l’App Registration Client puisse être utilisée, il est nécessaire de lui fournir un client secret valide.

 

$keyVaultName = "myKeyVault"
$startDate = Get-Date
$endDate = $startDate.AddYears(1).ToString("yyyy-MM-ddTHH:mm:ssZ")

$appSecret = az ad app credential reset --id $appClient.objectId --append --end-date $endDate --query password --output tsv --only-show-errors
$kvSecret = az keyvault secret set --vault-name $keyVaultName --name "${appClientName}-clientSecret" --value $appSecret --expires $endDate --only-show-errors | ConvertFrom-Json

Write-Host "Secret create (or update) for the Client App Registration (key vault : $KeyVaultName, secret name: $($kvSecret.name))"

 

Ici, en plus, nous stockons la valeur au sein d’un Azure Key Vault pour la conserver ou la fournir à un client, mais cette étape n’est pas obligatoire.

 

Ajout/Grant des permissions

 

Pour finir il est nécessaire de donner la permission à l’App Registration Client sur le rôle de l’App Registration Serveur :

 

az ad app permission add --id $appClient.appId --api $appServerId --api-permissions "$roleId=Role" --only-show-errors
Write-Host "Permission '$role' added to the App Registration Client"

 

Seulement, ajouter la permission ne suffit pas pour que la permission soit « valide ». Un administrateur Entra ID doit également grant cette permission afin que l’ensemble fonctionne comme prévu.

 

App Registration Permission not granted

 

Cependant, si vous disposez déjà de ces droits, il est possible de simplement exécuter cette commande :

 

az ad app permission grant --id $appClient.appId --api $appServerId --only-show-errors

 

Conclusion

 

Si l’on agrège l’ensemble de ces commandes Azure CLI, en personnalisant légèrement, il est donc possible de créer des App Registrations à la volée, en fonction de vos besoins. On pourrait imaginer jouer ce genre de commandes au déploiement d’une application ou API, ou encore au sein d’un workflow d’ajout de client. Dans un certain nombre de contextes, cela permet d’économiser beaucoup de configuration manuelles !