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クラスターの他のノードからロールを自動的にレプリケートします。

PGD 6.0.1以降、 bdr_init_physical を使用せずにPGDノードがPGDグループに手動で参加すると、既存のロールが新しく参加したノードに自動的にコピーされます。これは、グループに参加する前に、新しいノードでロールを手動で作成する必要がなくなることを意味します。

ロールが新しいノードにコピーされるときに、同じ名前の既存のロールまたはテーブルスペースが存在する場合、新しいノードの既存のロールまたはテーブルスペースは更新されて、ロールまたはテーブルスペースと同じ設定パスワードを共有します)参加操作のソースノードで。

接続とロール#

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

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

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

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

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

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

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

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

また、デフォルト以外の拡張機能BDR拡張機能を除くがソースノードに存在し、スーパーユーザーのみがインストールできる場合、スーパーユーザーは参加ターゲットノードでこれらの拡張機能を手動で作成する必要があります。それ以外の場合、参加プロセスは失敗します。

PostgreSQL 13以降では、スーパーユーザーの権限を必要とし、手動でインストールする必要がある拡張機能を特定できます。ソースノードで、次を実行します。

SELECT name, (trusted IS FALSE AND superuser) AS superuser_only
  FROM pg_available_extension_versions
 WHERE installed AND name != bdr;

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

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

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