Introduction
La gestion des configurations d'un tenant Microsoft 365 représente un défi majeur pour les administrateurs IT. Les modifications non autorisées ou involontaires peuvent compromettre la sécurité et la conformité de l'environnement. Microsoft Unified Tenant Configuration Management (UTCM) répond à cette problématique en offrant une solution native de surveillance des dérives de configuration.
Cette fonctionnalité permet de capturer l'état désiré de votre tenant et de détecter automatiquement les écarts par rapport à cette référence. Dans cet article, nous détaillons la procédure complète d'implémentation d'UTCM via PowerShell.
Prérequis
UTCM est actuellement en preview publique. Certaines fonctionnalités peuvent évoluer avant la disponibilité générale.
Architecture et composants d'UTCM
UTCM s'articule autour de trois composants fondamentaux qui travaillent en synergie :
Snapshots (Instantanés)
Les snapshots constituent des captures ponctuelles de l'état de vos ressources Microsoft 365. Ils peuvent inclure les stratégies d'accès conditionnel, les règles de transport Exchange, ou plus de 300 types de ressources différents.
Monitors (Moniteurs)
Les monitors fonctionnent comme des moteurs de surveillance. Ils comparent périodiquement l'état actuel de votre tenant avec un snapshot de référence et détectent les écarts.
Drifts (Dérives)
Les drifts représentent les différences identifiées entre l'état actuel et l'état désiré. Par exemple, la modification du nom d'affichage d'une stratégie d'accès conditionnel.
Limites à connaître
Chaque composant d'UTCM a des limites spécifiques documentées dans la documentation Microsoft Learn sur les limites des APIs.
Prérequis techniques
Avant de débuter l'implémentation, assurez-vous de disposer des éléments suivants :
- PowerShell 7 installé sur votre poste de travail
- Un compte Administrateur Global pour l'attribution des permissions
- Les scopes Microsoft Graph appropriés
Pour vous connecter à Microsoft Graph avec les permissions nécessaires :
1Connect-MgGraph -Scopes 'ConfigurationMonitoring.ReadWrite.All'Configuration du principal de service UTCM
UTCM utilise un principal de service dédié pour accéder aux ressources surveillées. Ce principal doit disposer des permissions appropriées selon les types de ressources monitörées.
Installation des modules PowerShell
Installez le module Microsoft Graph Authentication requis :
1Install-Module Microsoft.Graph.AuthenticationConnexion avec permissions étendues
Connectez-vous à Microsoft Graph avec les permissions d'écriture d'applications :
1Connect-MgGraph -Scopes 'Application.ReadWrite.All'Création du principal de service
Exécutez le script suivant pour créer et configurer le principal de service UTCM :
1# Création du principal de service UTCM2$body = @{3 appId = "03b07b79-c5bc-4b5e-9bfa-13acf4a99998"4}5Invoke-MgGraphRequest -Uri "v1.0/servicePrincipals" -Method POST -Body $body6 7# Attribution des permissions nécessaires8$permissions = @('Policy.Read.All', 'Policy.ReadWrite.ConditionalAccess')9$graph = Invoke-MgGraphRequest -Uri "v1.0/servicePrincipals?`$filter=appId eq '00000003-0000-0000-c000-000000000000'" -Method GET -OutputType PSObject | Select -Expand Value10$utcm = Invoke-MgGraphRequest -Uri "v1.0/servicePrincipals?`$filter=appId eq '03b07b79-c5bc-4b5e-9bfa-13acf4a99998'" -Method GET -OutputType PSObject | Select -Expand Value11 12foreach ($requestedPermission in $permissions) {13 $AppRole = $Graph.AppRoles | Where-Object { $_.Value -eq $requestedPermission }14 $body = @{15 appRoleId = $AppRole.Id16 resourceId = $Graph.Id17 principalId = $UTCM.Id18 } | ConvertTo-Json19 20 Invoke-MgGraphRequest -Uri "/v1.0/servicePrincipals/$($UTCM.Id)/appRoleAssignments" -Method POST -Body $body21}Permissions personnalisées
Si vous surveillez d'autres types de ressources, adaptez le tableau $permissions en conséquence. Par exemple, ajoutez 'Policy.Read.AuthenticationMethod' pour monitorer les stratégies de méthodes d'authentification.
Création d'un snapshot de référence
Un snapshot représente l'état désiré de vos configurations. Il est crucial de le capturer lorsque vos ressources sont dans l'état optimal.
Snapshot des stratégies d'accès conditionnel
1$uri = "beta/admin/configurationManagement/configurationSnapshots/createSnapshot"2$body = @{3 displayName = "Baseline Accès Conditionnel"4 description = "Stratégies CA critiques de production"5 resources = @(6 "microsoft.entra.conditionalaccesspolicy"7 )8}9Invoke-MgGraphRequest -Uri $uri -Method POST -Body $bodySnapshot multi-ressources
Pour capturer plusieurs types de ressources simultanément :
1resources = @(2 "microsoft.entra.conditionalaccesspolicy",3 "microsoft.entra.authenticationmethodpolicy",4 "microsoft.exchange.transportrule"5)Mapping des permissions
Chaque type de ressource nécessite des permissions spécifiques. Microsoft ne fournit pas de mapping public complet, une analyse est parfois nécessaire.
Déploiement d'un moniteur de configuration
Une fois le snapshot créé, configurez le moniteur pour surveiller en continu vos ressources.
1# Récupération des détails du snapshot2$filter = "displayName eq 'Baseline Accès Conditionnel'"3$uri = "beta/admin/configurationManagement/configurationSnapshotJobs/?`$filter=$filter"4$snapshot = Invoke-MgGraphRequest -Uri $uri -Method GET -OutputType PSObject | Select -Expand Value5$resourceLocation = $snapshot[0].resourceLocation6$resources = Invoke-MgGraphRequest -Uri $resourceLocation -Method GET7$fineResources = $resources | Select displayName, description, resources8 9# Création du moniteur10$uri = "beta/admin/configurationManagement/configurationMonitors"11$body = @{12 displayName = "Moniteur Accès Conditionnel Production"13 description = "Surveillance continue des stratégies CA critiques"14 baseline = @{15 displayName = $fineResources.displayName16 description = $fineResources.description17 resources = ($fineResources.resources | Select-Object -Property displayName, resourceType, properties)18 }19} | ConvertTo-Json -Depth 1020Invoke-MgGraphRequest -Uri $uri -Method POST -Body $bodySurveillance et analyse des résultats
Consultation du statut des tâches de monitoring
Les moniteurs s'exécutent automatiquement toutes les 6 heures. Pour consulter les résultats :
1# Identification du moniteur2$filter = "displayName eq 'Moniteur Accès Conditionnel Production'"3$uri = "beta/admin/configurationManagement/configurationMonitors/?`$filter=$filter"4$monitorJob = Invoke-MgGraphRequest -Uri $uri -Method GET -OutputType PSObject | Select -Expand Value5 6# Récupération des résultats de monitoring7$filter = "monitorId eq '$($monitorJob[0].id)'"8$uri = "/beta/admin/configurationManagement/configurationMonitoringResults?`$filter=$filter"9$monitorResults = Invoke-MgGraphRequest -Uri $uri -Method GET -OutputType PSObject | Select -expand ValueLa propriété driftsCount dans $monitorResults indique le nombre de dérives détectées.

Analyse détaillée des dérives
Lorsque des dérives sont détectées, analysez-les en détail :
1$filter = "monitorId eq '$($monitorJob[0].id)'"2$uri = "/beta/admin/configurationManagement/configurationDrifts/?`$filter=$filter"3$configurationDrifts = Invoke-MgGraphRequest -Uri $uri -Method GET -OutputType PSObject | Select -expand Value
Pour une analyse approfondie, convertissez les résultats en JSON :
1$configurationDrifts | ConvertTo-Json -Depth 10
Automatisation et intégration
Recommandation d'automatisation
Intégrez ces commandes PowerShell dans un runbook Azure Automation ou une Azure Function pour automatiser la détection et les alertes de dérive.
Pour une utilisation en production, considérez :
- Notifications automatiques via Microsoft Teams ou email
- Intégration avec Azure Monitor pour les alertes
- Rapports périodiques de conformité
- Workflows d'approbation pour les changements détectés
Tableau comparatif des types de ressources surveillées
| Type de ressource | Permission requise | Cas d'usage |
|---|---|---|
| microsoft.entra.conditionalaccesspolicy | Policy.ReadWrite.ConditionalAccess | Stratégies d'accès conditionnel |
| microsoft.entra.authenticationmethodpolicy | Policy.Read.AuthenticationMethod | Méthodes d'authentification |
| microsoft.exchange.transportrule | Mail.ReadWrite | Règles de transport Exchange |
| microsoft.sharepoint.tenantSettings | SharePointTenantSettings.ReadWrite.All | Paramètres tenant SharePoint |
Conclusion
Unified Tenant Configuration Management représente une avancée significative dans la gestion des configurations Microsoft 365. Cette solution native permet aux équipes IT de maintenir l'intégrité et la conformité de leur environnement de manière proactive.
Bien qu'UTCM soit actuellement exposé uniquement via des APIs REST, son intégration dans des solutions automatisées permet de créer un système de surveillance robuste. L'investissement initial en développement PowerShell est compensé par la réduction significative des risques de dérive de configuration et l'amélioration de la posture de sécurité globale.
La prochaine étape consiste à intégrer ces capacités dans vos processus opérationnels existants pour créer un écosystème de gouvernance Microsoft 365 mature et automatisé.



