Role management#

ユーザーは、PostgreSQLインスタンスのグローバルオブジェクトです。 CREATE ROLE コマンドまたはそのエイリアス CREATE USER は、 PGDレプリケートデータベースで実行される場合、自動的にレプリケートされます。ロールまたはユーザーが非PGD、非レプリケートデータベースで作成された場合、ロールはそのPostgreSQLインスタンスにのみ存在します。 GRANT ROLE およびDROP ROLE は同じように動作し、 PGDレプリケートデータベースに適用される場合にのみレプリケートします。

注釈

Postgres用語でのユーザーは、単にログイン権限を持つロールであることに注意してください。 !!!

ロールルール - 未複製のロールはありません#

非PGDの非レプリケートデータベースにロールまたはユーザーを作成する場合、 PGDレプリケートデータベースのオブジェクトをそのロールに依存させないことが特に重要です。 PGDは、PGDレプリケートデータベースにないロールをレプリケートできないため、レプリケーションプロセスが中断します。

bdr.role_replication 設定をオフにすることにより、この自動レプリケーション動作を無効にできますが、それはお勧めしません。

新しいノードのロール#

bdr_init_physical を使用して追加された新しいPGDノードは、PGDクラスターの他のノードからロールを自動的にレプリケートします。

bdr_init_physical を使用せずにPGDノードがPGDグループに手動で参加している場合、既存のロールは新しく参加したノードにコピーされません。これは、アクセスが誤って付与されないようにするための意図的な動作です。

デフォルトでは、ロールはすべてのデータベースにアクセスします。したがって、新しく作成されたノードにユーザーを自動的にコピーすると、ノードに存在するデータベースが意図せずに公開される可能性があります。 PGDクラスターにユーザーAliceがあり、Aliceが新しく参加したノードで自動的に作成された場合、そのノードに直接接続することにより、Aliceはそのノード上のすべてのデータベースにアクセスできます。したがって、PGDは既存のロールをコピーしません。この状況では、ロールを手動でコピーすることをお勧めします。

PostgreSQLでは、次のコマンドですべてのロールをダンプできます。

pg_dumpall --roles-only > roles.sql

次に、新しく作成したノードでファイルのコマンドを実行する前に、ファイル roles.sql を編集して不要なユーザーを削除できます。

新しいノードに参加する場合、「非複製ロールなし」ルールも適用されます。レプリケートされるデータベース内のオブジェクトが、レプリケートされていないローカルデータベースの非レプリケートロールに依存している場合、そのオブジェクトをレプリケートしようとすると、結合は失敗します。

接続とロール#

新しいPGDノードを割り当てるときに、 bdr.create_node のlocal_dsn 引数と bdr.join_node_group のjoin_target_dsn のDSNで指定されたユーザー

データベースオブジェクトを参照、作成、および管理するために頻繁に使用されます。

PGDは、これらのDSNでSUPERUSER 権限を持つロールを使用する場合でも、特権エスカレーション攻撃を防ぐように注意深く書き込まれています。

攻撃対象領域をさらに削減するために、これらのDSNでより制限されたユーザーを指定できます。少なくとも、このようなユーザーには、次の条件が満たされるように、すべてのノードで権限を付与する必要があります。

  • ユーザはREPLICATION 属性を持っています。

  • データベースに対するCREATE 権限が付与されています。

  • bdr_superuserロールを継承します。

  • 複製するすべてのデータベースオブジェクトを直接、または所有者ロールの権限から所有します。

すべてのノードが参加したら、DMLおよびDDLレプリケーションを引き続き許可するには、権限をさらに次まで減らすことができます。

  • ユーザはREPLICATION 属性を持っています。

  • bdr_superuserロールを継承します。