31.9. 安全性 #
能够修改订阅端表模式的用户,可以以修改这些表的订阅的所有者角色身份执行任意代码。此类表的所有权和 TRIGGER 权限应只授予受信任的角色。此外,如果不受信任的用户可以创建表,则应只使用显式列出表的发布。也就是说,只有当超级用户信任发布端或订阅端上每一个获准创建非临时表的用户时,才能创建 FOR ALL TABLES 或 FOR TABLES IN SCHEMA 的订阅。
用于复制连接的角色必须具有 REPLICATION 属性(或为超级用户)。如果该角色既没有 SUPERUSER,也没有
BYPASSRLS,则发布端的行安全性策略可能会生效。如果该角色不信任所有表所有者,请在连接字符串中包含
options=-crow_security=off;这样一来,如果某个表所有者随后添加了行安全性策略,复制将停止,而不是执行该策略。该角色的访问权限必须在
pg_hba.conf 中配置,并且它还必须具有
LOGIN 属性。
复制连接所用输出插件的名称必须包含在服务器的 output_plugin_libraries 中。(对于订阅,所用插件名为
pgoutput。)超级用户可以在连接字符串中包含
options=-coutput_plugin_libraries=...,按连接修改受信任列表。
为了能够复制初始表数据,用于复制连接的角色必须对已发布的表具有
SELECT 权限(或者是超级用户)。
要创建发布,用户必须在数据库中具有 CREATE 权限。
要向发布中添加表,用户必须拥有该表。要向发布中添加某个模式中的全部表,用户必须是超级用户。要创建一个会自动发布所有表,或自动发布某个模式中全部表的发布,用户也必须是超级用户。
要创建订阅,用户必须是超级用户。
订阅应用进程将以订阅所有者的权限在本地数据库中运行。
在发布端,权限只在复制连接开始时检查一次,在读取每条变更记录时不会重新检查。
在订阅端,订阅所有者的权限会在每个事务应用时重新检查。如果某个工作进程正在应用事务时,订阅的所有权被并发事务更改,那么当前事务的应用仍会继续使用旧所有者的权限。
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.