Postgresql

強制執行表所有權

  • September 14, 2022

這是交易:我有 postgresql 數據庫(GCP Cloud SQL 部署,我不關心版本)並且我想強制執行表的所有權。

具體來說,應用程序mydb通過 GCP IAM 帳戶登錄數據庫,該帳戶已分配role_admin. 應用程序需要創建一個mytablerole_mydb_admin. 所以它需要先呼叫SET ROLE role_mydb_admin;然後繼續創建表。以下是所有權的樣子:

Role                  | Member of
----------------------+-----------------
user@gcpprojectid.iam | role_admin
role_admin            | role_mydb_admin
Name    | Owner
--------+-----------------
mytable | role_mydb_admin

如果由於某種原因,使用者沒有將角色設置為role_mydb_admin,則將在role_admin. 這是我需要避免的問題。

解決此問題的一種方法是創建一個函式,該函式將通過事件觸發器攔截 CREATE TABLE 並重新分配錯誤創建的表。這可行但不是一個足夠好的解決方案,因為一些應用程序正在執行大量 DDL 操作作為其工作的一部分,並且它呼叫會過度觸發此功能。其次,我不喜歡。

我想要的是某種策略,它可以確保只能使用role_mydb_admin使用者創建表。這樣的事情可能嗎?類似的東西deny create table if owner not equal to role_mydb_admin

或者,如果我可以擁有一個role_admin根本沒有 CREATE 和 ALTER 權限,但具有 SET ROLE 權限role_mydb_admin(具有這些權限)的權限。

簡單的; 使用中間NOINHERIT角色:

CREATE ROLE admin_noinherit NOLOGIN NOINHERIT;
REVOKE role_mydb_admin FROM "user@gcpprojectid.iam";
GRANT role_mydb_admin TO admin_noinherit;
GRANT admin_noinherit TO "user@gcpprojectid.iam";

現在"user@gcpprojectid.iam"(奇怪的名字)是 的成員role_mydb_admin,但不從該角色繼承權限。

然後更改架構,使其只有role_mydb_admin特權CREATE。之後,"user@gcpprojectid.iam" 必須使用

SET ROLE role_mydb_admin;

能夠創建一個表,並且表的所有權是應該的。

但是請注意,沒有任何東西可以讓"user@gcpprojectid.iam"FROM 執行

ALTER TABLE myschema.tab SET OWNER TO "user@gcpprojectid.iam";

在稍後的某個時間點。但我猜你只是想建立合理的預設權限。

引用自:https://dba.stackexchange.com/questions/316847