支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10

29.10. 安全性 #

用于复制连接的角色必须具有 REPLICATION 属性(或为超级用户)。如果角色缺少 SUPERUSERBYPASSRLS 权限,则可以执行发布者的行安全策略。如果角色不信任所有表所有者,请在连接字符串中包含 options=-crow_security=off;如果表所有者随后添加了行安全策略,则该设置将导致复制停止,而不是执行该策略。必须在 pg_hba.conf 中配置该角色的访问权限,并且该角色必须具有 LOGIN 属性。

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

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

要将表添加到发布,用户必须拥有该表的拥有权。要将模式中的所有表添加到发布,用户必须是超级用户。要创建自动发布所有表或模式中所有表的发布,用户必须是超级用户。

目前发布上没有任何权限。任何订阅(能够连接的)都可以访问任何发布。因此,如果您打算对特定的订阅者隐藏某些信息,例如通过使用行过滤器或列列表,或者不将整个表添加到发布中,请注意同一数据库中的其他发布可能会暴露相同的信息。将来可能会在 PostgreSQL 中添加发布权限,以允许更细粒度的访问控制。

要创建订阅,用户必须拥有 pg_create_subscription 角色的权限,以及数据库上的 CREATE 权限。

订阅应用进程将在会话级别以订阅所有者的权限运行。但是,当对特定表执行插入、更新、删除或截断操作时,它会将角色切换到表所有者,并以表所有者的权限执行操作。这意味着订阅所有者需要能够 SET ROLE 为每个拥有复制表的角色。

如果订阅已配置为 run_as_owner = true,则不会发生用户切换。相反,所有操作都将以订阅所有者的权限执行。在这种情况下,订阅所有者只需要对目标表具有 SELECTINSERTUPDATEDELETE 的权限,而不需要 SET ROLE 为表所有者的权限。但是,这也意味着任何拥有发生复制的表的用户都可以使用订阅所有者的权限执行任意代码。例如,他们可以通过简单地将触发器附加到他们拥有的其中一个表来做到这一点。因为通常不希望允许一个角色随意承担另一个角色的权限,所以除非数据库中的用户安全无关紧要,否则应避免使用此选项。

在发布者上,权限仅在复制连接开始时检查一次,并且在读取每个更改记录时不会重新检查。

在订阅者上,每次应用事务时都会重新检查订阅所有者的权限。如果当并发事务更改订阅的所有权时,工作进程正在应用事务,则当前事务的应用将继续以旧所有者的权限进行。

提交更正

如果您发现文档中的任何内容不正确、与您特定功能的经验不符或需要进一步澄清,请使用此表格报告文档问题。