Le piège silencieux des secrets d’applications (App Registrations)
Dans Microsoft Entra ID (anciennement Azure AD), les App Registrations authentifient vos pipelines CI/CD, vos microservices et vos connecteurs tiers à l’aide de Client Secrets ou de Certificats X.509.
Contrairement aux comptes utilisateurs interactifs, l’expiration d’un secret applicatif ne déclenche nativement aucune bannière d’alerte pour l’équipe d’exploitation : le jour où le secret arrive à échéance, les flux de production tombent brutalement en erreur AADSTS7000222 (The provided client secret keys are expired).
Voici l’architecture d’observabilité mise en place pour auditer quotidiennement l’ensemble des secrets d’un tenant Azure et alerter les équipes SRE dans Grafana bien avant l’échéance.
Architecture du pipeline de supervision
1. Prérequis et moindre privilège (RBAC)
Pour déployer cette chaîne de collecte, vous avez besoin de :
- Un compte Azure Automation doté d’une identité managée (System-Assigned Managed Identity) ou d’un compte d’exécution disposant uniquement du rôle Lecteur d’applications (
Application.Read.Allsur Microsoft Graph). - Un espace de travail Log Analytics (Log Analytics Workspace) dont vous récupérez le
Workspace IDet la clé primaire d’ingestion (Primary Key), stockés sous forme de variables chiffrées dans l’Automation Account. - Les modules PowerShell Azure (
Az.Accounts,Az.Resources) importés dans votre Azure Automation Account.
2. Le Runbook PowerShell d’audit et d’ingestion
Ce script parcourt toutes les inscriptions d’applications du tenant, extrait les dates de fin de validité (EndDate) de chaque secret et certificat, calcule l’échéance, et pousse le résultat structuré en JSON vers l’API HTTP Data Collector de Log Analytics (créant automatiquement la table personnalisée NameOfAppsRegistration_CL) :
Planifiez l’exécution de ce Runbook une fois par jour (ex. à 06:00 UTC) via un Schedule Azure Automation.
3. Requête KQL (Kusto) pour isoler les secrets proches de l’expiration
Une fois la première collecte exécutée, interrogez la table NameOfAppsRegistration_CL dans Log Analytics ou directement depuis la source de données Azure Monitor de Grafana :
NameOfAppsRegistration_CL
| where TimeGenerated > ago(24h)
| extend ExpirationDate = todynamic(EndDate_s)
| extend DaysRemaining = datetime_diff('day', todatetime(ExpirationDate), now())
| project ApplicationName = DisplayName_s, KeyIdentifier = KeyId_s, DaysRemaining, ExpirationDate
| sort by DaysRemaining asc
Cette requête permet de configurer deux seuils d’alerte :
- Warning (
DaysRemaining < 30) : création automatique d’un ticket de rotation pour l’équipe propriétaire de l’application. - Critical (
DaysRemaining < 7) : notification immédiate sur le canal d’astreinte SecOps / SRE.
État de l’art 2026 : Éliminer les secrets grâce à Workload Identity Federation (OIDC)
En 2026, la meilleure façon de gérer la rotation des Client Secrets est de ne plus en créer du tout :
- Workload Identity Federation (Zéro Secret) : Qu’il s’agisse de GitHub Actions, GitLab CI, Kubernetes (AKS) ou d’un cloud tiers (AWS / GCP), configurez des Federated Credentials basés sur OpenID Connect (OIDC) dans votre App Registration Entra ID. Entra ID valide un jeton JWT éphémère signé par votre plateforme CI/CD ou votre cluster et délivre un Access Token valide 1 heure. Il n’y a plus aucun secret statique à stocker ni à renouveler.
- Managed Identities (Identités Managées) : Pour toute communication entre ressources hébergées sur Azure (App Service, Function, VM, AKS vers Key Vault, SQL ou Storage), activez systématiquement une System-Assigned ou User-Assigned Managed Identity. Azure gère la rotation cryptographique sous-jacente de manière 100 % transparente.
- Microsoft Graph & Azure Monitor natif : Le module historique
AzureAD/MSOnlineétant définitivement déprécié, les rares secrets résiduels (ex. : SaaS tiers ne supportant pas encore OIDC) doivent être audités via le SDK Microsoft Graph PowerShell (Get-MgApplication) ou via l’export continu des Diagnostic Settings Entra ID vers Log Analytics, couplé à une politique Azure Policy interdisant tout secret dont la durée de vie excède 180 jours.
Si vous voulez plus d’information sur l’infrastructure vous pouvez voir mon repo à ce sujet : https://github.com/ravindrajob/InfraAtHome
