Automatiser la création de souscriptions Azure
L'automatisation de la création des souscriptions Azure et l'une des premières étapes à mettre en œuvre voici comment y arriver avec un SPN.
L'objectif de cet article est de détailler comment déléguer les privilèges d'un titulaire d'un compte EA à un SPN, qui pourra être exploité pour créer de façon automatisée des souscriptions Azure.
Création d'un SPN dédié
Ce SPN sera dédié à la création de souscription de façon automatisée.
Pour le créer, rien de plus simple, utilisez une des ces deux possibilités:
$password = "S3çR€t?P@ssw0rd!!!" ## TODO: Update it with your secret 🤗
$credentials = New-Object Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential -Property @{StartDate=Get-Date; EndDate=Get-Date -Year 2024; Password=$password}
$sp = New-AzAdServicePrincipal -DisplayName "SubscriptionsGenerator" -PasswordCredential $credentials
az ad sp create-for-rbac --name "SubscriptionsGenerator"
Pour ma part, j'ai opté pour l'Azure CLI et j'ai obtenu ce résultat :
Identifier les pré-requis
Pour ajouter le rôle "Subscription Creator" à votre SPN vous avez besoin d'avoir un compte ayant le rôle "Enterprise Administrator" ainsi que des informations associées à la facturation Azure:
Récupérer l'Object ID de l'Enterprise application associée à votre SPN; vous avez plusieurs possibilités :
En ligne de commande :
az ad sp list --display-name "SubscriptionsGenerator" --query "[].id" -o tsv
Via le portail :
Vérifier votre rôle EA pour valider que vous êtes bien "Enterprise administrator", vous pouvez suivre ce lien pour le vérifier: Access control (IAM)
Le billing acount ID peut-être récupéré via ce lien : Billing account Overview
- L'enrollment account ID se trouve dans la liste suivante : Accounts
Ajout du rôle "Subscription Creator"
Autorisations pouvant être attribuées au SPN
Voici la liste des autorisations pouvant être attribuées à notre SPN, pensez à mettre de côté l'ID du rôle qui sera utilisé dans l'étape suivante.
Rôle | Actions autorisées | ID du rôle |
EnrollmentReader | Les lecteurs d’inscription peuvent afficher les données dans les étendues d’inscription, de service et de compte. Les données contiennent des frais pour tous les abonnements dans les étendues, y compris entre les locataires. Permet d’afficher le solde du paiement anticipé Azure (précédemment appelé engagement financier) associé à l’inscription. | 24f8edb6-1668-4659-b5e2-40bb5f3a7d7e |
EA purchaser | Acheter des ordres de réservation et afficher les transactions de réservation. Il dispose de toutes les autorisations de EnrollmentReader, qui aura à son tour toutes les autorisations de DepartmentReader. Il permet d’afficher l’utilisation et les frais pour tous les comptes et abonnements. Permet d’afficher le solde du paiement anticipé Azure (précédemment appelé engagement financier) associé à l’inscription. | da6647fb-7651-49ee-be91-c43c4877f0c4 |
DepartmentReader | Télécharger les détails d’utilisation pour le service qu’il administre. Permet d’afficher l’utilisation et les frais associés à son service. | db609904-a47f-4794-9be8-9bd86fbffd8a |
SubscriptionCreator | Créer des abonnements dans l’étendue de compte donnée. | a0bcee42-bf30-4d1b-926a-48d21664ef71 |
Un rôle EnrollmentReader peut être attribué à un SPN uniquement par un utilisateur qui a le rôle d’auteur d’inscription.
Le rôle EnrollmentReader attribué à un SPN n’est pas affiché dans le portail EA.
Il est créé programmatiquement et ne sert qu’à des fins de programmation.Un rôle DepartmentReader peut être attribué à un SPN uniquement par un utilisateur qui a le rôle d’auteur d’inscription ou d’auteur de service.
Un rôle SubscriptionCreator peut être attribué à un SPN uniquement par un utilisateur qui est propriétaire du compte d’inscription (administrateur EA).
Le rôle n’apparaît pas dans le portail EA.
Il est créé programmatiquement et ne sert qu’à des fins de programmation.Le rôle EA purchaser n’apparaît pas dans le portail EA.
Il est créé programmatiquement et ne sert qu’à des fins de programmation.
Ajout de l'autorisation SubscriptionCreator
Pour ajouter l'autorisation à notre SPN nous allons utiliser l'API REST en utilisant le lien suivant, les informations listées dans les pré-requis ainsi que l'ID du rôle SubscriptionCreator :
a0bcee42-bf30-4d1b-926a-48d21664ef71
Puis cliquez sur le bouton vert "Essayer" ou "Try it" :
Sur cette étape, connectez-vous avec votre compte EA Administrator pour suivre les pré-requis nécessaire pour l'ajout de droit à votre SPN.
En suivant les indications renseignez les informations, soit dans mon exemple :
billingAccountName: 60789023
billingRoleAssignmentName: a4525b46-f397-4ceb-b7cf-5b2ea04ff33e
Pour ce paramêtre il suffit de générer un GUID soit via ce site soit via du PowerShell:New-Guid
enrollmentAccountName: 12666
body:
{
"properties": {
"principalId": "ccd99ff9-5c10-4e5a-b925-dd99a9cc7c5f",
"principalTenantId": "40d0d33d-94bb-4ec5-9333-c571e343b366",
"roleDefinitionId": "/providers/Microsoft.Billing/billingAccounts/60789023/billingRoleDefinitions/a0bcee42-bf30-4d1b-926a-48d21664ef71"
}
}
Le roleDefinitionId correspond à votre Billing Account suivi du rôle que vous souhaitez ajouter à votre compte.
Au final, vous devriez avoir quelque chose proche de cette image:
Descendez en bas du formulaire puis "Exécuter" cet appel API:
En retour vous devez avoir une réponse HTTP 200 de ce type:
{
"id": "/providers/Microsoft.Billing/billingAccounts/60789023/enrollmentAccounts/12666/billingRoleAssignments/a4525b46-f397-4ceb-b7cf-5b2ea04ff33e",
"name": "a4525b46-f397-4ceb-b7cf-5b2ea04ff33e",
"properties": {
"createdOn": "2023-07-04T15:48:08.4278754+00:00",
"createdByPrincipalTenantId": "40d0d33d-94bb-4ec5-9333-c571e343b366",
"createdByPrincipalId": "a7d3be93-f32d-45f0-9529-eb8023b75e17",
"createdByPrincipalPuid": "666320025A3E1393",
"createdByUserEmailAddress": "blabla@smartcloudarchitect.fr",
"principalId": "ccd99ff9-5c10-4e5a-b925-dd99a9cc7c5f",
"principalTenantId": "40d0d33d-94bb-4ec5-9333-c571e343b366",
"roleDefinitionId": "/providers/Microsoft.Billing/billingAccounts/60789023/enrollmentAccounts/12666/billingRoleDefinitions/a0bcee42-bf30-4d1b-926a-48d21664ef71",
"scope": "/providers/Microsoft.Billing/billingAccounts/60789023/enrollmentAccounts/12666",
"userAuthenticationType": "Organization"
},
"type": "Microsoft.Billing/billingRoleAssignments"
}
Création d'une souscription
Maintenant que notre compte SPN possède le droit de "SubscriptionCreator" nous allons voir comment l'exploiter au travers d'un pipeline Azure DevOps pour automatiser la création de souscription via cet outil.
Ajout du rôle Contributeur sur le management group
Mon organisation Azure utilise les management groups, je vais donc ajouter à mon SPN le rôle de contribution sur le niveau qui m'intéresse pour le déploiement de mes nouvelles souscriptions.
Pour ce faire, depuis le management group cliquez sur "Access control (IAM)":
Puis ajouter le rôle "Contributor" à votre SPN:
Au final, vous devriez avoir ce résultat:
Création de la souscription
Pour créer la souscription Azure il suffit de se connecter avec votre SPN depuis votre terminal préféré en utilisant cette commande:
az login --service-principal -u "<app-id>" -p "<secret>" --tenant "<tenant>"
az account alias create --name "PoC" --billing-scope "/providers/Microsoft.Billing/billingAccounts/60789023/enrollmentAccounts/12666" --display-name "PoC Subscription" --workload "DevTest"
Automatisation via Azure DevOps
La première étape est de mettre en place le "service connection" en utilisant les informations de votre SPN et de votre contexte Azure au niveau du management group surlequel nous avons positionné le rôle "Contributor".
Dans la partie "Service connections" de votre projet Azure DevOps, ajouter une nouvelle connexion en sélectionnant :
Azure Resource Manager
Service principal (manual)
Management Group
Renseignez les informations demandées par rapport à votre contexte:
Une fois les éléments renseignés et validés vous devriez avoir quelque chose de proche de cette image:
Maintenant voici comment utiliser la commande du chapitre précédent via un pipeline Azure DevOps exploitant la connexion à notre management group:
pool:
vmImage: 'ubuntu-latest'
steps:
- task: AzureCLI@2
inputs:
azuresubscription: ManagementGroupServiceConnection
scriptType: 'bash'
ScriptType: InlineScript
Inline: |
az account alias create --name "PoC" --billing-scope "/providers/Microsoft.Billing/billingAccounts/60789023/enrollmentAccounts/12666" --display-name "PoC Subscription" --workload "DevTest"
Une fois exécuté, vous pourrez trouver votre nouvelle souscription fraichement créée de façon automatisée 😍