1
votes

Entity Framework Core prend-il en charge la rotation des mots de passe de base de données

Scénario:

  1. Application Web Api dans NET Core 2.2, elle est déployée sur plusieurs conteneurs.
  2. Au démarrage, j'ai lu le mot de passe de la base de données de HashiCorp Vault et l'ai mis dans ma chaîne de connexion.
  3. J'ajoute le contexte Entity Framework Core à la collection de services.
  4. J'utilise le contexte dans plusieurs contrôleurs.

Si je change le mot de passe de la base de données dans Vault, toutes les demandes adressées à la base de données échoueront en raison d'erreurs d'authentification.

Je peux arrêter tous les conteneurs et lorsqu'ils redémarreront, ils auront le nouveau mot de passe, mais ce n'est pas ce que je veux faire. Il y a plusieurs façons de contourner ce problème, mais elles impliquent de ne pas utiliser la collection de services et je veux l'utiliser.

< gagnantQuestion :

EF Core prend-il en charge la rotation des mots de passe ou existe-t-il un moyen d'y parvenir tout en continuant à utiliser Service Collection?


6 commentaires

Vous demandez-vous essentiellement comment contrôler la chaîne de connexion de contexte db au moment de l'exécution?


Le fait que le contexte réside dans la collection de services en est une grande partie, et il y a également un problème concernant les demandes échouées lorsque le mot de passe change. Il ne s'agit donc pas simplement de changer la chaîne de connexion au moment de l'exécution. Mais si vous avez une suggestion à faire à ce sujet, cela pourrait être utile.


Vous pouvez donc simplement ajouter un dbcontext en tant que service transitoire et passer un délégué qui créerait l'instance du contexte de base de données. De cette façon, vous supprimeriez la nature statique de la chaîne de connexion et pourrez prendre le contrôle de la création d'objet de contexte db au moment de l'exécution.


Intéressant, si vous avez un exemple à une ou deux lignes, veuillez ajouter une réponse et je vais l'essayer et accepter si cela fonctionne. Merci.


Vous avez déjà marqué une réponse, mais la solution ici peut également être intéressant pour vous. Je pense que lorsque le mot de passe changera, les IOptions le remplaceront automatiquement.


Merci @RuardvanElburg


3 Réponses :


1
votes

Étant donné que le mot de passe de la base de données est lu depuis le coffre-fort HashiCorp lors du démarrage, vous pourriez peut-être envisager d'utiliser la fonction de vérification de l'état ( https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/health-checks?view = aspnetcore-2.2 ) pour configurer un point de terminaison de vérification de l'état en direct.

Utilisez ensuite votre outil de gestion de conteneur pour sonder le point de terminaison et redémarrez le conteneur en cas de défaillance (c'est-à-dire impossible de se connecter à la base de données en raison d'une chaîne de connexion obsolète).


0 commentaires

3
votes

Vous devriez pouvoir ajouter le DbContext dans DI et passer un délégué qui crée l'instance en prenant essentiellement le contrôle de la nature statique de la chaîne de connexion et en trouvant la bonne au moment de l'exécution.

services.AddScoped<YourDbContext>(svc =>
     {
         var connString = ... logic to get the conn string with the right password from HashiCorp vault;
         var dbContextOptions = new DbContextOptionsBuilder<YourDbContext>();
         dbContextOptions.UseSqlServer(connString); //Or w/e ef provider for db you use
         return new YourDbContext(dbContextOptions.Options);
     });


0 commentaires

1
votes

La solution la plus simple est d'obtenir le nom d'utilisateur et mot de passe du coffre-fort. Traitez-le ensuite comme une rotation de clé, en basculant la configuration sur un nom d'utilisateur / mot de passe différent et en attendant que l'application cesse d'utiliser les anciennes informations d'identification avant de changer le mot de passe.

Une autre approche consiste à récupérer les informations d'identification avant de réessayer après un échec.


0 commentaires