Как установить владельца по умолчанию для объектов, созданных кодом ядра EF, сначала используя postgresql с ротацией учетных данных базы данных? - PullRequest
0 голосов
/ 07 января 2020

Я подключаюсь из контейнерного приложения asp. net core 3.1, выполняющего ядро ​​EF с первым кодом, к экземпляру Amazon Aurora с совместимостью PostgreSQL и wi sh для выполнения поворота учетных данных базы данных. Я настроил роль, представляющую владельца базы данных, и роль, представляющую текущие действительные учетные данные для входа, срок действия которых мы истечем и заменим новыми учетными данными.

Я последовал предложению из этого сообщения в блоге: http://davidhollenberger.com/2017/03/16/postgres-credential-rotation/, что по сути:

create role db_owner nologin;
create role foo_a with encrypted password ...;
grant db_owner to foo_a;
alter role foo_a set role db_owner;

Я понимаю, что когда foo_a входит в postgres, их роль по умолчанию устанавливается в db_owner. Если я захожу в базу данных, используя psql, похоже, это работает последовательно.

Однако в EF Core при подключении с использованием учетных данных базы данных foo_a, переносящих базу данных в новую схему, владелец объекта новых объектов отображается как foo_a.

Пример:

                       List of relations
 Schema | Name | Type  |                 Owner
--------+------+-------+----------------------------------------
 public | test | table | foo_a

Я ожидал, что владельцем будет db_owner, поскольку foo_a всегда должен входить в систему как db_owner.

Могу ли я что-то сделать из EF Core или при настройке базы данных postgresql, которая позволит нам установить владельца по умолчанию для всех объектов, созданных пользователем, для группы ролей, представляющей нашего владельца базы данных? Я не хочу sh делать эти временные учетные записи своего рода "суперпользователем" для экземпляра, поскольку у нас есть несколько арендаторов в нашем экземпляре базы данных, вместо этого я sh должен иметь нечто похожее на роль "dbo", которая имеет владелец базы данных и временные пользователи всегда будут подключаться как роль 'dbo'.

1 Ответ

0 голосов
/ 14 января 2020

Соединения в пуле сбрасываются с помощью оператора DISCARD ALL, который, в свою очередь, сбрасывает идентификаторы сеанса и текущего пользователя в исходное аутентифицированное имя пользователя. Другими словами:

  1. Сброс соединения в пуле (https://www.npgsql.org/doc/performance.html#pooled -установка-сброса соединения )
  2. Запуски DISCARD ALL (https://www.postgresql.org/docs/current/sql-discard.html)
  3. Который, в свою очередь, запускает SET SESSION AUTHORIZATION DEFAULT (https://www.postgresql.org/docs/8.1/sql-set-session-authorization.html)

Во время перенастройки базы данных это устанавливает владельца любых объектов, созданных для Пользователь вместо роли dbo, которую он автоматически наследует ALTER ROLE... SET ROLE...

Варианты решения этой проблемы будут зависеть от ваших потребностей. Вот несколько вариантов, которые мы рассмотрели для решения этого вопроса:

  1. Сделать владельца db членом db user. Дополните это сценарием, который выполняется как часть нашей стратегии предоставления базы данных / пользователя и ротации, которая устанавливает право владения всеми объектами на владельца, а не на пользователя. Для этого требуется нулевое изменение кода для основного приложения. net, но оно выглядит запутанным с точки зрения владения объектом.
  2. In. Net используйте IDBCommandInterceptor для установки соответствующей роли при повторном использовании подключение из бассейна. Это более инвазивное решение, затрагивающее ваш основной проект. net, но если ваши требования связаны с ротацией учетных данных для одного или нескольких проектов, это может быть практичным.
  3. Добавьте параметр No reset on close=true к npg sql Строка подключения. Однако имейте в виду, что это может привести к утечке состояния сеанса, если вы используете пул соединений. Ссылка: https://www.npgsql.org/doc/connection-string-parameters.html#performance

Другие опции, такие как запуск прокси, также заслуживают рассмотрения.

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