Postgresql

如何提取 PostgreSQL 10 預設角色的授權:pg_read_all_settings、pg_read_all_stats、pg_monitor 和 pg_signal_backend?

  • April 10, 2022

我有一個在 AWS RDS 上執行的版本 10 的 Postgres 實例。我在那裡有一個使用者,授予它預設角色。我想在實例版本為 9.4 的沙箱上創建相同的使用者。因此,我想知道版本 10 的這些預設角色中包含的授權。

看看https://www.postgresql.org/docs/current/infoschema-role-table-grants.html

視圖 role_table_grants 標識在授予者或被授予者是目前啟用的角色的表或視圖上授予的所有權限。更多資訊可以在 table_privileges 下找到。此視圖和 table_privileges 之間唯一有效的區別是,此視圖忽略了通過授予 PUBLIC 的方式使目前使用者可以訪問的表。

另請參閱https://stackoverflow.com/a/55459289/6368697

這些角色大多是硬編碼的。例如,在pg_stat_get_activity原始碼中(在pg_stat_activity視圖中使用) -HAS_PGSTAT_PERMISSIONS宏定義為:

(is_member_of_role(GetUserId(), DEFAULT_ROLE_READ_ALL_STATS) || has_privs_of_role(GetUserId(), role))

這是使用硬編碼角色名稱的直接成員資格檢查。角色旨在授予這種可能性,而不是引入一些新的授予類型。在 10 之前的版本中,僅檢查超級使用者權限或使用者 ID 的完全匹配:https ://github.com/postgres/postgres/blob/REL9_4_STABLE/src/backend/utils/adt/pgstatfuncs.c #L678

if (superuser() || beentry->st_userid == GetUserId())

因此,不可能授予如此精細的特權。

我想在實例版本為 9.4 的沙箱上創建相同的使用者

請注意,RDS 是一個閉源分支。眾所周知,RDS 對程式碼進行了自己的更改,包括在權限系統中。因此,您將無法從 RDS 外部複製 RDS。

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