Pour faire fonctionner une application, il arrive de devoir stocker et récupérer des données sensibles telles qu’une chaîne de connexion à une base de données, ou encore des identifiants nécessaires à l’utilisation d’une API. Des règles de sécurité s’imposent pour protéger ces données…

Règles de base


  • Les mots de passe ou autres données sensibles ne doivent jamais être stockés dans le code source.
  • Les secrets de production ne doivent pas être utilisés pour le développement ou le test.
  • Les secrets ne doivent pas être déployés avec l’application.

Bonne pratique


Les secrets doivent être mis à disposition de l’application, dans l’environnement de production et par le biais d’un moyen contrôlé.

Contraintes


Je suis actuellement en train de développer une application de bureau pour une cliente qui souhaite automatiser ses rapports mensuels, construits à partir d’informations contenues dans son Google Agenda…

Cette application utilise l’API d’authentification sécurisée de Google. Grâce à cette dernière, le programme de l’application peut se connecter à l’agenda de ma cliente, et récupérer les données qui sont ensuite dispatchées par le programme, dans différents fichiers de synthèse.

J’ai d’abord configuré un compte de service dans G Suite, mais cela ne m’a permis d’accéder qu’aux agendas liés à mon nom de domaine (s’il est possible d’utiliser cette solution pour accéder à des agendas d’autres domaines, merci de m’indiquer vos ressources en commentaires).

Puis j’ai trouvé cette documentation. Elle explique comment se servir de l’outil Secret Manager dans ASP.Net Core.
Ce dernier permet de gérer les secrets d’une application, et d’y accéder depuis l’environnement de développement. Mais sauf erreur de compréhension de ma part, elle ne s’applique qu’aux applications web. Et je n’ai trouvé aucune autre documentation sur Internet, capable de m’indiquer comment utiliser Secret Manager dans une application Winforms…

Alors après avoir compris le mécanisme de cet outil, j’ai réfléchi à une solution de configuration, capable de relier mon application à une variable d’environnement Windows, afin d’accéder à ses secrets de manière sécurisée.

Comment utiliser Secret Manager avec Winforms ?


Les étapes qui permettent de relier une application Winforms à une variable d’environnement sous Windows, afin d’accéder à ses secrets de manière sécurisée, sont les suivantes :

  • Activer le stockage secret
  • Définir un secret
  • Créer une configuration personnalisée
  • Accéder au secret

1. Activer le stockage secret

Vous pouvez suivre les indications décrites dans cette partie de la documentation.

2. Définir un secret

Vous pouvez également suivre les indications décrites dans cette partie de la documentation.

3. Créer une configuration personnalisée

C’est ici que les choses se sont corsées pour moi… aucune des méthodes indiquées dans la documentation ne semble être adaptée aux applications de bureau (si je me trompe, merci de m’expliquer en commentaire).

Comme je n’ai pas réussi à accéder à la propriété « UserSecretsId », pourtant bien inscrite dans le fichier.csproj de mon application, j’ai choisi de créer une classe pour (re)stocker cette donnée (si vous avez une meilleure solution, je suis preneuse) :

Performance Précision - Audrey REDONDO - Secret d'application & WinformsJ’ai ensuite créé un fournisseur d’accès aux données relatives à cet identifiant, grâce au package Microsoft.Extensions.Configuration.UserSecrets (installé automatiquement lors de l’étape 1). Le but étant de l’intégrer dans les paramètres d’initialisation de mon formulaire :

Performance Précision - Audrey REDONDO - Secret d'application & Winforms4. Accéder au secret

Pour accéder aux données, j’ai d’abord récupéré le fournisseur d’accès avant d’initialiser le formulaire :

Performance Précision - Audrey REDONDO - Secret d'application & WinformsPuis, dans la méthode de création du service qui appellera l’API de Google pour parcourir l’agenda de ma cliente, j’ai chargé le fichier. J’y ai récupéré les clés d’authentification et les ai assignées à l’objet de type ClientSecrets. Ce dernier étant attendu par la méthode d’authentification de l’API :

Performance Précision - Audrey REDONDO - Secret d'application & WinformsComment maintenir cette sécurité lors du déploiement de l’application ?


Personnellement, j’ai choisi de concevoir un fichier d’installation. Il créera sur la machine de ma cliente, les éventuels dossiers, ainsi que le fichier qui contient les secrets de l’application, à l’endroit où le programme s’attend à le trouver.

Merci d’avoir lu cet article. En espérant que cette solution vous évite des heures de recherches… N’hésitez pas à me faire un retour, si vous voyez des améliorations à y apporter !