

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

# Menggunakan dukungan ekstensi yang didelegasikan Amazon RDS untuk PostgreSQL
<a name="RDS_delegated_ext"></a>

Menggunakan dukungan ekstensi yang didelegasikan Amazon RDS untuk PostgreSQL, Anda dapat mendelegasikan manajemen ekstensi ke 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 ekstensi PostgreSQL dengan Amazon RDS for PostgreSQL.](https://docs.aws.amazon.com//AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.Extensions.html)

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

**Topics**
+ [Mengaktifkan dukungan ekstensi delegasi ke pengguna](#RDSPostgreSQL.delegated_ext_mgmt)
+ [Konfigurasi yang digunakan dalam dukungan ekstensi yang didelegasikan RDS untuk PostgreSQL](#RDSPostgreSQL.delegated_ext_config)
+ [Mematikan dukungan untuk ekstensi yang didelegasikan](#RDSPostgreSQL.delegated_ext_disable)
+ [Manfaat menggunakan dukungan ekstensi yang didelegasikan Amazon RDS](#RDSPostgreSQL.delegated_ext_benefits)
+ [Batasan dukungan ekstensi yang didelegasikan Amazon RDS untuk PostgreSQL](#RDSPostgreSQL.delegated_ext_limit)
+ [Izin diperlukan untuk ekstensi tertentu](#RDSPostgreSQL.delegated_ext_perm)
+ [Pertimbangan Keamanan](#RDSPostgreSQL.delegated_ext_sec)
+ [Jatuhkan kaskade ekstensi dinonaktifkan](#RDSPostgreSQL.delegated_ext_drop)
+ [Contoh ekstensi yang dapat ditambahkan menggunakan dukungan ekstensi yang didelegasikan](#RDSPostgreSQL.delegated_ext_support)

## Mengaktifkan dukungan ekstensi delegasi ke pengguna
<a name="RDSPostgreSQL.delegated_ext_mgmt"></a>

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;
   ```

1. **Mengatur daftar ekstensi yang tersedia bagi pengguna yang didelegasikan untuk dikelola** — `rds.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 grup parameter instance, melalui Konsol Manajemen AWS atau API. Untuk informasi selengkapnya, lihat [Grup parameter untuk RDS](USER_WorkingWithParamGroups.md).
   + 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.

1. **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.

   **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_catalog.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 pg_catalog.format('GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE %I.us_gaz TO %I WITH GRANT OPTION;', schemaname, databaseowner);
               EXECUTE pg_catalog.format('GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE %I.us_lex TO %I WITH GRANT OPTION;', schemaname, databaseowner);
               EXECUTE pg_catalog.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 pg_catalog.format('ALTER TEXT SEARCH DICTIONARY %I.intdict OWNER TO %I;', schemaname, databaseowner);
           ELSIF r.object_identity = 'pg_partman' THEN
               EXECUTE pg_catalog.format('GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE %I.part_config TO %I WITH GRANT OPTION;', schemaname, databaseowner);
               EXECUTE pg_catalog.format('GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE %I.part_config_sub TO %I WITH GRANT OPTION;', schemaname, databaseowner);
               EXECUTE pg_catalog.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 pg_catalog.format('GRANT SELECT, UPDATE, INSERT, DELETE ON ALL TABLES IN SCHEMA topology TO %I WITH GRANT OPTION;', databaseowner);
               EXECUTE pg_catalog.format('GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA topology TO %I WITH GRANT OPTION;', databaseowner);
               EXECUTE pg_catalog.format('GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA topology TO %I WITH GRANT OPTION;', databaseowner);
               EXECUTE pg_catalog.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();
   ```

## Konfigurasi yang digunakan dalam dukungan ekstensi yang didelegasikan RDS untuk PostgreSQL
<a name="RDSPostgreSQL.delegated_ext_config"></a>


| 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\$1extension dalam database. Itu harus merupakan bagian dari rds.allowed\$1extensions. | string kosong | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/AmazonRDS/latest/UserGuide/RDS_delegated_ext.html) Untuk mempelajari lebih lanjut tentang pengaturan parameter ini, lihat[Mengaktifkan dukungan ekstensi delegasi ke pengguna](#RDSPostgreSQL.delegated_ext_mgmt). | rds\$1superuser | 
| `rds.allowed_extensions` | Parameter ini memungkinkan pelanggan membatasi ekstensi yang dapat diinstal dalam instans RDS DB. Untuk informasi selengkapnya, lihat [Membatasi pemasangan ekstensi PostgreSQL](https://docs.aws.amazon.com//AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html#PostgreSQL.Concepts.General.FeatureSupport.Extensions.Restriction) | "\$1" | Secara default, parameter ini diatur ke “\$1”, yang berarti bahwa semua ekstensi yang didukung pada RDS untuk PostgreSQL dan Aurora PostgreSQL diizinkan untuk dibuat oleh pengguna dengan hak istimewa yang diperlukan. Kosong berarti tidak ada ekstensi yang dapat diinstal di instans 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 diatur ke`on`. | rds\$1superuser | 

## Mematikan dukungan untuk ekstensi yang didelegasikan
<a name="RDSPostgreSQL.delegated_ext_disable"></a>

**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;
```

## Manfaat menggunakan dukungan ekstensi yang didelegasikan Amazon RDS
<a name="RDSPostgreSQL.delegated_ext_benefits"></a>

Dengan menggunakan dukungan ekstensi yang didelegasikan Amazon RDS 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 didelegasikan Amazon RDS untuk PostgreSQL
<a name="RDSPostgreSQL.delegated_ext_limit"></a>
+ 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
<a name="RDSPostgreSQL.delegated_ext_perm"></a>

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\$1standardizer\$1data\$1us | none | us\$1gaz, us\$1lex, us\$1lex, i.us\$1rules | none | none | none | 
| amcheck | bt\$1index\$1check, bt\$1index\$1parent\$1check | none | none | none | none | 
| dict\$1int | none | none | none | intdict | none | 
| pg\$1partman | none | custom\$1time\$1partisi, part\$1config, part\$1config\$1sub | none | none | none | 
| pg\$1stat\$1statements | none | none | none | none | none | 
| PostGIS | st\$1tileamplop | spatial\$1ref\$1sys | none | none | none | 
| postgis\$1raster | none | none | none | none | none | 
| postgis\$1topology | none | topologi, lapisan | topologi | none | pengguna yang didelegasikan Harus menjadi pemilik database | 
| log\$1fdw | create\$1foreign\$1table\$1for\$1log\$1file | none | none | none | none | 
| rds\$1tools | role\$1password\$1encryption\$1type | none | none | none | none | 
| postgis\$1tiger\$1geocoder | none | geocode\$1settings\$1default, geocode\$1settings | harimau | none | none | 
| pg\$1freespacemap | pg\$1freespace | none | none | none | none | 
| pg\$1visibility | pg\$1visibility | none | none | none | none | 

## Pertimbangan Keamanan
<a name="RDSPostgreSQL.delegated_ext_sec"></a>

 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 ini`rds.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
<a name="RDSPostgreSQL.delegated_ext_drop"></a>

 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 diatur ke`on`. 

 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 grup parameter instance, melalui Konsol Manajemen AWS atau API.
+ 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
<a name="RDSPostgreSQL.delegated_ext_support"></a>
+ `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
  ```