Les rôles
PostgreSQL gère les droits d'accès aux bases de données en utilisant le concept de rôles.
Bien que depuis la version 8.1 de PostgreSQL les deux concepts soient confondus, il est utile de distinguer :
les rôles de connexion : permettant de se connecter aux serveurs
les rôles de groupes permettant de gérer les droits d'accès aux bases et à leurs objets.
Conseil :
Comme nous allons le voir, une bonne démarche est d'affecter un rôle de connexion à 1 ou plusieurs rôles de groupe qui définissent ses droits.
Seuls les rôles disposant de l'attribut LOGIN peuvent être utilisé comme rôle de connexion :
Pour créer un rôle de connexion on utilisera en SQL :
CREATE ROLE nom LOGIN ;
(dans les anciennes versions on utilisait CREATE USER nom;
qui utilise LOGIN par défaut).
On peut, plus simplement, utiliser Rôle de connexion clic droit 'Créer un rôle de connexion'
dans pgAdmin.
nb : La saisie d'un mot de passe est obligatoire pour définir un rôle de connexion (onglet 'définition' sous pgAdmin).
Nous verrons un peu plus loin comment les ordres SQL, que l'on utilise ici à titre pédagogique, peuvent être construits avec les assistants de l'interface de pgAdmin. Il n'est donc pas utile de mémoriser précisément la syntaxe SQL. Nous mettrons en pratique ces notions avec un 'pas à pas' à l'aide de pgAdmin... ne soyez donc pas effrayé par l'apparente complexité de cette étape de présentation des concepts... la mise en pratique sur des cas relativement simple vous permettra d'y voir plus clair !
Conseil :
Comme indiqué au début de ce module il est nécessaire que le rôle de connexion dispose des droits de connexion qui sont contrôlés dans le fichier pg_hba.conf, sinon il ne pourra se connecter physiquement sur le serveur.
Méthode : Statut de superutilisateur
Les superutilisateurs ne sont pas pris en compte dans les vérifications des droits (ils outrepassent le système de droits), sauf pour le droit de connexion ou pour initier une réplication. C'est donc un droit dangereux. Il est préférable de faire la grande majorité du travail, avec un rôle qui n'est pas superutilisateur et de ne pas attribuer ce droit aux autres utilisateurs.
Pour donner un droit superutilisateur on utilisera en SQL :
CREATE ROLE nom SUPERUSER
;
Il faut avoir le droit SUPERUSER pour créer un nouveau superutilisateur.
Méthode : Droit de création de base de données
Les droits de création de bases doivent être explicitement données à un rôle (à l'exception des super-utilisateurs qui passent au travers de toute vérification de droits). Pour créer un tel rôle, utilisez en SQL :
CREATE ROLE nom_utilisateur CREATEDB
Méthode : Droit de création de rôle
Un rôle doit se voir explicitement donné le droit de créer d'autres rôles (à l'exception des super-utilisateurs qui passent au travers de toute vérification de droits). Pour affecter un tel droit, utilisez :
CREATE ROLE nom CREATEROLE
Un rôle disposant du droit CREATEROLE peut aussi modifier et supprimer d'autres rôles, ainsi que donner ou supprimer l'appartenance à ces rôles.
C'est donc un droit important, néanmoins, pour créer, modifier, supprimer ou changer l'appartenance à un rôle superutilisateur, le statut de superutilisateur est requis.
Méthode : Droit d'initier une réplication en flux
Un rôle doit se voir explicitement donné le droit d'initier une réplication en flux (sauf pour les superutilisateurs, puisqu'ils ne sont pas soumis aux vérifications de permissions). Un rôle utilisé pour la réplication en flux doit toujours avoir le droit LOGIN. Pour affecter un tel droit, utilisez :
CREATE ROLE nom REPLICATION LOGIN
.
En pratique on n'utilisera généralement pas ce droit (lié à la réplication entre bases) pour les besoins courant des services.
Méthode : Mot de passe
Un mot de passe est significatif si la méthode d'authentification du client exige que le client fournisse un mot de passe quand il se connecte à la base (voir le paragraphe ‘Connexions' en début de ce module et la gestion du fichier pg_hba.conf). En SQL, on peut indiquer un mot de passe lors de la création d'un rôle avec :
CREATE ROLE nom_utilisateur PASSWORD 'le_mot_de_passe'
Conseil : Bonne pratique pour la création des rôles
Une bonne pratique est de créer un rôle qui dispose des droits CREATEDB (création de base) et CREATEROLE (création de nouveaux rôles) mais qui n'est pas un superutilisateur, et d'utiliser ce rôle pour toute la gestion des bases de données et des rôles. Cette approche évite les dangers encourus en travaillant en tant que superutilisateur pour des tâches qui n'ont pas besoin de cet état.
Méthode : Appartenance d'un rôle
Un rôle de groupe est un rôle sans attribut LOGIN
(en réalité un rôle qui a le privilège LOGIN peut aussi être un groupe, mais nous n'utiliserons pas cette possibilité dans ce cours).
exemple :
CREATE ROLE producteur
;
On peut lui ajouter des membres en utilisant GRANT et REVOKE :
Exemple :
GRANT producteur to user1
;
Les rôles membres (ici user1) qui ont l'attribut INHERIT peuvent utiliser automatiquement les droits des rôles dont ils sont membres.
Ici si user1 a été crée par la commande CREATE ROLE user1 LOGIN INHERIT ;
héritera des droits du rôle producteur dont il est devenu membre par l'ordre GRANT.
Attention :
Si un utilisateur n'est pas créé avec l'attribut INHERIT, il n'hérite pas par défaut des privilèges des groupes dont il est membre. L'ordre SET ROLE permet de lui accorder pour la session en cours les privilèges d'un rôle de groupe dont il est membre.
Exemple : si users1 est membre de groupeproducteur, il disposera des privilèges du groupe pour la session en cours avec :
SET ROLE groupeproducteur ;
On peut révoquer les droits avec REVOKE.
REVOKE producteur FROM user1 ;
Complément : Documentation
La notion de rôle est très souple, on consultera la documentation pour voir les détails des différentes possibilités de mise en œuvre.