如何首先使用带有数据库凭据轮换的PostgreSQL来设置EF核心代码创建的对象的默认所有者?

问题描述 投票:0回答:1

我正在从运行代码优先EF核心的容器化asp.net核心3.1应用程序连接到具有PostgreSQL兼容性的Amazon Aurora实例,并希望执行数据库凭证轮换。我已经设置了一个代表数据库所有者的角色,一个代表了我们将过期并替换为新凭据的当前有效登录凭据的角色。

我遵循了此博客文章中的建议: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数据库时可以做的事情使我们能够将用户创建的所有对象的默认所有权设置为代表数据库所有者的角色组?我不希望使这些临时帐户成为该实例的“超级用户”,因为我们在数据库实例中有多个租户,而我希望具有类似于拥有数据库和数据库所有权的“ dbo”角色的功能。临时用户将始终以“ dbo”角色进行连接。

postgresql asp.net-core entity-framework-core amazon-rds-aurora
1个回答
0
投票

池连接使用DISCARD ALL语句重置,这又将会话和当前用户标识符重置为原始身份验证的用户名。换句话说:

  1. 池连接重置(https://www.npgsql.org/doc/performance.html#pooled-connection-reset
  2. 运行DISCARD ALLhttps://www.postgresql.org/docs/current/sql-discard.html
  3. 依次运行SET SESSION AUTHORIZATION DEFAULThttps://www.postgresql.org/docs/8.1/sql-set-session-authorization.html

在数据库迁移期间,这将为用户设置创建的任何对象的所有者,而不是他由ALTER ROLE... SET ROLE...自动继承的dbo角色。>

解决此问题的选项取决于您的需求。我们考虑了一些解决此问题的方法:

  1. 使数据库所有者成为数据库用户的成员。为此,请使用脚本作为我们的数据库/用户供应和轮换策略的一部分运行,该脚本将所有对象所有权设置为所有者而不是用户。这要求对.net核心应用程序进行零代码更改,但从对象所有权的角度来看确实有些混乱。
  2. 在.Net中,当我们重新使用来自池的连接时,请使用IDBCommandInterceptor设置适当的角色。这是一种更具侵入性的解决方案,会影响您的.net核心项目,但是,如果您的要求涉及一个或仅几个项目的证书轮换,则可能是可行的。
  3. 将选项No reset on close=true附加到npgsql连接字符串。但是,请注意,如果您使用连接池,则存在泄漏会话状态的风险。参考:https://www.npgsql.org/doc/connection-string-parameters.html#performance
  4. 其他选项,例如运行代理,也值得考虑。

© www.soinside.com 2019 - 2024. All rights reserved.