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/pgd-settings/#bdrrole_replication>`_ 設定をオフにすることにより、この自動レプリケーション動作を無効にできますが、それはお勧めしません。

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

`bdr_init_physical <https://www.enterprisedb.com/docs/pgd/latest/reference/nodes/#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 <https://www.enterprisedb.com/docs/pgd/latest/reference/nodes-management-interfaces#bdrcreate_node>`_ の\ ``local_dsn``
引数と `bdr.join_node_group <https://www.enterprisedb.com/docs/pgd/latest/reference/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ロールを継承します。
