Menggunakan dukungan ekstensi yang RDS didelegasikan Amazon untuk Postgre SQL - Layanan Basis Data Relasional Amazon

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menggunakan dukungan ekstensi yang RDS didelegasikan Amazon untuk Postgre SQL

Menggunakan dukungan ekstensi RDS yang didelegasikan Amazon untuk PostgreSQL, Anda dapat mendelegasikan manajemen ekstensi kepada pengguna yang tidak perlu menjadi file. rds_superuser Dengan dukungan ekstensi yang didelegasikan ini, peran baru yang rds_extension disebut dibuat dan Anda harus menetapkan ini kepada pengguna untuk mengelola ekstensi lainnya. Peran ini dapat membuat, memperbarui, dan menjatuhkan ekstensi.

Anda dapat menentukan ekstensi yang dapat diinstal pada instans RDS DB Anda, dengan mencantumkannya di rds.allowed_extensions parameter. Untuk informasi selengkapnya, lihat Menggunakan SQL ekstensi Postgre dengan Amazon RDS untuk Postgre. SQL

Anda dapat membatasi daftar ekstensi yang tersedia yang dapat dikelola oleh pengguna dengan rds_extension peran menggunakan rds.allowed_delegated_extensions parameter.

Dukungan ekstensi yang didelegasikan tersedia dalam versi berikut:

  • Semua versi yang lebih tinggi

  • 16.4 dan versi 16 yang lebih tinggi

  • 15.8 dan versi 15 yang lebih tinggi

  • 14.13 dan versi 14 yang lebih tinggi

  • 13.16 dan 13 versi yang lebih tinggi

  • 12.20 dan versi 12 yang lebih tinggi

Mengaktifkan dukungan ekstensi delegasi ke pengguna

Anda harus melakukan hal berikut untuk mengaktifkan dukungan ekstensi delegasi kepada pengguna:

  1. Berikan rds_extension peran kepada pengguna - Connect ke database sebagai rds_superuser dan jalankan perintah berikut:

    Postgres => grant rds_extension to user_name;
  2. Mengatur daftar ekstensi yang tersedia bagi pengguna yang didelegasikan untuk dikelolards.allowed_delegated_extensions Memungkinkan Anda menentukan subset ekstensi yang tersedia menggunakan parameter rds.allowed_extensions cluster DB. Anda dapat melakukan ini di salah satu level berikut:

    • Di cluster atau kelompok parameter instance, melalui AWS Management Console orAPI. Untuk informasi selengkapnya, lihat Grup parameter untuk RDS.

    • Gunakan perintah berikut di tingkat database:

      alter database database_name set rds.allowed_delegated_extensions = 'extension_name_1, extension_name_2,...extension_name_n';
    • Gunakan perintah berikut di tingkat pengguna:

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

    Anda tidak perlu me-restart database setelah mengubah parameter rds.allowed_delegated_extensions dinamis.

  3. Izinkan akses ke pengguna yang didelegasikan ke objek yang dibuat selama proses pembuatan ekstensi - Ekstensi tertentu membuat objek yang memerlukan izin tambahan untuk diberikan sebelum pengguna dengan rds_extension peran dapat mengaksesnya. rds_superuserHarus memberikan akses pengguna yang didelegasikan ke objek tersebut. Salah satu opsi adalah menggunakan pemicu peristiwa untuk secara otomatis memberikan izin kepada pengguna yang didelegasikan. Untuk informasi lebih lanjut, lihat contoh pemicu peristiwa diMematikan dukungan untuk ekstensi yang didelegasikan.

Konfigurasi yang digunakan dalam dukungan ekstensi RDS yang didelegasikan untuk Postgre SQL

Nama Konfigurasi Deskripsi nilai default Catatan Siapa yang dapat memodifikasi atau memberikan izin

rds.allowed_delegated_extensions

Parameter ini membatasi ekstensi yang dapat dikelola peran rds_extension dalam database. Itu harus merupakan bagian dari rds.allowed_extensions.

string kosong

  • Secara default, parameter ini adalah string kosong, yang berarti bahwa tidak ada ekstensi yang telah didelegasikan kepada pengguna denganrds_extension.

  • Ekstensi apa pun yang didukung dapat ditambahkan jika pengguna memiliki izin untuk melakukannya. Untuk melakukan ini, atur rds.allowed_delegated_extensions parameter ke string nama ekstensi yang dipisahkan koma. Dengan menambahkan daftar ekstensi ke parameter ini, Anda secara eksplisit mengidentifikasi ekstensi yang dapat dipasang oleh pengguna dengan rds_extension peran tersebut.

  • Ketika diatur ke*, itu berarti bahwa semua ekstensi yang terdaftar di rds_allowed_extensions didelegasikan kepada pengguna dengan rds_extension peran.

Untuk mempelajari lebih lanjut tentang pengaturan parameter ini, lihatMengaktifkan dukungan ekstensi delegasi ke pengguna.

rds_superuser

rds.allowed_extensions

Parameter ini memungkinkan pelanggan membatasi ekstensi yang dapat diinstal dalam instans RDS DB. Untuk informasi selengkapnya, lihat Membatasi pemasangan ekstensi SQL Postgre

"*"

Secara default, parameter ini diatur ke “*”, yang berarti bahwa semua ekstensi yang didukung RDS untuk Postgre dan SQL Aurora Postgre SQL diizinkan untuk dibuat oleh pengguna dengan hak istimewa yang diperlukan.

Kosong berarti tidak ada ekstensi yang dapat diinstal dalam instance RDS DB.

administrator

rds-delegated_extension_allow_drop_cascade

Parameter ini mengontrol kemampuan pengguna rds_extension untuk menjatuhkan ekstensi menggunakan opsi kaskade.

off

Secara default, rds-delegated_extension_allow_drop_cascade diatur ke off. Ini berarti bahwa pengguna dengan tidak rds_extension diizinkan untuk menjatuhkan ekstensi menggunakan opsi kaskade.

Untuk memberikan kemampuan itu, rds.delegated_extension_allow_drop_cascade parameter harus disetel keon.

rds_superuser

Mematikan dukungan untuk ekstensi yang didelegasikan

Mematikan sebagian

Pengguna yang didelegasikan tidak dapat membuat ekstensi baru tetapi masih dapat memperbarui ekstensi yang ada.

  • Atur ulang rds.allowed_delegated_extensions ke nilai default di grup parameter cluster DB.

  • Gunakan perintah berikut di tingkat database:

    alter database database_name reset rds.allowed_delegated_extensions;
  • Gunakan perintah berikut di tingkat pengguna:

    alter user user_name reset rds.allowed_delegated_extensions;
Mematikan sepenuhnya

Mencabut rds_extension peran dari pengguna akan mengembalikan pengguna ke izin standar. Pengguna tidak dapat lagi membuat, memperbarui, atau menjatuhkan ekstensi.

postgres => revoke rds_extension from user_name;
Contoh pemicu peristiwa

Jika Anda ingin mengizinkan pengguna yang didelegasikan rds_extension untuk menggunakan ekstensi yang memerlukan izin pengaturan pada objek mereka yang dibuat oleh pembuatan ekstensi, Anda dapat menyesuaikan contoh pemicu peristiwa di bawah ini dan hanya menambahkan ekstensi yang Anda inginkan agar pengguna yang didelegasikan memiliki akses ke fungsionalitas penuh. Pemicu peristiwa ini dapat dibuat pada template1 (template default), oleh karena itu semua database yang dibuat dari template1 akan memiliki pemicu peristiwa itu. Ketika pengguna yang didelegasikan menginstal ekstensi, pemicu ini akan secara otomatis memberikan kepemilikan pada objek yang dibuat oleh ekstensi.

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();

Manfaat menggunakan dukungan ekstensi yang RDS didelegasikan Amazon

Dengan menggunakan dukungan ekstensi RDS yang didelegasikan Amazon untuk PostgreSQL, Anda mendelegasikan manajemen ekstensi dengan aman kepada pengguna yang tidak memiliki peran tersebut. rds_superuser Fitur ini memberikan manfaat sebagai berikut:

  • Anda dapat dengan mudah mendelegasikan manajemen ekstensi kepada pengguna pilihan Anda.

  • Ini tidak membutuhkan rds_superuser peran.

  • Menyediakan kemampuan untuk mendukung kumpulan ekstensi yang berbeda untuk database yang berbeda di cluster DB yang sama.

Batasan dukungan ekstensi yang RDS didelegasikan Amazon untuk Postgre SQL

  • Objek yang dibuat selama proses pembuatan ekstensi mungkin memerlukan hak istimewa tambahan agar ekstensi berfungsi dengan baik.

  • Beberapa ekstensi tidak dapat dikelola oleh pengguna ekstensi yang didelegasikan secara default, termasuk yang berikut:log_fdw,,pg_cron,pg_tle,pgactive,pglogical, postgis_rasterpostgis_tiger_geocoder,postgis_topology.

Izin diperlukan untuk ekstensi tertentu

Untuk membuat, menggunakan, atau memperbarui ekstensi berikut, pengguna yang didelegasikan harus memiliki hak istimewa yang diperlukan pada fungsi, tabel, dan skema berikut.

Ekstensi yang membutuhkan kepemilikan atau izin Fungsi Tabel Skema Kamus Pencarian Teks Komentar

address_standardizer_data_us

none

us_gaz, us_lex, us_lex, i.us_rules

none

none

none

amcheck

bt_index_check, bt_index_parent_check

none

none

none

none

dict_int

none

none

none

intdict

none

pg_partman

none

custom_time_partisi, part_config, part_config_sub

none

none

none

pg_stat_statements

none

none

none

none

none

Posting GIS

st_tileamplop

spatial_ref_sys

none

none

none

postgis_raster

none

none

none

none

none

postgis_topology

none

topologi, lapisan

topologi

none

pengguna yang didelegasikan Harus menjadi pemilik database

log_fdw

create_foreign_table_for_log_file

none

none

none

none

rds_tools

role_password_encryption_type

none

none

none

none

postgis_tiger_geocoder

none

geocode_settings_default, geocode_settings

harimau

none

none

pg_freespacemap

pg_freespace

none

none

none

none

pg_visibility

pg_visibility

none

none

none

none

Pertimbangan Keamanan

Perlu diingat bahwa pengguna dengan rds_extension peran akan dapat mengelola ekstensi di semua database tempat mereka memiliki hak istimewa terhubung. Jika tujuannya adalah agar pengguna yang didelegasikan mengelola ekstensi pada satu database, praktik yang baik adalah mencabut semua hak istimewa dari publik di setiap database, kemudian secara eksplisit memberikan hak istimewa koneksi untuk database spesifik tersebut kepada pengguna delegasi.

Ada beberapa ekstensi yang dapat memungkinkan pengguna untuk mengakses informasi dari beberapa database. Pastikan pengguna yang Anda berikan rds_extension memiliki kemampuan lintas basis data sebelum menambahkan ekstensi inirds.allowed_delegated_extensions. Misalnya, postgres_fdw dan dblink menyediakan fungsionalitas untuk kueri di seluruh database pada instance yang sama atau instance jarak jauh. log_fdwmembaca file log mesin postgres, yang untuk semua database dalam instance, berpotensi berisi kueri lambat atau pesan kesalahan dari beberapa database. pg_cronmemungkinkan menjalankan pekerjaan latar belakang terjadwal pada instans DB dan dapat mengonfigurasi pekerjaan untuk dijalankan di database yang berbeda.

Jatuhkan kaskade ekstensi dinonaktifkan

Kemampuan untuk menjatuhkan ekstensi dengan opsi kaskade oleh pengguna dengan rds_extension peran dikendalikan oleh rds.delegated_extension_allow_drop_cascade parameter. Secara default, rds-delegated_extension_allow_drop_cascade diatur ke off. Ini berarti bahwa pengguna dengan rds_extension peran tidak diizinkan untuk menjatuhkan ekstensi menggunakan opsi kaskade seperti yang ditunjukkan pada kueri di bawah ini.

DROP EXTENSION CASCADE;

Karena ini akan secara otomatis menjatuhkan objek yang bergantung pada ekstensi, dan pada gilirannya semua objek yang bergantung pada objek tersebut. Mencoba menggunakan opsi kaskade akan menghasilkan kesalahan.

Untuk memberikan kemampuan itu, rds.delegated_extension_allow_drop_cascade parameter harus disetel keon.

Mengubah parameter rds.delegated_extension_allow_drop_cascade dinamis tidak memerlukan restart database. Anda dapat melakukan ini di salah satu level berikut:

  • Di cluster atau kelompok parameter instance, melalui AWS Management Console orAPI.

  • Menggunakan perintah berikut di tingkat database:

    alter database database_name set rds.delegated_extension_allow_drop_cascade = 'on';
  • Menggunakan perintah berikut di tingkat pengguna:

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

Contoh ekstensi yang dapat ditambahkan menggunakan dukungan ekstensi yang didelegasikan

  • 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