Monitorer l'expiration des Secrets des applications Azure AD
Par Loïc Cimon, le 22 avril 2022
Récemment, j’ai eu la mauvaise surprise de découvrir qu’un des secrets de mes applications Azure avait expiré sans que je ne reçoive d’alerte. En conséquence, tous mes flows qui en dépendaient ont rencontré des erreurs.
J’ai donc créé ce flow pour anticiper l’expiration des secrets et recevoir une alerte 30 jours avant. Cela me permet de prendre les mesures nécessaires avant que mes flows et mes applications ne soient affectés.
Dans cet article, je détaille les points clés de ce flow.
Lister les applications Azure
Avec l’API Microsoft Graph, il est possible de répertorier les applications.
J’envoie une requête GET à cette API grâce à l’action “Invoke an HTTP request” du connecteur Http With Azure AD en spécifiant que je souhaite récupérer uniquement les champs appID, displayName, passwordCredentials comme illustré ci-dessous.
Note :
Cette méthode utilise votre compte pour requêter l’API. Le résultat dépend donc des permissions que vous avez.
Plus d’info ici.
Cette requête nous retourne les informations suivantes :
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#applications(appId,displayName,passwordCredentials)",
"value": [
{
"appId": "00000000-0000-0000-0000-000000000000",
"displayName": "MyAppRegistration",
"passwordCredentials": [
{
"customKeyIdentifier": null,
"displayName": "MySecret",
"endDateTime": "2022-05-02T22:00:00Z",
"hint": "4qr",
"keyId": "00000000-0000-0000-0000-000000000000",
"secretText": null,
"startDateTime": "2022-04-22T12:55:11.571Z"
}
]
}
]
}
Dans la réponse, le champ passwordCredentials contient la liste des secrets avec leur date d’expiration (endDateTime) pour une application donnée (appId et displayName). C’est ce champ qui va nous permettre de savoir s’il va bientôt expirer.
Identifier les secrets qui vont expirer
Le principe est de vérifier que la valeur du champ endDateTime pour tous les secrets renvoyés est dans les 30 prochains jours.
Pour ce faire, je calcule la date dans 30 jours grâce à l’action “Get future time” du connecteur Date Time.
Note :
Dans la capture ci-dessous, j’utilise des variables d’environnement pour rendre flexible la période analysée. Il est possible de mettre les valeurs directement en dur.
Ensuite, je boucle sur l’ensemble des applications retournées. Pour chacune d’entre elles, je boucle de nouveau sur les secrets retournés. Enfin, je compare la valeur du champ endDateTime avec la date butoir calculée juste avant.
Si endDateTime est inférieure à la date butoir, le secret va expirer dans la période donnée. Je l’ajoute au tableau de résultat : SecretsToRenew.
endDateTime est une chaîne de caractère, il faut donc la convertir en date pour la comparaison grâce à l’expression suivante :
formatDateTime(items('Apply_to_each_Secret')?['endDateTime'])
Envoyer le résultat
La dernière étape consiste à envoyer le résultat par email uniquement s’il y a des résultats.
Pour le vérifier, je vérifie la taille du tableau de résultat SecretsToRenew avec l’expression suivante :
length(variables('SecretsToRenew'))
S’il y a des résultats, je convertis le tableau en HTML grâce à l’action “Create HTML table". Puis j’envoie le tout par email avec l’action “Send an email (V2)” du connecteur Office 365 Outlook. Ce qui donne :
Conclusion
Avec ce flow, je peux être informé de l’expiration des secrets de mes applications Azure, ce qui me permet de prévenir toute interruption de service.
Ce flow pourrait être amélioré pour ne monitorer que certaines applications. Sentez-vous libre de le modifier selon vos besoins !
Vous trouverez ce flow sur mon GitHub.