Role management
===============

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

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

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

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

`bdr.role_replication <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/pgd-settings/#bdrrole_replication>`_ 設定をオフにすることにより、この自動レプリケーション動作を無効にできますが、それはお勧めしません。

新しいノードのロール
--------------------

`bdr_init_physical <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/nodes/#bdr_init_physical>`_ を使用して追加された新しいPGDノードは、PGDクラスターの他のノードからロールを自動的にレプリケートします。

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

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

接続とロール
------------

新しいPGDノードを割り当てるときに、 `bdr.create_node <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/nodes-management-interfaces#bdrcreate_node>`_ の\ ``local_dsn``
引数と `bdr.join_node_group <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/nodes-management-interfaces#bdrjoin_node_group>`_ の\ ``join_target_dsn`` のDSNで指定されたユーザー

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

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

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

- ユーザは\ ``REPLICATION`` 属性を持っています。

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

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

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

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

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

.. code:: sql

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