受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
此文档适用于不受支持的 PostgreSQL 版本。
您可能需要查看当前版本的相同页面,或上面列出的其他受支持版本。

29.12. 安全性 #

用于复制连接的角色必须具有 REPLICATION 属性 (或为超级用户)。如果该角色既没有 SUPERUSER,也没有 BYPASSRLS,则发布端的行安全性策略可能会生效。如果该角色 不信任所有表所有者,请在连接字符串中包含 options=-crow_security=off;这样一来,如果某个表所有者随后 添加了行安全性策略,复制将停止,而不是执行该策略。该角色的访问权限必须在 pg_hba.conf 中配置,并且它还必须具有 LOGIN 属性。

为了能够复制初始表或序列数据,用于复制连接的角色必须对已发布的表或序列具有 SELECT 权限(或者是超级用户)。

要创建发布,用户必须在数据库中具有 CREATE 权限。

要使用 FOR TABLE 创建发布,用户必须对所有列出的表拥有所有权。 要使用 FOR ALL TABLESFOR ALL SEQUENCESFOR TABLES IN SCHEMA 创建发布,用户必须是超级用户。 要使用 ADD TABLE 修改发布,用户必须对所有列出的表拥有所有权。 要使用 ADD TABLES IN SCHEMA 修改发布,用户必须是超级用户。

当前发布没有权限控制。任何能够连接的订阅都可以访问任何发布。因此,如果你打算 通过行过滤器、列列表,或者不把整张表加入发布来隐藏某些信息,要注意同一数据库中的 其他发布仍可能暴露相同信息。未来版本的 PostgreSQL 可能会增加发布权限,以支持更细粒度的访问控制。

要创建订阅,用户必须具有 pg_create_subscription 角色的权限, 以及数据库上的 CREATE 权限。如果指定了 SERVER, 用户还必须对该服务器具有 USAGE 权限。

订阅应用进程在会话级别会以订阅所有者的权限运行。不过,在对某个具体表执行 insert、update、delete 或 truncate 操作时,它会切换角色到该表所有者,并以 表所有者的权限执行该操作。类似地,在同步序列数据时,它会切换到序列所有者角色, 并以序列所有者的权限执行操作。这意味着订阅所有者必须能够对每个被复制的表或序列 所有者执行 SET ROLE

如果订阅配置了 run_as_owner = true,则不会发生用户切换。 取而代之的是,所有操作都将以订阅所有者的权限执行。在这种情况下,订阅所有者只需 具备对目标表执行 SELECTINSERTUPDATEDELETE 的权限,而不需要 具备对表所有者执行 SET ROLE 的权限。不过,这也意味着, 任何拥有正在接收复制数据的表的用户,都可以以订阅所有者的权限执行任意代码。 例如,他们只需在自己拥有的某张表上附加一个触发器即可。由于通常并不希望允许一个 角色自由取得另一个角色的权限,因此除非数据库内部的用户安全完全不重要,否则应避免 使用该选项。

在发布端,权限只在复制连接开始时检查一次,在读取每条变更记录时不会重新检查。

在订阅端,订阅所有者的权限会在每个事务应用时重新检查。如果某个工作者正在应用 事务时,订阅的所有权被并发事务更改,那么当前事务的应用仍会继续使用旧所有者的 权限。