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ロールを継承します。