↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10
开发快照。 PostgreSQL 20devel 尚未正式发布,内容仍可能变化。

29.12. 安全性 #

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

复制连接所用输出插件的名称必须包含在服务器的 output_plugin_libraries 中。(对于订阅,所用插件名为 pgoutput。)超级用户可以在连接字符串中包含 options=-coutput_plugin_libraries=...,按连接修改受信任列表。

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

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

要使用 FOR TABLE 创建发布,用户必须对所有列出的表拥有所有权。要使用 FOR ALL TABLES、FOR ALL SEQUENCES 或 FOR 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,则不会发生用户切换。取而代之的是,所有操作都将以订阅所有者的权限执行。在这种情况下,订阅所有者只需具备对目标表执行 SELECT、INSERT、UPDATE 和 DELETE 的权限,而不需要具备对表所有者执行 SET ROLE 的权限。不过,这也意味着,任何拥有正在接收复制数据的表的用户,都可以以订阅所有者的权限执行任意代码。例如,他们只需在自己拥有的某张表上附加一个触发器即可。由于通常并不希望允许一个角色自由取得另一个角色的权限,因此除非数据库内部的用户安全完全不重要,否则应避免使用该选项。

当使用 run_as_owner = true 同步序列时,订阅所有者同样需要目标序列上的 UPDATE 权限,但不需要拥有对序列所有者执行 SET ROLE 的权限。

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

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

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.