本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 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 個版本
主題
開啟對使用者的委派擴充功能支援
您必須執行下列動作,才能啟用對使用者的委派擴充功能支援:
-
將
rds_extension
角色授與使用者 — 以身分 Connect 至資料庫rds_superuser
並執行下列命令:Postgres => grant rds_extension to
user_name
; -
設定可供委派使用者管理的擴充功能清單 — 可
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
動態參數之後,您不需要重新啟動資料庫。 -
-
允許在擴充功能建立過程中所建立的物件的委派使用者存取權限 — 某些擴充功能會建立要求授與其他權限的物件,才能讓具有
rds_extension
角色的使用者存取這些物件。rds_superuser
必須授與委派的使用者存取這些物件。其中一個選項是使用事件觸發器自動將權限授予委派的使用者。如需詳細資訊,請參閱中的事件觸發器範例關閉對委託擴展的支持。
在 Postgre 的RDS委託擴展支持中使用的配置 SQL
組態名稱 | 描述 | 預設值 | 備註 | 誰可以修改或授予權限 |
---|---|---|---|---|
|
此參數會限制 rds_擴展角色可以在資料庫管理的延伸模組。它必須是 rds.允許擴展的子集。 |
空字符串 |
若要進一步瞭解如何設定此參數,請參閱開啟對使用者的委派擴充功能支援。 |
rds_ 超级用户 |
|
此參數可讓客戶限制可安裝在RDS資料庫執行個體中的擴充功能。如需詳細資訊,請參閱限制 Post SQL gre 擴充功能的安裝 |
"*" |
依預設,此參數設定為「*」,也就是說,具有必要權限的使用者可以建立 Postgre SQL 和 Aurora Postgre SQL 支援的所有擴充功能。RDS 空白表示RDS資料庫執行個體中無法安裝任何擴充功能。 |
管理員 |
|
此參數控制使用者使用重疊顯示選項卸除擴充功能的能力。 |
off |
若要授予該能力, |
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_tle
、pgactive
、、pglogical
、postgis_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_fdw
並dblink
提供在相同執行個體或遠端執行個體上跨資料庫進行查詢的功能。 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