MTES-MCT / asgard-postgresql

ASGARD. Système de gestion des droits pour PostgreSQL.
https://snum.scenari-community.org/Asgard/Documentation/co/SiteReference.html
Other
2 stars 3 forks source link

Interdire le référencement des schémas système #14

Closed alhyss closed 1 month ago

alhyss commented 1 year ago

La documentation indique que les "schémas système" - en pratique les schémas pg_catalog, pg_temp(...), pg_toast(...), public, information_schema et topology - ne peuvent pas être référencés par Asgard. C'est un principe important pour Asgard, car il assure que son système de gestion des droits n'interfèrera pas avec les mécanismes mis en place automatiquement par PostgreSQL et la plupart des extensions (sauf celles qui créent des schémas spécifiques non inclus dans la liste).

En pratique, cela se manifeste par le fait que :

Autrement dit, toutes les fonctions utilitaires s'assurent de ne pas référencer ou interférer avec les schémas système.

Par contre, il reste aujourd'hui possible de forcer manuellement le référencement d'un de ces schémas :

INSERT INTO z_asgard.gestion_schema_usr (nom_schema, producteur, creation) VALUES
    ('public', 'g_admin', True) ;

Messages renvoyés :

NOTICE:  [table de gestion] Le nom du schéma public ne respecte pas la nomenclature.
NOTICE:  (schéma public pré-existant)
NOTICE:  attribution de la propriété du schéma et des objets au rôle producteur du schéma public :
NOTICE:  > ALTER SCHEMA public OWNER TO g_admin
INSERT 0 1

Il serait souhaitable d'interdire strictement cette opération :

alhyss commented 1 year ago

Pour mémoire, le problème a été identifié parce qu'un service utilisateur qui se trouvait avoir référencé le schéma public de sa base dans la table de gestion d'Asgard a pour cette raison constaté des erreurs (heureusement bénignes) à la restauration de sa base, et AsgardManager ne fonctionnait plus non plus sur cette base.

alhyss commented 1 month ago

La contrainte sur gestion_schema et le contrôle dans z_asgard_admin.asgard_on_modify_gestion_schema_before() ont tous deux été implémentés dans la v1.4.1.