Utilisation de la prise en charge RDS déléguée des extensions Amazon pour Postgre SQL - Amazon Relational Database Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation de la prise en charge RDS déléguée des extensions Amazon pour Postgre SQL

Grâce au support RDS délégué des extensions Amazon pour PostgreSQL, vous pouvez déléguer la gestion des extensions à un utilisateur qui n'a pas besoin d'être unrds_superuser. Avec cette prise en charge déléguée des extensions, un nouveau rôle appelé rds_extension est créé et vous devez l'attribuer à un utilisateur pour gérer les autres extensions. Ce rôle peut créer, mettre à jour et supprimer des extensions.

Vous pouvez spécifier les extensions qui peuvent être installées sur votre RDS instance de base de données en les répertoriant dans le rds.allowed_extensions paramètre. Pour plus d'informations, consultez Utilisation des SQL extensions Postgre avec Amazon RDS pour SQL Postgre.

Vous pouvez restreindre la liste des extensions disponibles qui peuvent être gérées par l'utilisateur à l'aide du rds.allowed_delegated_extensions paramètre rds_extension role using.

La prise en charge déléguée des extensions est disponible dans les versions suivantes :

  • Toutes les versions supérieures

  • 16.4 et versions ultérieures 16

  • 15.8 et versions supérieures 15

  • Versions 14.13 et supérieures 14

  • Versions 13.16 et supérieures 13

  • 12.20 et versions supérieures 12

Activation de la prise en charge déléguée des extensions à un utilisateur

Vous devez effectuer les opérations suivantes pour permettre à un utilisateur de prendre en charge les extensions déléguées :

  1. Accorder un rds_extension rôle à un utilisateur — Connectez-vous à la base de données en tant que rds_superuser et exécutez la commande suivante :

    Postgres => grant rds_extension to user_name;
  2. Définir la liste des extensions disponibles pour les utilisateurs délégués à gérer : vous rds.allowed_delegated_extensions permet de spécifier un sous-ensemble des extensions disponibles à l'aide rds.allowed_extensions du paramètre de cluster de base de données. Vous pouvez effectuer cette opération à l'un des niveaux suivants :

    • Dans le cluster ou le groupe de paramètres d'instance, via le AWS Management Console ouAPI. Pour de plus amples informations, veuillez consulter Groupes de paramètres pour Amazon RDS.

    • Utilisez la commande suivante au niveau de la base de données :

      alter database database_name set rds.allowed_delegated_extensions = 'extension_name_1, extension_name_2,...extension_name_n';
    • Utilisez la commande suivante au niveau de l'utilisateur :

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

    Il n'est pas nécessaire de redémarrer la base de données après avoir modifié le paramètre rds.allowed_delegated_extensions dynamique.

  3. Autoriser l'accès à l'utilisateur délégué aux objets créés lors du processus de création de l'extension : certaines extensions créent des objets qui nécessitent l'octroi d'autorisations supplémentaires avant que l'utilisateur ayant le rds_extension rôle puisse y accéder. Ils rds_superuser doivent accorder à l'utilisateur délégué l'accès à ces objets. L'une des options consiste à utiliser un déclencheur d'événement pour accorder automatiquement l'autorisation à l'utilisateur délégué. Pour plus d'informations, reportez-vous à l'exemple de déclencheur d'événements dansDésactiver le support pour l'extension déléguée.

Configuration utilisée pour la prise en charge RDS déléguée des extensions pour Postgre SQL

Nom de configuration Description Valeur par défaut Remarques Qui peut modifier ou accorder l'autorisation

rds.allowed_delegated_extensions

Ce paramètre limite les extensions qu'un rôle rds_extension peut gérer dans une base de données. Il doit s'agir d'un sous-ensemble de rds.allowed_extensions.

chaîne vide

  • Par défaut, ce paramètre est une chaîne vide, ce qui signifie qu'aucune extension n'a été déléguée aux utilisateurs avecrds_extension.

  • Toute extension prise en charge peut être ajoutée si l'utilisateur est autorisé à le faire. Pour ce faire, définissez le rds.allowed_delegated_extensions paramètre sur une chaîne de noms d'extension séparés par des virgules. En ajoutant une liste d'extensions à ce paramètre, vous identifiez explicitement les extensions que l'utilisateur ayant le rds_extension rôle peut installer.

  • Lorsqu'il est défini sur*, cela signifie que toutes les extensions répertoriées rds_allowed_extensions sont déléguées aux utilisateurs ayant rds_extension un rôle.

Pour en savoir plus sur la configuration de ce paramètre, consultezActivation de la prise en charge déléguée des extensions à un utilisateur.

rds_superutilisateur

rds.allowed_extensions

Ce paramètre permet au client de limiter les extensions qui peuvent être installées dans l'RDSinstance de base de données. Pour plus d'informations, consultez Restreindre l'installation des extensions Postgre SQL

"*"

Par défaut, ce paramètre est défini sur RDS « * », ce qui signifie que toutes les extensions prises en charge par Postgre SQL et Aurora Postgre SQL sont autorisées à être créées par les utilisateurs disposant des privilèges nécessaires.

Vide signifie qu'aucune extension ne peut être installée dans l'RDSinstance de base de données.

administrateur

rds-delegated_extension_allow_drop_cascade

Ce paramètre contrôle la capacité de l'utilisateur à supprimer l'extension rds_extension à l'aide d'une option en cascade.

off

Par défaut, la propriété rds-delegated_extension_allow_drop_cascade a la valeur off. Cela signifie que les utilisateurs ne rds_extension sont pas autorisés à supprimer une extension à l'aide de l'option en cascade.

Pour accorder cette capacité, le rds.delegated_extension_allow_drop_cascade paramètre doit être défini suron.

rds_superutilisateur

Désactiver le support pour l'extension déléguée

Éteindre partiellement

Les utilisateurs délégués ne peuvent pas créer de nouvelles extensions mais peuvent toujours mettre à jour les extensions existantes.

  • rds.allowed_delegated_extensionsRétablissez la valeur par défaut dans le groupe de paramètres du cluster de base de données.

  • Utilisez la commande suivante au niveau de la base de données :

    alter database database_name reset rds.allowed_delegated_extensions;
  • Utilisez la commande suivante au niveau de l'utilisateur :

    alter user user_name reset rds.allowed_delegated_extensions;
Éteindre complètement

La révocation du rds_extension rôle d'un utilisateur rétablira les autorisations standard de l'utilisateur. L'utilisateur ne peut plus créer, mettre à jour ou supprimer des extensions.

postgres => revoke rds_extension from user_name;
Exemple de déclencheur d'événement

Si vous souhaitez autoriser un utilisateur délégué rds_extension à utiliser des extensions qui nécessitent de définir des autorisations sur ses objets créés lors de la création de l'extension, vous pouvez personnaliser l'exemple de déclencheur d'événement ci-dessous et ajouter uniquement les extensions pour lesquelles vous souhaitez que les utilisateurs délégués aient accès à toutes les fonctionnalités. Ce déclencheur d'événement peut être créé sur template1 (le modèle par défaut). Par conséquent, toutes les bases de données créées à partir de template1 auront ce déclencheur d'événement. Lorsqu'un utilisateur délégué installe l'extension, ce déclencheur octroie automatiquement la propriété aux objets créés par l'extension.

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

Avantages de l'utilisation du support d'extension RDS délégué d'Amazon

En utilisant le support RDS délégué des extensions Amazon pour PostgreSQL, vous déléguez en toute sécurité la gestion des extensions à des utilisateurs qui n'ont pas le rds_superuser rôle. Cette fonctionnalité offre les avantages suivants :

  • Vous pouvez facilement déléguer la gestion des extensions aux utilisateurs de votre choix.

  • Cela ne nécessite pas de rds_superuser rôle.

  • Permet de prendre en charge différents ensembles d'extensions pour différentes bases de données dans le même cluster de bases de données.

Limitation de la prise en charge RDS déléguée des extensions Amazon pour Postgre SQL

  • Les objets créés pendant le processus de création de l'extension peuvent nécessiter des privilèges supplémentaires pour que l'extension fonctionne correctement.

  • Certaines extensions ne peuvent pas être gérées par l'utilisateur de l'extension déléguée par défaut, notamment les suivantes : log_fdw pg_cronpg_tle,pgactive,,pglogical,postgis_raster,postgis_tiger_geocoder,postgis_topology.

Autorisations requises pour certaines extensions

Pour créer, utiliser ou mettre à jour les extensions suivantes, l'utilisateur délégué doit disposer des privilèges nécessaires sur les fonctions, tables et schémas suivants.

Extensions nécessitant des droits de propriété ou des autorisations Fonction Tables Schema Dictionnaire de recherche de texte Comment

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

interdit

none

pg_partman

none

partitions temporelles personnalisées, part_config, part_config_sub

none

none

none

pg_stat_statements

none

none

none

none

none

Publier GIS

enveloppe st_tile

spatial_ref_sys

none

none

none

postgis_raster

none

none

none

none

none

postgis_topology

none

topologie, couche

topologie

none

l'utilisateur délégué doit être le propriétaire de la base de données

log_fdw

créer_table_foreign_pour_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

tigre

none

none

pg_freespacemap

pg_freespace

none

none

none

none

pg_visibility

pg_visibility

none

none

none

none

Considérations de sécurité

N'oubliez pas qu'un utilisateur doté d'un rds_extension rôle pourra gérer les extensions sur toutes les bases de données sur lesquelles il dispose du privilège de connexion. Si l'intention est d'avoir une extension déléguée de gestion des utilisateurs sur une seule base de données, il est recommandé de révoquer tous les privilèges publics sur chaque base de données, puis d'accorder explicitement le privilège de connexion pour cette base de données spécifique à l'utilisateur délégué.

Plusieurs extensions peuvent permettre à un utilisateur d'accéder aux informations de plusieurs bases de données. Assurez-vous que les utilisateurs que vous accordez rds_extension disposent de capacités interbases de données avant d'ajouter ces extensions àrds.allowed_delegated_extensions. Par exemple, postgres_fdw et dblink fournir des fonctionnalités permettant d'interroger des bases de données sur la même instance ou sur des instances distantes. log_fdwlit les fichiers journaux du moteur Postgres, qui concernent toutes les bases de données de l'instance et peuvent contenir des requêtes lentes ou des messages d'erreur provenant de plusieurs bases de données. pg_cronpermet d'exécuter des tâches d'arrière-plan planifiées sur l'instance de base de données et peut configurer des tâches pour qu'elles s'exécutent dans une autre base de données.

Supprimer la cascade d'extensions désactivée

La possibilité de supprimer l'option d'extension avec cascade par un utilisateur ayant le rds_extension rôle est contrôlée par un rds.delegated_extension_allow_drop_cascade paramètre. Par défaut, la propriété rds-delegated_extension_allow_drop_cascade a la valeur off. Cela signifie que les utilisateurs dotés du rds_extension rôle ne sont pas autorisés à supprimer une extension à l'aide de l'option en cascade, comme indiqué dans la requête ci-dessous.

DROP EXTENSION CASCADE;

Car cela supprimera automatiquement les objets qui dépendent de l'extension, et à leur tour tous les objets qui dépendent de ces objets. Toute tentative d'utilisation de l'option en cascade provoquera une erreur.

Pour accorder cette capacité, le rds.delegated_extension_allow_drop_cascade paramètre doit être défini suron.

La modification du paramètre rds.delegated_extension_allow_drop_cascade dynamique ne nécessite pas le redémarrage de la base de données. Vous pouvez le faire à l'un des niveaux suivants :

  • Dans le cluster ou le groupe de paramètres d'instance, via le AWS Management Console ouAPI.

  • À l'aide de la commande suivante au niveau de la base de données :

    alter database database_name set rds.delegated_extension_allow_drop_cascade = 'on';
  • À l'aide de la commande suivante au niveau de l'utilisateur :

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

Exemples d'extensions pouvant être ajoutées à l'aide de la prise en charge déléguée des extensions

  • 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