質問: コードファースト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`としてリストされ`foo_a` 。 例: ``` List of relations Schema | Name | Type | Owner --------+------+-------+---------------------------------------- public | test | table | foo_a ``` `foo_a`は常に`db_owner`としてログインする必要があるため、所有者は`db_owner`であると想定していました。 EF Coreから、またはpostgresqlデータベースをセットアップするときに、ユーザーが作成したすべてのオブジェクトのデフォルトの所有権をデータベース所有者を表す役割グループに設定できるようにする方法はありますか?データベースインスタンスには複数のテナントがあるため、これらの一時アカウントをインスタンスの「スーパーユーザー」のようなものにしたくありません。代わりに、データベースと一時ユーザーは常に「dbo」ロールとして接続します。
回答: プールされた接続は`DISCARD ALL`ステートメントを使用してリセットされます。これにより、セッションと現在のユーザー識別子がリセットされ、最初に認証されたユーザー名になります。言い換えると: 1. プールされた接続のリセット( ) 2. `DISCARD ALL` ( )を実行します 3. 次に`SET SESSION AUTHORIZATION DEFAULT` ( )を実行します。 データベースの移行中に、これにより、ユーザーが`ALTER ROLE... SET ROLE...`によって自動的に継承するdboロールではなく、ユーザーに作成されたオブジェクトの所有者が設定され`ALTER ROLE... SET ROLE...` この問題を解決するためのオプションは、ニーズによって異なります。この質問を解決するために検討したいくつかのオプションを次に示します。 1. db所有者をdbユーザーのメンバーにします。すべてのオブジェクトの所有権をユーザーではなく所有者に設定するデータベース/ユーザープロビジョニングおよびローテーション戦略の一部として実行されるスクリプトでこれを補足します。これには、.netコアアプリのコードを変更する必要はありませんが、オブジェクトの所有権の観点からは面倒です。 2. .Netでは、 `IDBCommandInterceptor`を使用して、プールからの接続を再利用するときに適切なロールを設定します。これは.netコアプロジェクトに影響を与えるより侵襲的なソリューションですが、要件に1つまたは少数のプロジェクトの認証情報のローテーションが含まれる場合は、実用的である可能性があります。 3. npgsql接続文字列にオプション`No reset on close=true`を追加します。ただし、接続プーリングを使用している場合、これによりセッション状態がリークする危険があることに注意してください。リファレンス: https : //www.npgsql.org/doc/connection-string-parameters.html#performance プロキシの実行などの他のオプションも検討に値します。