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 :
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.
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)" }
À 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" }
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))" }
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.
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.
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
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 !