29.10. Безопасность #
Роль, используемая для подключения репликации, должна иметь атрибут REPLICATION
(или быть суперпользователем). Если у роли отсутствуют свойства SUPERUSER
и BYPASSRLS
, при репликации могут выполняться политики защиты строк, определённые на стороне публикации. Если эта роль не может доверять владельцам всех таблиц, добавьте в строку подключения options=-crow_security=off
; если владелец таблицы добавит политику защиты строк позже, при таком значении параметра репликация остановится, но политика выполняться не будет. Доступ для этой роли должен быть настроен в pg_hba.conf
, и эта роль также должна иметь атрибут LOGIN
.
Чтобы иметь возможность скопировать исходные данные таблицы, роль, используемая для соединения репликации, должна иметь право SELECT
в публикуемой таблице (или быть суперпользователем).
Чтобы создать публикацию, пользователь должен иметь право CREATE
в базе данных.
Чтобы добавлять таблицы в публикацию, пользователь должен иметь права владельца для этих таблиц. Добавлять в публикацию все таблицы схемы может только суперпользователь. Также только суперпользователям разрешено создавать публикации, публикующие все таблицы или все таблицы в схеме автоматически.
На данный момент прав для публикаций нет. Любая подписка (имеющая возможность подключения) может получить доступ к любой публикации. Таким образом, если необходимо скрыть некоторую информацию от определённых подписчиков, например, используя фильтры строк или списки столбцов или не добавляя всю таблицу в публикацию, имейте в виду, что та же информация может раскрываться в других публикациях в той же базе данных. В будущем в PostgreSQL могут быть добавлены права для публикаций, чтобы обеспечить более детальный контроль доступа.
Чтобы создать подписку, пользователь должен иметь права роли pg_create_subscription
, а также права CREATE
для базы данных.
Процесс применения подписки на уровне сеанса будет выполняться с правами владельца подписки. Однако при выполнении операции вставки, изменения, удаления или усечения в конкретной таблице происходит переключение роли на владельца таблицы и выполнит операцию с правами владельца таблицы. Это означает, что владелец подписки должен иметь право SET ROLE
для каждой роли, которой принадлежит реплицируемая таблица.
Если подписка сконфигурирована с run_as_owner = true
, переключение пользователей не произойдёт. Вместо этого все операции будут выполняться с правами владельца подписки. В этом случае владельцу подписки нужны только права SELECT
, INSERT
, UPDATE
и DELETE
из целевой таблицы, но не SET ROLE
для владельца таблицы. Однако это также означает, что любой пользователь, владеющий таблицей, в которую реплицируются данные, может выполнять произвольный код с правами владельца подписки. Например, это можно сделать, добавив триггер к одной из принадлежащих этому пользователю таблиц. Поскольку обычно нежелательно позволять одной роли свободно присваивать права другой, не рекомендуется использовать этот параметр, кроме случаев, когда безопасность пользователей в базе данных не вызывает сомнений.
На публикующем сервере права проверяются только один раз при установлении подключения для репликации и не перепроверяются при чтении каждой записи изменения.
На стороне подписки права владельца подписки перепроверяются для каждой транзакции, когда она применяется. Если рабочий процесс осуществляет применение транзакции, когда в параллельной транзакции меняется владелец подписки, применение текущей транзакции продолжается с правами старого владельца.