GRANT — Définir les droits d'accès
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ]nom_table
[, ...] | ALL TABLES IN SCHEMAnom_schéma
[, ...] } TOspécification_rôle
[, ...] [ WITH GRANT OPTION ] GRANT { { SELECT | INSERT | UPDATE | REFERENCES } (nom_colonne
[, ...] ) [, ...] | ALL [ PRIVILEGES ] (nom_colonne
[, ...] ) } ON [ TABLE ]nom_table
[, ...] TOspécification_rôle
[, ...] [ WITH GRANT OPTION ] GRANT { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCEnom_séquence
[, ...] | ALL SEQUENCES IN SCHEMAnom_schéma
[, ...] } TOspécification_rôle
[, ...] [ WITH GRANT OPTION ] GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASEnom_base
[, ...] TOspécification_rôle
[, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON DOMAINnom_domaine
[, ...] TOspécification_rôle
[, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPERnom_fdw
[, ...] TOspécification_rôle
[, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVERnom_serveur
[, ...] TOspécification_rôle
[, ...] [ WITH GRANT OPTION ] GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { { FUNCTION | PROCEDURE | ROUTINE }nom_routine
[ ( [ [mode_arg
] [nom_arg
]type_arg
[, ...] ] ) ] [, ...] | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMAnom_schéma
[, ...] } TOspécification_rôle
[, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGEnom_lang
[, ...] TOspécification_rôle
[, ...] [ WITH GRANT OPTION ] GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECTloid
[, ...] TOspécification_rôle
[, ...] [ WITH GRANT OPTION ] GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAnom_schéma
[, ...] TOspécification_rôle
[, ...] [ WITH GRANT OPTION ] GRANT { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACEtablespace_name
[, ...] TOspécification_rôle
[, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON TYPEnom_type
[, ...] TOspécification_rôle
[, ...] [ WITH GRANT OPTION ] GRANTnom_role
[, ...] TOspécification_rôle
[, ...] [ WITH ADMIN OPTION ] [ GRANTED BYspécification_rôle
] oùspécification_rôle
peut valoir : [ GROUP ]nom_rôle
| PUBLIC | CURRENT_USER | SESSION_USER
La commande GRANT
a deux variantes basiques : la première
donne des droits sur un objet de la base de données (table, colonne, vue,
table distante, séquence, base de données, wrapper de données distantes, serveur distant,
fonction, procédure, langage de procédure, schéma ou espace
logique), la seconde gère les appartenances à un rôle. Ces variantes sont
assez similaires mais somme toute assez différentes pour être
décrites séparément.
Cette variante de la commande GRANT
donne des droits
spécifiques sur un objet de la base de données a un ou plusieurs rôles.
Ces droits sont ajoutés à ceux déjà possédés, s'il y en a.
Il existe aussi une option pour donner les droits sur tous les objets d'un
même type sur un ou plusieurs schémas. Cette fonctionnalité n'est
actuellement proposée que pour les tables, séquences, fonctions et
procédures. ALL TABLES
affecte aussi les vues et tables
distantes, tout comme la commande GRANT
pour un objet
spécifique. ALL FUNCTIONS
affecte aussi les fonctions
d'agrégats mais pas les procédures, là-aussi tout comme la commande
GRANT
pour un objet spécifique.
Le mot clé PUBLIC
indique que les droits sont donnés à
tous les rôles, y compris ceux créés ultérieurement.
PUBLIC
peut être vu comme un groupe implicitement
défini qui inclut en permanence tous les rôles. Un rôle
particulier dispose de la somme des droits qui lui sont acquis en propre, des droits
de tout rôle dont il est membre et des droits donnés à PUBLIC
.
Si WITH GRANT OPTION
est précisé, celui qui reçoit le
droit peut le transmettre à son tour (NDT : par la suite on parlera
d'« option de transmission de droit », là où en
anglais il est fait mention de « grant options »).
Sans l'option GRANT, l'utilisateur ne peut pas le faire. Cette option ne
peut pas être donnée à PUBLIC
.
Il n'est pas nécessaire d'accorder des droits au propriétaire d'un objet (habituellement l'utilisateur qui l'a créé) car, par défaut, le propriétaire possède tous les droits. (Le propriétaire peut toutefois choisir de révoquer certains de ses propres droits.)
Le droit de supprimer un objet ou de modifier sa définition n'est pas configurable avec cette commande. Il est spécifique au propriétaire de l'objet. Ce droit ne peut ni être donné ni supprimé. Néanmoins, il est possible d'avoir le même effet en rendant un utilisateur membre du rôle qui possède cet object ou en le supprimant de ce rôle. Le propriétaire a aussi implicitement les options de transmission de droits pour l'objet.
PostgreSQL donne des droits par défaut sur certains types d'objets à
PUBLIC
. Aucun droit n'est donné à
PUBLIC
par défaut sur les tables
les colonnes de table,
les séquences,
les wrappers de données distantes,
les serveurs distants,
les large objects,
les schémas,
et les tablespaces.
Pour les autres types d'objets, les droits par défaut donnés et
tablespaces. Pour les autres types, les droits par défaut donnés à
PUBLIC
sont les suivants :
CONNECT
et TEMPORARY
(création de
tables temporaires) pour les bases de données ;
EXECUTE
pour les fonctions et procédures
stockées ; USAGE
pour les langages et les types de
données (incluant les domaines). Le propriétaire de l'objet peut, bien
sûr, utiliser REVOKE
pour enlever les droits par défaut
et les droits donnés après coup. (Pour un maximum de sécurité,
REVOKE
est lancé dans la même transaction que la
création de l'objet ; ainsi, il n'y a pas de laps de temps pendant
lequel un autre utilisateur peut utiliser l'objet.) De plus, cette
configuration des droits par défaut peut être modifiée en utilisant la
commande ALTER DEFAULT PRIVILEGES.
Les droits possibles sont :
SELECT
Autorise SELECT sur
toutes les colonnes, ou sur les colonnes listées spécifiquement, de
la table, vue ou séquence indiquée. Autorise aussi l'utilisation de
COPY TO.
De plus, ce droit est nécessaire pour référencer des valeurs de colonnes
existantes avec UPDATE
ou DELETE.
Pour les séquences, ce droit autorise aussi l'utilisation de la
fonction currval
.
Pour les « Large Objects », ce droit permet la lecture de
l'objet.
INSERT
Autorise INSERT d'une
nouvelle ligne dans la table indiquée. Si des colonnes spécifiques sont
listées, seules ces colonnes peuvent être affectées dans une commande
INSERT
, (les autres colonnes recevront par conséquent
des valeurs par défaut).
Autorise aussi COPY FROM.
UPDATE
Autorise UPDATE sur toute
colonne de la table spécifiée, ou sur les colonnes spécifiquement listées.
(En fait, toute commande UPDATE
non triviale nécessite
aussi le droit SELECT
car elle doit référencer les
colonnes pour déterminer les lignes à mettre à jour et/ou calculer les
nouvelles valeurs des colonnes.) SELECT ... FOR UPDATE
et SELECT ... FOR SHARE
requièrent également ce droit
sur au moins une colonne en plus du droit SELECT
.
Pour les séquences, ce droit autorise l'utilisation des fonctions
nextval
et setval
.
Pour les « Large Objects », ce droit permet l'écriture et le
tronquage de l'objet.
DELETE
Autorise DELETE d'une
ligne sur la table indiquée. (En fait, toute commande
DELETE
non triviale nécessite aussi le droit
SELECT
car elle doit référencer les colonnes pour
déterminer les lignes à supprimer.)
TRUNCATE
Autorise TRUNCATE sur la table indiquée.
REFERENCES
Ce droit est requis sur les colonnes de référence et les colonnes qui référencent pour créer une contrainte de clé étrangère. Le droit peut être accordé pour toutes les colonnes, ou seulement des colonnes spécifiques.
TRIGGER
Autorise la création d'un déclencheur sur la table indiquée. (Voir l'instruction CREATE TRIGGER.)
CREATE
Pour les bases de données, autorise la création de nouveaux schémas et de nouvelles publications dans la base de données.
Pour les schémas, autorise la création de nouveaux objets dans le schéma. Pour renommer un objet existant, il est nécessaire d'en être le propriétaire et de posséder ce droit sur le schéma qui le contient.
Pour les tablespaces, autorise la création de tables, d'index et de fichiers temporaires dans le tablespace et autorise la création de bases de données utilisant ce tablespace par défaut. (Révoquer ce privilège ne modifie pas l'emplacement des objets existants.)
CONNECT
Autorise l'utilisateur à se connecter à la base indiquée. Ce droit
est vérifié à la connexion (en plus de la vérification des restrictions
imposées par pg_hba.conf
).
TEMPORARY
TEMP
Autorise la création de tables temporaires lors de l'utilisation de la base de données spécifiée.
EXECUTE
Autorise l'utilisation de la fonction ou procédure indiquée et
l'utilisation de tout opérateur défini sur la fonction. C'est le seul
type de droit applicable aux fonctions et procédures. La syntaxe
FUNCTION
fonctionne aussi pour les fonctions
d'agrégat. De plus, vous pouvez utiliser ROUTINE
pour faire référence à une fonction, une fonction d'agrégat ou un
procédure.
USAGE
Pour les langages procéduraux, autorise l'utilisation du langage indiqué pour la création de fonctions. C'est le seul type de droit applicable aux langages procéduraux.
Pour les schémas, autorise l'accès aux objets contenus dans le schéma indiqué (en supposant que les droits des objets soient respectés). Cela octroie, pour l'essentiel, au bénéficiaire le droit de « consulter » les objets contenus dans ce schéma. Sans ce droit, il est toujours possible de voir les noms des objets en lançant des requêtes sur les tables système. De plus, après avoir révoqué ce droit, les processus serveur existants pourraient recevoir des requêtes qui ont déjà réalisé cette recherche auparavant, donc ce n'est pas un moyen complètement sécurisé d'empêcher l'accès aux objets.
Pour les séquences, ce droit autorise l'utilisation des fonctions
currval
et nextval
.
Pour les types et domaines, ce droit autorise l'utilisation du type ou du domaine dans la création de tables, procédures stockées et quelques autres objets du schéma. (Notez qu'il ne contrôle pas un « usage » général du type, comme les valeurs du type apparaissant dans les requêtes. Il empêche seulement les objets d'être créés s'ils dépendent de ce type. Le but principal de ce droit est de contrôler les utilisateurs pouvant créer des dépendances sur un type, ce qui peut empêcher le propriétaire de changer le type après coup.)
Pour des wrappers de données distantes, ce droit autorise la création de nouveaux serveurs utilisant ce wrapper.
Pour les serveurs, ce privilège autorise la création de tables étrangères utilisant le serveur. Les rôles recevant ce privilège pourraient également créer, modifier ou supprimer leurs propres correspondances d'utilisateurs associées à ce serveur.
ALL PRIVILEGES
Octroie tous les droits disponibles en une seule opération.
Le mot clé PRIVILEGES
est optionnel sous
PostgreSQL mais est requis dans le standard SQL.
Les droits requis par les autres commandes sont listés sur les pages de référence de ces commandes.
Cette variante de la commande GRANT
définit l'appartenance
d'un (ou plusieurs) rôle(s) à un autre. L'appartenance à un rôle est importante
car elle offre tous les droits accordés à un rôle à l'ensemble de ses membres.
Si WITH ADMIN OPTION
est spécifié, le membre peut à la
fois en octroyer l'appartenance à d'autres rôles, et la révoquer. Sans cette
option, les utilisateurs ordinaires ne peuvent pas le faire. Un rôle ne
dispose pas de l'option WITH ADMIN OPTION
lui-même mais il
peut donner ou enlever son appartenance à partir d'une session où l'utilisateur
correspond au rôle. Les superutilisateurs peuvent donner ou supprimer
l'appartenance à tout rôle. Les rôles disposant de l'attribut
CREATEROLE
peuvent donner ou supprimer l'appartenance à
tout rôle qui n'est pas un superutilisateur.
Si GRANTED BY
est utilisé, l'ajout du droit est enregistré
comme étant fait avec le rôle indiqué. Seuls les superutilisateurs peuvent
utiliser cette option, sauf quand le nom indiqué est le même que celui qui
exécute la commande.
Contrairement au cas avec les droits, l'appartenance à un rôle ne peut pas
être donné à PUBLIC
. Notez aussi que ce format de la
commande n'autorise pas le mot GROUP
dans spécification_rôle
.
La commande REVOKE est utilisée pour retirer les droits d'accès.
Depuis PostgreSQL 8.1, le concept des
utilisateurs et des groupes a été unifié en un seul type d'entité appelé
rôle. Il n'est donc plus nécessaire d'utiliser le mot clé
GROUP
pour indiquer si le bénéficiaire est un
utilisateur ou un groupe. GROUP
est toujours autorisé
dans cette commande mais est ignoré.
Un utilisateur peut exécuter des SELECT
,
INSERT
, etc. sur une colonne si il a le privilège soit sur
cette colonne spécifique, soit sur la table entière. Donner un privilège de
table puis le révoquer pour une colonne ne fera pas ce que vous pourriez
espérer : l'autorisation au niveau de la table n'est pas affectée par
une opération au niveau de la colonne.
Quand un utilisateur, non propriétaire d'un objet, essaie d'octroyer des
droits sur cet objet, la commande échoue si l'utilisateur
n'a aucun droit sur l'objet. Tant que des privilèges existent, la commande
s'exécute, mais n'octroie que les droits pour lesquels l'utilisateur dispose
de l'option de transmission.
Les formes GRANT ALL PRIVILEGES
engendrent un message d'avertissement
si aucune option de transmission de droit n'est détenue, tandis que les autres formes
n'engendrent un message que lorsque les options de transmission du privilège concerné
par la commande ne sont pas détenues. (Cela s'applique aussi au
propriétaire de l'objet, mais comme on considère toujours que ce dernier détient
toutes les options de transmission, le problème ne se pose jamais.)
Les superutilisateurs de la base de données
peuvent accéder à tous les objets sans tenir compte des droits qui les régissent.
Cela est comparable aux droits de root
sur un système
Unix. Comme avec root
, il est déconseillé d'opérer en tant que
superutilisateur, sauf en cas d'impérieuse nécessité.
Si un superutilisateur lance une commande GRANT
ou
REVOKE
, tout se passe comme si la commande était exécutée
par le propriétaire de l'objet concerné. Les droits octroyés par
cette commande semblent ainsi l'avoir été par le propriétaire de l'objet.
(L'appartenance à rôle, elle, semble être donnée par le rôle conteneur.)
GRANT
et REVOKE
peuvent aussi être
exécutées par un rôle qui n'est pas le propriétaire de l'objet considéré,
mais est membre du rôle propriétaire de l'objet, ou membre du rôle
titulaire du privilège WITH GRANT OPTION
sur cet objet.
Dans ce cas, les droits sont enregistrés comme donnés par le rôle
propriétaire de l'objet ou titulaire du privilège WITH GRANT
OPTION
. Par exemple, si la table t1
appartient
au rôle g1
, dont le rôle u1
est
membre, alors u1
peut donner les droits sur
t1
à u2
, mais ces droits apparaissent
octroyés directement par g1
. Tout autre membre du rôle
g1
peut les révoquer par la suite.
Si le rôle qui exécute GRANT
détient, de manière indirecte,
les droits souhaités à travers plus d'un niveau d'appartenance, il est difficile
de prévoir le rôle reconnu comme fournisseur du privilège. Dans de tels cas,
le meilleur moyen d'utiliser SET ROLE
est de devenir le rôle
qui doit octroyer les droits.
Donner un droit sur une table n'étend pas automatiquement les droits
sur les séquences utilisées par cette table, ceci incluant les
séquences liées par des colonnes de type SERIAL
. Les droits
sur les séquences doivent être donnés séparément.
La commande \dp
de psql permet
d'obtenir des informations sur les droits existants pour les tables et
colonnes, par exemple :
=> \z matable Access privileges Schema | Name | Type | Access privileges | Column access privileges --------+---------+-------+-----------------------+-------------------------- public | mytable | table | miriam=arwdDxt/miriam | col1: : =r/miriam : miriam_rw=rw/miriam : admin=arw/miriam (1 row)
Les entrées affichées par \dp
sont interprétées
ainsi :
rolename=xxxx -- privileges granted to a role =xxxx -- privileges granted to PUBLIC r -- SELECT ("lecture") w -- UPDATE ("écriture") a -- INSERT ("ajout") d -- DELETE D -- TRUNCATE x -- REFERENCES t -- TRIGGER X -- EXECUTE U -- USAGE C -- CREATE c -- CONNECT T -- TEMPORARY arwdDxt -- ALL PRIVILEGES (pour les tables, varie pour les autres objets) * -- option de transmission du privilège qui précède /yyyy -- role qui a donné le droit
L'exemple ci-dessus présente ce que voit l'utilisatrice
miriam
après la création de la table matable
et
l'exécution de :
GRANT SELECT ON matable TO PUBLIC; GRANT SELECT, UPDATE, INSERT ON matable TO admin; GRANT SELECT (col1), UPDATE (col1) ON matable TO miriam_rw;
Pour les objects non-tables, il y a d'autres commandes \d
qui peuvent afficher leurs privilèges.
Si la colonne « Access privileges » est vide pour un objet donné, cela
signifie que l'objet possède les droits par défaut (c'est-à-dire que la
colonne des droits est NULL). Les droits par défaut incluent toujours les
droits complets pour le propriétaire et peuvent inclure quelques droits pour
PUBLIC
en fonction du type d'objet comme cela est expliqué plus haut. Le
premier GRANT
ou REVOKE
sur un objet instancie les
droits par défaut (produisant, par exemple,
{=,miriam=arwdDxt/miriam}
) puis les modifie en fonction de la requête
spécifiée. Les entrées sont affichées en « Privilèges d'accès aux colonnes »
seulement pour les colonnes qui ont des privilèges différents de ceux par défaut.
(Notez que, dans ce but, « default privileges » signifie
toujours les droits par défaut inhérents au type de l'objet. Un objet dont
les droits ont été modifiés avec la commande ALTER DEFAULT
PRIVILEGES
sera toujours affiché avec une entrée de droit
effective qui inclut les effets de la commande ALTER
.)
Les options de transmission de privilèges implicites du propriétaire ne sont pas indiquées
dans l'affichage des droits d'accès. Une *
apparaît uniquement
lorsque les options de transmission ont été explicitement octroyées.
Donner le droit d'insertion à tous les utilisateurs sur la table
films
:
GRANT INSERT ON films TO PUBLIC;
Donner tous les droits possibles à l'utilisateur manuel
sur la vue
genres
:
GRANT ALL PRIVILEGES ON genres TO manuel;
Bien que la commande ci-dessus donne tous les droits lorsqu'elle
est exécutée par un superutilisateur ou par le propriétaire de
genres
, exécutée par quelqu'un d'autre, elle
n'accorde que les droits pour lesquels cet utilisateur possède l'option de transmission.
Rendre joe
membre de admins
:
GRANT admins TO joe;
Conformément au standard SQL, le mot clé PRIVILEGES
est requis dans ALL PRIVILEGES
. Le standard SQL
n'autorise pas l'initialisation des droits sur plus d'un objet par commande.
PostgreSQL autorise un propriétaire d'objet
à révoquer ses propres droits ordinaires : par exemple, le
propriétaire d'un objet peut le placer en lecture seule pour lui-même en
révoquant ses propres droits INSERT
,
UPDATE
, DELETE
et
TRUNCATE
. Le standard SQL
ne l'autorise pas. La raison en est que
PostgreSQL traite les droits du propriétaire
comme ayant été donnés par le propriétaire ; il peut, de ce fait, aussi les
révoquer. Dans le standard SQL, les droits du propriétaire sont donnés par
une entité « _SYSTEM ». N'étant pas « _SYSTEM », le propriétaire
ne peut pas révoquer ces droits.
D'après le standard SQL, les options de cette commande peuvent être données
à PUBLIC
; PostgreSQL supporte seulement l'ajout des
options de droits aux rôles.
Le standard SQL autorise l'utilisation de l'option GRANTED
BY
pour toutes les formes de GRANT
. PostgreSQL
l'accepte uniquement pour rendre un rôle membre d'un autre rôle, et même
là, seuls les superutilisateurs peuvent l'utiliser.
Le standard SQL fournit un droit USAGE
sur d'autres
types d'objet : jeux de caractères, collations, conversions.
Dans le standard SQL, seules les séquences ont un droit USAGE
qui contrôle l'utilisation de l'expression NEXT VALUE FOR
,
un équivalent de la fonction nextval
dans PostgreSQL.
Les droits SELECT
et UPDATE
des
séquences sont une extension de PostgreSQL. L'application du droit
USAGE
de la séquence à la fonction
currval
est aussi une extension PostgreSQL (comme l'est
la fonction elle-même).
Les droits sur les bases de données, tablespaces, langages, schémas et séquences sont des extensions PostgreSQL.