utilisateurs et droits

Formation administration PostgreSQL
Logo de PostgreSQL on ne passe pas librement partout !

Les utilisateurs et les droits

Les rôles

Le concept des rôles comprends les concepts des utilisateurs et des groupes. Dans les versions de PostgreSQL antérieures à la 8.1, les utilisateurs et les groupes étaient des types d'entité distincts mais, maintenant, ce ne sont que des rôles. Tout rôle peut agir comme un utilisateur, un groupe ou les deux.

Il est parfois utile de maintenir une correspondance entre utilisateurs du système d'exploitation et rôles sur la base de données, mais ceci n'a rien d'obligatoire. Sous Unix, par défaut un utilisateur postgres est créé ainsi qu'un compte postgres administrateur de la base de données et des fichiers liés à son installation.

Un rôle possédant plusieurs rôles est un groupe de rôles.

Les rôles

Les valeurs par défaut font qu'il n'est pas possible de se connecter sur un rôle défini. Il ne faudra pas oublier de positionner l'option LOGIN pour un rôle destiné à permettre la connexion. La fonction CREATE USER peut être utilisée à la place de CREATE ROLE car la seule différence est qu'elle active le mode LOGIN par défaut.

Il existe également d'autres options qui, pour la plupart, ne sont là que pour des raisons de compatibilité avec les versions antérieures.

Les rôles

Les rôles

La table pg_roles contient les informations sur les différents rôles, ainsi il est possible de les consulter par :

SELECT * FROM pg_roles;

La possibilité de détruire simultanément plusieurs rôles est une extension de le nome SQL.

Personnalisation des rôles

Il est possible d'attribuer des paramètres à un rôle dans une base de donnée particulière comme illustré dans ce dernier exemple. Ceci se fait par la directive IN DATABASE db_name. Dans le cas où aucune base de données n'est visée le paramètre portera sur l'ensemble des bases de données du cluster.

Autoriser l'accès

Le fichier de configuration pg_hba.conf est défini dans postgres.conf.

Un autre blocage pour les connexions réseau peut être présent dans le fichier postgres.conf, car il contient la directive listen_addresses indiquant quelles sont les adresses à écouter. La valeur listen_addresses = '*' validera toutes les interfaces réseau. Il est également possible de modifier l'adresse du port d'écoute qui par défaut est 5432, ainsi que le nombre maximal de connexions simultanées.

Autoriser l'accès

Le fichier pg_hba.conf est parcouru progressivement pour chaque type d'accès, chaque utilisateur et chaque cluster. Le premier en correspondance interrompra le parcours et le mode d'accès correspondant sera utilisé. Il est donc possible de configurer finement les droits pour chaque utilisateur.

Le mode trust ne devrait pas être utilisé en dehors des connections locales : socket UNIX et localhost.

Lors de la définition d'un mot de passe, si le système reconnaît une chaîne de caractères conforme à l'un de ses algorithmes de chiffrement, celle-ci sera insérée telle qu'elle est fournie dans colonne rolpassword de la table pg_authid, dans le cas contraire elle sera hachée par l'algorithme précisé par la variable password_encryption.

Autoriser l'accès

Exemple de fichier pg_hba.conf

Le mot clef all permet de dire que tous les éléments sont concernés. Il peut se substituer aux connexions, aux bases de données et aux utilisateurs.

Les droits

En fonction du type d'objet visé, la syntaxe de ALTER sera différente. Par exemple pour modifier le propriétaire d'une table il faudra utiliser ALTER TABLE ma_table OWNER TO mon_utilisateur;.

Les droits

La modification explicite du rôle par SET ROLE user_source entraînera que l'identité effectivement utilisée sera user_source tandis que la modification implicite conservera l'identité user_cible. Ceci se constate facilement en créant un élément qui appartiendra au rôle l'ayant créé.

Le mode INHERIT est positionné par défaut lors de la création d'un rôle.

Les héritages de rôles sont stockés dans la table pg_auth_members sous forme d'OID.

Les types de droits

Les types de droits

nomdescription
SELECTAutorise SELECT et COPY TO sur la table ou la colonne de table indiquée.
INSERTAutorise INSERT et COPY FROM sur la table ou la colonne de table indiquée.
UPDATEAutorise UPDATE sur la table ou la colonne de table indiquée. Sera aussi nécessaire pour SELECT FOR UPDATE et SELECT FOR SHARE
DELETEAutorise DELETE sur la table ou la colonne de table indiquée.
TRUNCATEAutorise TRUNCATE sur la table indiquée.
REFERENCESAutorise une table ou une colonne de table à servir de référence pour une contrainte de clef étrangère
TRIGGERAutorise la création d'un déclencheur sur la table indiquée
CONNECTAutorise l'utilisateur à se connecter à la base indiquée
EXECUTEAutorise l'utilisation de la fonction indiquée et l'utilisation de tout opérateur défini sur cette fonction

Les types de droits

nomdescription
CREATESur bases de données : autorise la création de nouveaux schémas
Sur schémas : autorise la création de nouvelles table, vues, ...
Sur tablespaces : autorise la création de tables, d'index et de fichiers temporaires
TEMPORARYAutorise la création de tables temporaires dans de la base de données
USAGEsur langages procéduraux : autorise l'utilisation du langage pour la création de fonctions
sur schémas : autorise l'accès aux objets contenus dans le schéma indiqué
sur séquences : autorise l'utilisation des fonctions currval et nextval
ALL PRIVILEGESDonne tous les droits disponibles en une seule opération

Le droit d'écriture dans un schéma ne donne pas le droit de lecture sur celui-ci. Ainsi un utilisitateur disposant de CREATE mais pas de USAGE peut créer une table sans pouvoir consulter les données écrites par la suite. C'est le principe de la boîte aux lettres.

À propos de la transmission des droits

Le mécanisme de propagation des droits est également accessible pour les rôles par l'utilisation de la commande suivante :

GRANT user_source TO user_cible WITH ADMIN OPTION;
GRANT ROLE

Cette affectation permettra à user_cible de transmettre les droits sur user_source à un autre utilisateur.

Les droits par défaut

Les droits par défaut sont enregistrés dans la table système pg_default_acl.

Le rôle PUBLIC

Les politiques de sécurité par ligne

Si l'utilisateur n'est pas précisé c'est le rôle PUBLIC qui sera visé.

Si le mode n'est pas précisé tous les droits seront visés (équivalent de FOR ALL).

Stockage des droits et des rôles

Bien qu'il ne soit pas nécessaire d'intervenir directement sur les tables systèmes, on peut constater que les ACL sont écrites sous forme d'un tableau à une dimension contenant des indications de la forme {"lespostgres=arwdDxt/postgres","toto=r/postgres"}. La table pg_shdepend maintient les dépendances entre les divers objets de la base de données, et pour pouvoir supprimer, par exemple, un rôle il faudra s'assurer que celui-ci n'est plus présent dans cette relation.

Les tables destinées au stockage des rôles (pg_authid, pg_auth_members...) sont placées dans l'espace global et donc dans le tablespace pg_global.

Stockage des droits et des rôles

Par exemple la table villes ayant les droits de lecture sur PUBLIC et tous les droits sur role1 attribués par postgres présentera dans la colonne relacl de la table pg_class le contenu suivant :

SELECT relacl,relname FROM pg_class WHERE relname = 'villes';
                relacl                | relname
--------------------------------------+---------
 {=r/postgres,role1=arwdDxt/postgres} | villes
(1 ligne)

Pour obtenir de l'aide

Sur le site officiel de PostgreSQL :

Aide interne par psql :

Pour obtenir de l'aide

Quelques commandes d'audit :

Pour obtenir de l'aide