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.

Capture de l'action Invoke an HTTP request

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.

Capture de l'action Get future time

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']) 
Capture des boucles

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 :

Capture des étapes d'envoi des résultats

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.

comments powered by Disqus