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
Rubriques
- Activation de la prise en charge déléguée des extensions à un utilisateur
- Configuration utilisée pour la prise en charge RDS déléguée des extensions pour Postgre SQL
- Désactiver le support pour l'extension déléguée
- Avantages de l'utilisation du support d'extension RDS délégué d'Amazon
- Limitation de la prise en charge RDS déléguée des extensions Amazon pour Postgre SQL
- Autorisations requises pour certaines extensions
- Considérations de sécurité
- Supprimer la cascade d'extensions désactivée
- Exemples d'extensions pouvant être ajoutées à l'aide de la prise en charge déléguée des extensions
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 :
-
Accorder un
rds_extension
rôle à un utilisateur — Connectez-vous à la base de données en tant querds_superuser
et exécutez la commande suivante :Postgres => grant rds_extension to
user_name
; -
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'aiderds.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. -
-
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. Ilsrds_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 |
---|---|---|---|---|
|
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 |
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 |
|
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 |
|
Ce paramètre contrôle la capacité de l'utilisateur à supprimer l'extension |
off |
Par défaut, la propriété Pour accorder cette capacité, le |
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_extensions
Ré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_cron
pg_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_fdw
lit 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_cron
permet 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