31.9. セキュリティ #

レプリケーション接続のために使われるロールには、REPLICATION属性が付与されている(もしくはスーパーユーザである)必要があります。 ロールに SUPERUSERBYPASSRLSがない場合は、パブリッシャーは行セキュリティポリシーを実行できます。 ロールが全てのテーブルの所有者を信頼していない場合、接続文字列にoptions=-crow_security=offを含めてください。 テーブルの所有者が行セキュリティポリシーを追加した場合、ポリシーが実行されるのではなく、レプリケーションが停止します。 接続のためのロールはpg_hba.confで設定され、 LOGIN属性を持つ必要があります。

テーブルの初期データをコピーできるためには、レプリケーション接続に使用されるロールは、パブリッシュされるテーブルに対してSELECT権限を持っていなければなりません。 (あるいはスーパーユーザでなければなりません。)

パブリケーションを作成するためには、ユーザはデータベース中のCREATE権限を持っていなければなりません。

テーブルをパブリケーションに追加するためには、ユーザはテーブルの所有権限を持っていなければなりません。 スキーマのすべてのテーブルをパブリケーションに追加するには、ユーザがスーパーユーザである必要があります。 自動的にすべてのテーブルにパブリッシュするパブリケーションを作成するには、ユーザはスーパーユーザでなければなりません。

《機械翻訳》現在、パブリケーションに権限はありません。 サブスクリプション (接続可能) は、パブリケーションにアクセスできます。 そのため、行フィルタや列リストを使用したり、テーブル全体をパブリケーションに追加しないなどして、特定のサブスクライバからの情報を非表示にする場合は、同じデータベース内の他のパブリケーションが同じ情報にアクセスできる可能性があることに注意してください。 パブリケーション権限は、より細かいアクセス制御を可能にするために、将来PostgreSQLに追加される可能性があります。

《機械翻訳》サブスクリプションを作成するには、ユーザはpg_create_subscriptionロールの権限と、データベースのCREATE権限を持っている必要があります。

《機械翻訳》サブスクリプションの適用プロセスは、セッション・レベルで、サブスクリプション所有者の権限で実行されます。 ただし、特定の表に対して挿入、更新、削除または切捨て操作を実行すると、その権限は表の所有者に切り替わり、表の所有者の権限で操作が実行されます。 つまり、サブスクリプション所有者は、レプリケートされた表を所有する各ロールに対してSET ROLEを実行できる必要があります。

《機械翻訳》サブスクリプションが run_as_owner = trueで構成されている場合、ユーザの切り替えは発生しません。 その代わり、すべての操作は、サブスクリプションの所有者の権限で実行されます。 この場合、サブスクリプションの所有者は、ターゲットテーブルからのSELECTINSERTUPDATE、およびDELETE権限のみが必要であり、テーブル所有者に対するSET ROLE権限は不要です。 しかし、これはまた、レプリケーションが行われているテーブルを所有するユーザは、サブスクリプション所有者の権限で任意のコードを実行できることを意味します。 たとえば、所有するテーブルにトリガーを付加するだけで、これを実行できます。 通常、あるロールが別のロールの権限を自由に引き受けることは望ましくないので、データベース内のユーザーセキュリティが問題にならない場合は、このオプションを避けるべきです。

パブリッシャーでは、権限はレプリケーション接続の開始時に一度だけチェックされ、変更レコードが読み取られるたびに再チェックされません。

サブスクライバーでは、サブスクリプション所有者の権限は、適用時にトランザクションごとに再チェックされます。 同時に並行しているトランザクションによってサブスクリプションの所有権が変更されたときにワーカーがトランザクションを適用している場合、現在のトランザクションの適用は古い所有者の権限で継続されます。