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
Topik
- Mengaktifkan dukungan ekstensi delegasi ke pengguna
- Konfigurasi yang digunakan dalam dukungan ekstensi RDS yang didelegasikan untuk Postgre SQL
- Mematikan dukungan untuk ekstensi yang didelegasikan
- Manfaat menggunakan dukungan ekstensi yang RDS didelegasikan Amazon
- Batasan dukungan ekstensi yang RDS didelegasikan Amazon untuk Postgre SQL
- Izin diperlukan untuk ekstensi tertentu
- Pertimbangan Keamanan
- Jatuhkan kaskade ekstensi dinonaktifkan
- Contoh ekstensi yang dapat ditambahkan menggunakan dukungan ekstensi yang didelegasikan
Mengaktifkan dukungan ekstensi delegasi ke pengguna
Anda harus melakukan hal berikut untuk mengaktifkan dukungan ekstensi delegasi kepada pengguna:
-
Berikan
rds_extension
peran kepada pengguna - Connect ke database sebagairds_superuser
dan jalankan perintah berikut:Postgres => grant rds_extension to
user_name
; -
Mengatur daftar ekstensi yang tersedia bagi pengguna yang didelegasikan untuk dikelola —
rds.allowed_delegated_extensions
Memungkinkan Anda menentukan subset ekstensi yang tersedia menggunakan parameterrds.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. -
-
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_superuser
Harus 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 |
---|---|---|---|---|
|
Parameter ini membatasi ekstensi yang dapat dikelola peran rds_extension dalam database. Itu harus merupakan bagian dari rds.allowed_extensions. |
string kosong |
Untuk mempelajari lebih lanjut tentang pengaturan parameter ini, lihatMengaktifkan dukungan ekstensi delegasi ke pengguna. |
rds_superuser |
|
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 |
|
Parameter ini mengontrol kemampuan pengguna |
off |
Secara default, Untuk memberikan kemampuan itu, |
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_raster
postgis_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_fdw
membaca file log mesin postgres, yang untuk semua database dalam instance, berpotensi berisi kueri lambat atau pesan kesalahan dari beberapa database. pg_cron
memungkinkan 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