Monitorer l’expiration des Secrets des applications Azure AD

Récemment, j’ai eu la mauvaise surprise de découvrir qu’un des secrets de mes applications Azure a expiré, sans que je n’ai reçu d’alerte. Par conséquent, mes flows qui s’en servaient, sont tous tombés en erreur.

J’ai donc créé ce flow pour anticiper l’expiration des secrets via une alerte 30 jours avant. Ce qui me permet de faire le nécessaire avant que cela n’impacte mes flows & apps.

Je détaille dans cet article les points clés de ce flows.

Lister les applications Azure

Microsoft Graph API permet 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. Et 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 chaine de charactè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

Dernière étape, envoyer le résultat par email uniquement si des résultats ont été trouvés.

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 « Createe HTML table« . Puis 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 pour prévenir toute interruption de service.

Ce flow pourrait être amélioré pour ne monitorer uniquement que certaines applications. Sentez-vous libre de le modifier selon vos besoins !

 

Vous trouverez ce flow sur GitHub.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *