Поддерживает ли Entity Framework Core ротацию паролей базы данных? - PullRequest
0 голосов
/ 26 апреля 2019

Сценарий:

  1. Приложение Web Api в NET Core 2.2, оно развернуто в нескольких контейнерах.
  2. При запуске я читаю из базы данных пароль от HashiCorp Vault и помещаю его в строку подключения.
  3. Я добавляю контекст Entity Framework Core в коллекцию сервисов.
  4. Я использую контекст в нескольких контроллерах.

Если я изменю пароль базы данных в Vault, все запросы к базе данных не будут выполнены из-за ошибок аутентификации.

Я могу отключить все контейнеры, и после их перезапуска у них будет новый пароль, но я не хочу этого делать. Есть несколько хакерских способов обойти эту проблему, но они включают не использование Service Collection, и я хочу использовать его.

Вопрос:

Поддерживает ли EF Core ротацию паролей или есть ли способ добиться этого при использовании Service Collection?

Ответы [ 3 ]

3 голосов
/ 27 апреля 2019

Вы должны быть в состоянии добавить DbContext в DI и передать делегат, который создает экземпляр, по сути, контролирующий статическую природу строки соединения и работающий с правильным во время выполнения.

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);
     });
1 голос
/ 27 апреля 2019

Самое простое решение - получить имя пользователя и пароль из хранилища.Затем относитесь к нему как к повороту ключа, переключая конфигурацию на другое имя пользователя / пароль и ожидая, пока приложение прекратит использовать старые учетные данные, прежде чем сменить пароль.

Другой подход заключается в повторном получении учетных данных перед повторной попыткой после сбоя.

1 голос
/ 26 апреля 2019

Поскольку пароль базы данных считывается из хранилища HashiCorp во время запуска, возможно, вы могли бы рассмотреть возможность использования проверки работоспособности (https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/health-checks?view=aspnetcore-2.2) для настройки конечной точки проверки работоспособности.

Затем используйте инструмент управления контейнерами, чтобы проверить конечную точку и перезапустить контейнер, если он выйдет из строя (то есть не сможет подключиться к БД из-за устаревшей строки подключения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...