2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10

29.11. 安全 #

用於複製連線的角色必須具有 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 到表所有者的許可權。但是,這也意味著任何擁有正在被複制的表的使用者都可以以訂閱所有者的許可權執行任意程式碼。例如,他們可以透過簡單地向他們擁有的表之一附加觸發器來做到這一點。由於通常不希望允許一個角色隨意假定另一個角色的許可權,因此應避免使用此選項,除非資料庫中的使用者安全性無關緊要。

在釋出者上,許可權僅在複製連線開始時檢查一次,並且在讀取每個更改記錄時不會重新檢查。

在訂閱者上,訂閱所有者的許可權在應用每個事務時都會重新檢查。如果一個工作程序在當前事務的應用過程中,由於併發事務導致訂閱的所有權發生更改,則當前事務的應用將繼續以舊所有者的許可權進行。

提交更正

如果您在文件中發現任何不正確之處、與您實際使用該功能時的體驗不符之處,或者需要進一步說明之處,請使用 此表單 報告文件問題。