9.3 9.4 9.5 9.6 10 11 12 13 14 15 Current(16) 17
问题报告 纠错本页面

29.10. 安全性 #

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

为了能够拷贝初始表数据,用于复制连接的角色必须在被发布的表上具有SELECT特权(或者是一个超级用户)。

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

要向publication添加表格,用户必须对表格拥有所有权。要向publication添加模式中的所有表格, 用户必须是超级用户。要创建一个自动发布所有表格或模式中所有表格的publication, 用户必须是超级用户。

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

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

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

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

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

在订阅者端,每次应用时都会重新检查订阅所有者的特权。如果一个工作者正在应用事务时, 订阅的所有权被并发事务更改,当前事务的应用将在旧所有者的特权下继续。