Utilizzo del supporto delle estensioni RDS delegate di Amazon per Postgre SQL - Amazon Relational Database Service

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Utilizzo del supporto delle estensioni RDS delegate di Amazon per Postgre SQL

Utilizzando il supporto delle estensioni RDS delegate di Amazon per PostgreSQL, puoi delegare la gestione delle estensioni a un utente che non deve essere un. rds_superuser Con questo supporto delegato per le estensioni, rds_extension viene creato un nuovo ruolo chiamato che devi assegnare a un utente per gestire altre estensioni. Questo ruolo può creare, aggiornare e eliminare estensioni.

È possibile specificare le estensioni che possono essere installate sull'istanza RDS DB, elencandole nel rds.allowed_extensions parametro. Per ulteriori informazioni, consulta Usare le SQL estensioni Postgre con Amazon RDS for Postgre. SQL

Puoi limitare l'elenco delle estensioni disponibili che possono essere gestite dall'utente con il ruolo utilizzando il parametro. rds_extension rds.allowed_delegated_extensions

Il supporto per le estensioni delegate è disponibile nelle seguenti versioni:

  • Tutte le versioni successive

  • 16.4 e versioni successive 16

  • 15.8 e versioni successive 15

  • 14.13 e versioni successive 14

  • 13.16 e versioni successive 13

  • 12.20 e versioni successive 12

Attivazione del supporto per le estensioni delegate a un utente

È necessario eseguire le seguenti operazioni per abilitare il supporto delle estensioni delegate a un utente:

  1. Concedi rds_extension il ruolo a un utente: connettiti al database come rds_superuser ed esegui il seguente comando:

    Postgres => grant rds_extension to user_name;
  2. Imposta l'elenco delle estensioni disponibili per la gestione degli utenti delegati: rds.allowed_delegated_extensions consente di specificare un sottoinsieme delle estensioni disponibili utilizzando rds.allowed_extensions il parametro del cluster DB. È possibile eseguire questa operazione a uno dei seguenti livelli:

    • Nel cluster o nel gruppo di parametri dell'istanza, tramite AWS Management Console oAPI. Per ulteriori informazioni, consulta Gruppi di parametri per RDS.

    • Utilizzate il seguente comando a livello di database:

      alter database database_name set rds.allowed_delegated_extensions = 'extension_name_1, extension_name_2,...extension_name_n';
    • Utilizzate il seguente comando a livello di utente:

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

    Non è necessario riavviare il database dopo aver modificato il parametro rds.allowed_delegated_extensions dinamico.

  3. Consenti l'accesso all'utente delegato agli oggetti creati durante il processo di creazione dell'estensione: alcune estensioni creano oggetti che richiedono la concessione di autorizzazioni aggiuntive prima che l'utente con rds_extension ruolo possa accedervi. rds_superuserDevono concedere all'utente delegato l'accesso a tali oggetti. Una delle opzioni consiste nell'utilizzare un trigger di evento per concedere automaticamente l'autorizzazione all'utente delegato. Per ulteriori informazioni, consulta l'esempio di attivazione di un evento inDisattivazione del supporto per l'estensione delegata.

Configurazione utilizzata nel supporto delle estensioni RDS delegate per Postgre SQL

Nome di configurazione Descrizione Valore predefinito Note Chi può modificare o concedere l'autorizzazione

rds.allowed_delegated_extensions

Questo parametro limita le estensioni che un ruolo rds_extension può gestire in un database. Deve essere un sottoinsieme di rds.allowed_extensions.

stringa vuota

  • Per impostazione predefinita, questo parametro è una stringa vuota, il che significa che nessuna estensione è stata delegata agli utenti conrds_extension.

  • È possibile aggiungere qualsiasi estensione supportata se l'utente dispone dell'autorizzazione necessaria. A tale scopo, impostate il rds.allowed_delegated_extensions parametro su una stringa di nomi di estensione separati da virgole. Aggiungendo un elenco di estensioni a questo parametro, identificate esplicitamente le estensioni che l'utente con il rds_extension ruolo può installare.

  • Se impostato su*, significa che tutte le estensioni elencate in rds_allowed_extensions sono delegate a utenti con rds_extension ruolo.

Per ulteriori informazioni sulla configurazione di questo parametro, consultaAttivazione del supporto per le estensioni delegate a un utente.

rds_superuser

rds.allowed_extensions

Questo parametro consente al cliente di limitare le estensioni che possono essere installate nell'istanza DB. RDS Per ulteriori informazioni, consulta Restrizione dell'installazione delle estensioni SQL Postgre

"*"

Per impostazione predefinita, questo parametro è impostato su «*», il che significa che tutte le estensioni supportate su RDS Postgre e SQL Aurora Postgre possono essere create da utenti con SQL i privilegi necessari.

Vuoto significa che nessuna estensione può essere installata nell'istanza DB. RDS

amministratore

rds-delegated_extension_allow_drop_cascade

Questo parametro controlla la possibilità per l'utente rds_extension di eliminare l'estensione utilizzando un'opzione a cascata.

off

Per impostazione predefinita, rds-delegated_extension_allow_drop_cascade è impostato su off. Ciò significa che gli utenti con non rds_extension sono autorizzati a eliminare un'estensione utilizzando l'opzione a cascata.

Per garantire tale capacità, il rds.delegated_extension_allow_drop_cascade parametro deve essere impostato su. on

rds_superuser

Disattivazione del supporto per l'estensione delegata

Spegnimento parziale

Gli utenti delegati non possono creare nuove estensioni ma possono comunque aggiornare le estensioni esistenti.

  • Ripristina rds.allowed_delegated_extensions il valore predefinito nel gruppo di parametri del cluster DB.

  • Utilizzate il seguente comando a livello di database:

    alter database database_name reset rds.allowed_delegated_extensions;
  • Utilizzate il seguente comando a livello di utente:

    alter user user_name reset rds.allowed_delegated_extensions;
Spegnimento completo

La revoca del rds_extension ruolo a un utente ripristinerà le autorizzazioni standard per l'utente. L'utente non può più creare, aggiornare o eliminare le estensioni.

postgres => revoke rds_extension from user_name;
Esempio di attivazione di un evento

Se desideri consentire a un utente delegato di utilizzare estensioni che richiedono l'impostazione delle autorizzazioni sugli oggetti creati durante la creazione dell'estensione, puoi personalizzare l'esempio seguente di attivazione di un evento e aggiungere solo le estensioni per le quali desideri che gli utenti delegati abbiano accesso alla piena funzionalità. rds_extension Questo trigger di evento può essere creato su template1 (il modello predefinito), pertanto tutti i database creati da template1 avranno quel trigger di evento. Quando un utente delegato installa l'estensione, questo trigger garantirà automaticamente la proprietà degli oggetti creati dall'estensione.

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

Vantaggi dell'utilizzo del supporto per le estensioni RDS delegate di Amazon

Utilizzando il supporto delle estensioni RDS delegate di Amazon per PostgreSQL, deleghi in modo sicuro la gestione delle estensioni a utenti che non ricoprono il ruolo. rds_superuser Questa funzionalità offre i seguenti vantaggi:

  • Puoi delegare facilmente la gestione delle estensioni a utenti di tua scelta.

  • Questo non richiede un rds_superuser ruolo.

  • Offre la possibilità di supportare diversi set di estensioni per diversi database nello stesso cluster DB.

Limitazione del supporto delle estensioni RDS delegate di Amazon per Postgre SQL

  • Gli oggetti creati durante il processo di creazione dell'estensione possono richiedere privilegi aggiuntivi per il corretto funzionamento dell'estensione.

  • Per impostazione predefinita, alcune estensioni non possono essere gestite dall'utente delegato dell'estensione, tra cui:log_fdw,,pg_cron,pg_tle,pgactive, pglogicalpostgis_raster,postgis_tiger_geocoder. postgis_topology

Autorizzazioni richieste per alcune estensioni

Per creare, utilizzare o aggiornare le seguenti estensioni, l'utente delegato deve disporre dei privilegi necessari sulle seguenti funzioni, tabelle e schemi.

Estensioni che richiedono proprietà o autorizzazioni Funzione Tabelle Schema Dizionario di ricerca testuale Commento

address_standardizer_data_us

nessuno

us_gaz, us_lex, us_lex, i.US_Rules

nessuno

nessuno

nessuno

amcheck

bt_index_check, bt_index_parent_check

nessuno

nessuno

nessuno

nessuno

dict_int

nessuno

nessuno

nessuno

intrezzo

nessuno

pg_partman

nessuno

part_time_partitions, part_config, part_config_sub

nessuno

nessuno

nessuno

pg_stat_statements

nessuno

nessuno

nessuno

nessuno

nessuno

Posta GIS

st_tileenvelope

spatial_ref_sys

nessuno

nessuno

nessuno

postgis_raster

nessuno

nessuno

nessuno

nessuno

nessuno

postgis_topology

nessuno

topologia, livello

topologia

nessuno

l'utente delegato Deve essere il proprietario del database

log_fdw

create_foreign_table_for_log_file

nessuno

nessuno

nessuno

nessuno

rds_tools

tipo_ruolo_password_encryption_

nessuno

nessuno

nessuno

nessuno

postgis_tiger_geocoder

nessuno

geocode_settings_default, geocode_settings

tigre

nessuno

nessuno

pg_freespacemap

pg_freespace

nessuno

nessuno

nessuno

nessuno

pg_visibility

pg_visibility

nessuno

nessuno

nessuno

nessuno

Considerazioni sulla sicurezza

Tieni presente che un utente con rds_extension ruolo sarà in grado di gestire le estensioni su tutti i database su cui ha il privilegio di connessione. Se l'intenzione è fare in modo che un utente delegato gestisca l'estensione su un singolo database, è buona norma revocare tutti i privilegi dal pubblico su ciascun database, quindi concedere esplicitamente il privilegio di connessione per quel database specifico all'utente delegato.

Esistono diverse estensioni che possono consentire a un utente di accedere alle informazioni da più database. Assicurati che gli utenti rds_extension concessi dispongano di funzionalità per più database prima di aggiungere queste estensionirds.allowed_delegated_extensions. Ad esempio, postgres_fdw dblink fornisci funzionalità per eseguire query su database sulla stessa istanza o su istanze remote. log_fdwlegge i file di registro del motore Postgres, che riguardano tutti i database dell'istanza, potenzialmente contenenti query lente o messaggi di errore provenienti da più database. pg_cronconsente l'esecuzione di processi pianificati in background sull'istanza DB e può configurare i lavori per l'esecuzione in un database diverso.

Drop Extension Cascade è disabilitato

La possibilità di eliminare l'estensione con l'opzione a cascata da un utente con il rds_extension ruolo è controllata da un rds.delegated_extension_allow_drop_cascade parametro. Per impostazione predefinita, rds-delegated_extension_allow_drop_cascade è impostato su off. Ciò significa che agli utenti con il rds_extension ruolo non è consentito eliminare un'estensione utilizzando l'opzione a cascata, come mostrato nella query seguente.

DROP EXTENSION CASCADE;

In questo modo verranno eliminati automaticamente gli oggetti che dipendono dall'estensione e, a loro volta, tutti gli oggetti che dipendono da tali oggetti. Il tentativo di utilizzare l'opzione a cascata genererà un errore.

Per garantire tale capacità, il rds.delegated_extension_allow_drop_cascade parametro deve essere impostato su. on

La modifica del parametro rds.delegated_extension_allow_drop_cascade dinamico non richiede il riavvio del database. È possibile eseguire questa operazione a uno dei seguenti livelli:

  • Nel cluster o nel gruppo di parametri dell'istanza, tramite AWS Management Console oAPI.

  • Utilizzando il seguente comando a livello di database:

    alter database database_name set rds.delegated_extension_allow_drop_cascade = 'on';
  • Utilizzando il seguente comando a livello di utente:

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

Esempi di estensioni che possono essere aggiunte utilizzando il supporto di estensioni delegate

  • 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