Généralités sur les droits et les rôles avec PostgreSQL

Les mécanismes d’ASGARD mettent à profit et déclinent les possibilités offertes par PostgreSQL en matière de gestion des droits et, plus largement, d’administration des bases de données. Ils ne remettent pas en cause les règles de gestion des droits sous PostgreSQL. En particulier, si une opération était interdite sans ASGARD pour cause de permissions insuffisantes, elle ne sera pas davantage autorisée avec ASGARD.

Dans cette partie sont rappelées quelques notions de gestion des droits sous PostgreSQL qui s’avèrent particulièrement importantes dans le contexte d’ASGARD.

Complément

Pour de plus amples informations, on pourra se reporter :

  • à la documentation de PostgreSQL, notamment ses parties consacrées aux droits et aux rôles ;

  • au support pédagogique de la formation à distance PostgreSQL/PostGIS publié sur Géoinformations, notamment son module 2.

Prérogatives du propriétaire

Le rôle désigné comme propriétaire d’un objet (schéma, table…) est seul habilité à supprimer cet objet (DROP) ou modifier sa définition (commande ALTER, ou CREATE OR REPLACE sur un objet pré-existant). Ces droits sont intrinsèques à la propriété – ils ne peuvent ni être conférés à d’autres, ni être révoqués.

PostgreSQL permet cependant au propriétaire d’attribuer d’autres privilèges aux rôles qu’il souhaite sur les objets qui lui appartiennent : droit d’accéder à l’objet (dans le cas d’un schéma, par exemple), de l’utiliser (par exemple pour une fonction), de voir ou de modifier les données qu’il contient (dans le cas d’une table ou assimilé), etc.

Remarque

À noter que beaucoup d'actions qui ne peuvent être effectuées que par le propriétaire d'un objet requièrent de disposer également d'autres privilèges. Par exemple, supprimer un schéma impose à la fois d'en être le propriétaire et d'être habilité à gérer les schémas de la base (privilège CREATE sur la base).

Rôle de connexion et rôle de groupe

ASGARD adopte l’organisation habituelle suivante :

L’administrateur définit des rôles de connexion (attribut LOGIN), qui permettent aux utilisateurs de se connecter à la base, et des rôles de groupe (attribut NOLOGIN).

Conseil

Les droits sur les objets sont exclusivement accordés aux rôles de groupe.

Dans cet esprit, un rôle de connexion ne reçoit pas de droit direct, mais il hérite des droits du ou des rôles de groupe auxquels il appartient.

Attributs CREATEROLE et CREATEDB

Comme l’attribut LOGIN mentionné au paragraphe précédent, les attributs CREATEROLE et CREATEDB peuvent être conférés à un rôle au moment de sa création ou, a posteriori, en modifiant sa définition (par une commande ALTER ROLE).

Un rôle disposant de l’attribut CREATEROLE peut gérer les rôles : octroyer ou révoquer l’appartenance d’un rôle à un autre, créer de nouveaux rôles, modifier les attributs des rôles existants et supprimer des rôles (tout ceci hors rôles super-utilisateurs).

Pour sa part, l’attribut CREATEDB est nécessaire pour créer des bases de données, modifier leur nom et leur propriétaire, ou encore les supprimer.

L’administrateur de données localisées (ADL) du service est pleinement légitime à disposer de ces deux attributs, cependant ils ne doivent pas être délégués à la légère à d’autres utilisateurs. En particulier, on retiendra qu’un rôle doté de CREATEROLE peut théoriquement agir sur tous les objets dont le propriétaire n’est pas un super-utilisateur simplement en se rendant membre de leur rôle propriétaire.

Au contraire des droits sur les objets, un rôle n’hérite pas directement des attributs des rôles de groupe dont il est membre.

Exemple

Si le rôle de connexion C est membre du rôle de groupe G, il doit explicitement endosser le rôle G pour bénéficier des attributs de ce dernier :

SET ROLE role_g ;

Il n’a alors plus accès à ses propres attributs jusqu’à ce qu’il réalise l’opération inverse :

SET ROLE role_c ;

… ou encore

RESET ROLE ;

Ainsi, il est souvent préférable de conférer directement les attributs CREATEDB et CREATEROLE aux rôles de connexion des utilisateurs concernés, d’autant que ceux-ci se doivent de rester très peu nombreux.

Conseil

Pour autoriser à un utilisateur à créer des rôles ou des bases, on donne à son rôle de connexion l’attribut CREATEROLE ou, respectivement, l’attribut CREATEDB.

Exemple

Pour habiliter le rôle de connexion jon.snow à gérer les rôles :

ALTER ROLE "jon.snow" WITH CREATEROLE ;