使用 Amazon RDS 委託擴展支持 Postgre SQL - Amazon Relational Database Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Amazon RDS 委託擴展支持 Postgre SQL

使用 Amazon RDS 委派 Postgre 擴充功能支援SQL,您可以將擴充功能管理委派給不需要. rds_superuser 透過此委派的擴充功能支援,會建立名rds_extension為的新角色,您必須將此角色指派給使用者,才能管理其他擴充功能。此角色可以建立、更新和刪除擴充功能。

您可以在rds.allowed_extensions參數中列出可以安裝在RDS資料庫執行個體上的延伸模組,以指定擴充功能。如需詳細資訊,請參閱將 Postgre SQL 擴充功能與 Amazon 搭配使RDS用。SQL

您可以限制具有該角色 using rds.allowed_delegated_extensions 參數的使用者可以管理的可rds_extension用擴充功能清單。

委派的擴充功能支援適用於下列版本:

  • 所有較高版本

  • 16.4 及更高版本 16 個版本

  • 15.8 及更高版本 15 個版本

  • 14.13 及更高版本 14 個版本

  • 13.16 及更高版本 13 個版本

  • 12.20 及更高版本 12 個版本

開啟對使用者的委派擴充功能支援

您必須執行下列動作,才能啟用對使用者的委派擴充功能支援:

  1. rds_extension角色授與使用者 — 以身分 Connect 至資料庫rds_superuser並執行下列命令:

    Postgres => grant rds_extension to user_name;
  2. 設定可供委派使用者管理的擴充功能清單 — 可rds.allowed_delegated_extensions讓您使用 DB 叢集參數rds.allowed_extensions中指定可用擴充功能的子集。您可以在下列其中一個層級執行此操作:

    • 在叢集或執行個體參數群組中,透過 AWS Management Console 或API。如需詳細資訊,請參閱 的參數組 RDS

    • 在資料庫層級使用下列命令:

      alter database database_name set rds.allowed_delegated_extensions = 'extension_name_1, extension_name_2,...extension_name_n';
    • 在使用者層級使用下列指令:

      alter user user_name set rds.allowed_delegated_extensions = 'extension_name_1, extension_name_2,...extension_name_n';
    注意

    變更rds.allowed_delegated_extensions動態參數之後,您不需要重新啟動資料庫。

  3. 允許在擴充功能建立過程中所建立的物件的委派使用者存取權限 — 某些擴充功能會建立要求授與其他權限的物件,才能讓具有rds_extension角色的使用者存取這些物件。rds_superuser必須授與委派的使用者存取這些物件。其中一個選項是使用事件觸發器自動將權限授予委派的使用者。如需詳細資訊,請參閱中的事件觸發器範例關閉對委託擴展的支持

在 Postgre 的RDS委託擴展支持中使用的配置 SQL

組態名稱 描述 預設值 備註 誰可以修改或授予權限

rds.allowed_delegated_extensions

此參數會限制 rds_擴展角色可以在資料庫管理的延伸模組。它必須是 rds.允許擴展的子集。

空字符串

  • 依預設,此參數為空字串,這表示沒有副檔名已委派給具有rds_extension.

  • 如果使用者有權限,則可以新增任何支援的擴充功能。若要這麼做,請將rds.allowed_delegated_extensions參數設定為以逗號分隔的副檔名字串。透過將擴充功能清單新增至此參數,您可以明確識別具有該rds_extension角色的使用者可以安裝的擴充功能。

  • 設定為時*,表示中列出的所有擴充功能rds_allowed_extensions都會委派給具有rds_extension角色的使用者。

若要進一步瞭解如何設定此參數,請參閱開啟對使用者的委派擴充功能支援

rds_ 超级用户

rds.allowed_extensions

此參數可讓客戶限制可安裝在RDS資料庫執行個體中的擴充功能。如需詳細資訊,請參閱限制 Post SQL gre 擴充功能的安裝

"*"

依預設,此參數設定為「*」,也就是說,具有必要權限的使用者可以建立 Postgre SQL 和 Aurora Postgre SQL 支援的所有擴充功能。RDS

空白表示RDS資料庫執行個體中無法安裝任何擴充功能。

管理員

rds-delegated_extension_allow_drop_cascade

此參數控制使用者使用重疊顯示選項卸除擴充功能的能力。rds_extension

off

rds-delegated_extension_allow_drop_cascade 預設會設定為 off。這意味著不允許具rds_extension有使用級聯選項刪除擴展程序的用戶。

若要授予該能力,rds.delegated_extension_allow_drop_cascade參數應設定為on

rds_ 超级用户

關閉對委託擴展的支持

部分關閉

委派的使用者無法建立新的擴充功能,但仍可更新現有的擴充功能。

  • 重設rds.allowed_delegated_extensions為資料庫叢集參數群組中的預設值。

  • 在資料庫層級使用下列命令:

    alter database database_name reset rds.allowed_delegated_extensions;
  • 在使用者層級使用下列指令:

    alter user user_name reset rds.allowed_delegated_extensions;
完全關閉

撤銷使用者的rds_extension角色會將使用者還原為標準權限。使用者無法再建立、更新或刪除擴充功能。

postgres => revoke rds_extension from user_name;
事件觸發範例

如果您想要允許具有的委派使用rds_extension者使用擴充功能,而擴充功能需要對其建立的物件設定權限,您可以自訂下列事件觸發器範例,並僅新增您希望委派使用者能夠存取完整功能的擴充功能。此事件觸發器可以在 template1(默認模板)上創建,因此從 template1 創建的所有數據庫都將具有該事件觸發器。委派使用者安裝擴充功能時,此觸發程序會自動授與擴充功能建立之物件的所有權。

CREATE OR REPLACE FUNCTION create_ext() RETURNS event_trigger AS $$ DECLARE schemaname TEXT; databaseowner TEXT; r RECORD; BEGIN IF tg_tag = 'CREATE EXTENSION' and current_user != 'rds_superuser' THEN RAISE NOTICE 'SECURITY INVOKER'; RAISE NOTICE 'user: %', current_user; FOR r IN SELECT * FROM pg_event_trigger_ddl_commands() LOOP CONTINUE WHEN r.command_tag != 'CREATE EXTENSION' OR r.object_type != 'extension'; schemaname = ( SELECT n.nspname FROM pg_catalog.pg_extension AS e INNER JOIN pg_catalog.pg_namespace AS n ON e.extnamespace = n.oid WHERE e.oid = r.objid ); databaseowner = ( SELECT pg_catalog.pg_get_userbyid(d.datdba) FROM pg_catalog.pg_database d WHERE d.datname = current_database() ); RAISE NOTICE 'Record for event trigger %, objid: %,tag: %, current_user: %, schema: %, database_owenr: %', r.object_identity, r.objid, tg_tag, current_user, schemaname, databaseowner; IF r.object_identity = 'address_standardizer_data_us' THEN EXECUTE format('GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE %I.us_gaz TO %I WITH GRANT OPTION;', schemaname, databaseowner); EXECUTE format('GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE %I.us_lex TO %I WITH GRANT OPTION;', schemaname, databaseowner); EXECUTE format('GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE %I.us_rules TO %I WITH GRANT OPTION;', schemaname, databaseowner); ELSIF r.object_identity = 'dict_int' THEN EXECUTE format('ALTER TEXT SEARCH DICTIONARY %I.intdict OWNER TO %I;', schemaname, databaseowner); ELSIF r.object_identity = 'pg_partman' THEN EXECUTE format('GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE %I.part_config TO %I WITH GRANT OPTION;', schemaname, databaseowner); EXECUTE format('GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE %I.part_config_sub TO %I WITH GRANT OPTION;', schemaname, databaseowner); EXECUTE format('GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE %I.custom_time_partitions TO %I WITH GRANT OPTION;', schemaname, databaseowner); ELSIF r.object_identity = 'postgis_topology' THEN EXECUTE format('GRANT SELECT, UPDATE, INSERT, DELETE ON ALL TABLES IN SCHEMA topology TO %I WITH GRANT OPTION;', databaseowner); EXECUTE format('GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA topology TO %I WITH GRANT OPTION;', databaseowner); EXECUTE format('GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA topology TO %I WITH GRANT OPTION;', databaseowner); EXECUTE format('GRANT USAGE ON SCHEMA topology TO %I WITH GRANT OPTION;', databaseowner); END IF; END LOOP; END IF; END; $$ LANGUAGE plpgsql SECURITY DEFINER; CREATE EVENT TRIGGER log_create_ext ON ddl_command_end EXECUTE PROCEDURE create_ext();

使用 Amazon RDS 委派擴充功能支援的好處

透過使用 Amazon RDS 委派 Postgre 擴充功能支援SQL,您可以安全地將擴充功能管理委派給沒有該rds_superuser角色的使用者。此功能提供下列優點:

  • 您可以輕鬆地將擴充功能管理委派給您選擇的使用者。

  • 這不需要rds_superuser角色。

  • 提供支援相同資料庫叢集中不同資料庫的不同擴充功能組的功能。

Amazon RDS 委託擴展支持 Postgre 的限制 SQL

  • 在創建擴展過程中創建的對象可能要求其他權限才能正常運行擴展程序。

  • 根據預設,委派的擴充功能使用者無法管理某些擴充功能,包括:log_fdw、、pg_cron、、pg_tlepgactive、、pglogicalpostgis_raster、、postgis_tiger_geocoder、、postgis_topology

特定擴充功能所需的權限

若要建立、使用或更新下列擴充功能,委派的使用者必須具備下列函數、表格和結構描述的必要權限。

需要擁有權或權限的擴充功能 函式 資料表 結構描述 文字搜尋字典 註解

address_standardizer_data_us

我們加茲, 我們 _ 萊克斯, 我們 _ 萊克斯, 一般規則

amcheck

bt_ 索引檢查, bt_索引父_檢查

dict_int

證明

pg_partman

自定義時間分區,零件配置,零件配置

pg_stat_statements

郵政 GIS

st_ 方塊包絡

空間參考系統

postgis_raster

postgis_topology

拓樸, 圖層

拓撲

委派的使用者必須是資料庫擁有者

log_fdw

創建外來 _ 表格對日誌文件

rds_tools

角色密碼加密類型

postgis_tiger_geocoder

地理編碼設置-默認, 地理編碼設置

老虎

pg_freespacemap

自由空間

pg_visibility

pg_visibility

安全考量

請記住,具有rds_extension角色的使用者將能夠在其擁有連線權限的所有資料庫上管理擴充功能。如果要讓委派的使用者在單一資料庫上管理擴充功能,最好的做法是撤銷每個資料庫上 public 的所有權限,然後明確地將該特定資料庫的連線權限授與委派使用者。

有幾個擴展可以允許用戶從多個數據庫訪問信息。請確定您授與的使用者rds_extension具有跨資料庫功能,然後再將這些擴充功能rds.allowed_delegated_extensions新增 例如,postgres_fdwdblink提供在相同執行個體或遠端執行個體上跨資料庫進行查詢的功能。 log_fdw讀取 postgres 引擎記錄檔,這些記錄檔適用於執行個體中的所有資料庫,可能包含來自多個資料庫的緩慢查詢或錯誤訊息。 pg_cron可在資料庫執行個體上執行排定的背景作業,並設定要在不同資料庫中執行的工作。

刪除擴展級聯已禁用

具有rds_extension角色的用戶使用級聯選項刪除擴展的能力由rds.delegated_extension_allow_drop_cascade參數控制。rds-delegated_extension_allow_drop_cascade 預設會設定為 off。這意味著具有rds_extension角色的用戶不允許使用級聯選項刪除擴展,如下面的查詢。

DROP EXTENSION CASCADE;

因為這將自動刪除依賴於擴展的對象,以及依賴於這些對象的所有對象。嘗試使用串聯選項會導致錯誤。

若要授予該能力,rds.delegated_extension_allow_drop_cascade參數應設定為on

變更動rds.delegated_extension_allow_drop_cascade態參數不需要重新啟動資料庫。您可以在下列其中一個層級執行此操作:

  • 在叢集或執行個體參數群組中,透過 AWS Management Console 或API。

  • 在數據庫級別使用以下命令:

    alter database database_name set rds.delegated_extension_allow_drop_cascade = 'on';
  • 在使用者層級使用下列指令:

    alter role tenant_user set rds.delegated_extension_allow_drop_cascade = 'on';

可使用委派的擴充功能支援新增的範例擴充功能

  • rds_tools

    extension_test_db=> create extension rds_tools; CREATE EXTENSION extension_test_db=> SELECT * from rds_tools.role_password_encryption_type() where rolname = 'pg_read_server_files'; ERROR: permission denied for function role_password_encryption_type
  • amcheck

    extension_test_db=> CREATE TABLE amcheck_test (id int); CREATE TABLE extension_test_db=> INSERT INTO amcheck_test VALUES (generate_series(1,100000)); INSERT 0 100000 extension_test_db=> CREATE INDEX amcheck_test_btree_idx ON amcheck_test USING btree (id); CREATE INDEX extension_test_db=> create extension amcheck; CREATE EXTENSION extension_test_db=> SELECT bt_index_check('amcheck_test_btree_idx'::regclass); ERROR: permission denied for function bt_index_check extension_test_db=> SELECT bt_index_parent_check('amcheck_test_btree_idx'::regclass); ERROR: permission denied for function bt_index_parent_check
  • pg_freespacemap

    extension_test_db=> create extension pg_freespacemap; CREATE EXTENSION extension_test_db=> SELECT * FROM pg_freespace('pg_authid'); ERROR: permission denied for function pg_freespace extension_test_db=> SELECT * FROM pg_freespace('pg_authid',0); ERROR: permission denied for function pg_freespace
  • pg_visibility

    extension_test_db=> create extension pg_visibility; CREATE EXTENSION extension_test_db=> select * from pg_visibility('pg_database'::regclass); ERROR: permission denied for function pg_visibility
  • postgres_fdw

    extension_test_db=> create extension postgres_fdw; CREATE EXTENSION extension_test_db=> create server myserver foreign data wrapper postgres_fdw options (host 'foo', dbname 'foodb', port '5432'); ERROR: permission denied for foreign-data wrapper postgres_fdw