GRANT
GRANT — Définir les droits d'accès
Synopsis
GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] nomtable [, ...]
TO { nomutilisateur | GROUP nomgroupe | PUBLIC } [, ...] [ WITH
GRANT OPTION ]
GRANT { { USAGE | SELECT | UPDATE }
[,...] | ALL [ PRIVILEGES ] }
ON SEQUENCE nomséquence [, ...]
TO { nomutilisateur | GROUP nomgroupe | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE nombase [, ...]
TO { nomutilisateur | GROUP nomgroupe | PUBLIC } [, ...] [ WITH
GRANT OPTION ]
GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON FUNCTION nomfonction ( [ [ modearg ] [ nomarg ] typearg [, ...] ] ) [, ...]
TO { nomutilisateur | GROUP nomgroupe | PUBLIC } [, ...] [ WITH
GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE nomlangage [, ...]
TO { nomutilisateur | GROUP nomgroupe | PUBLIC } [, ...] [ WITH
GRANT OPTION ]
GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
ON SCHEMA nomschéma [, ...]
TO { nomutilisateur | GROUP nomgroupe | PUBLIC } [, ...] [ WITH
GRANT OPTION ]
GRANT { CREATE | ALL [ PRIVILEGES ] }
ON TABLESPACE nomespacelogique [, ...]
TO { nomutilisateur | GROUP nomgroupe | PUBLIC } [, ...] [ WITH
GRANT OPTION ]
GRANT role [, ...] TO nomutilisateur [, ...] [ WITH ADMIN OPTION ]
Description
La commande
GRANT
a
deux variantes basiques : la première donne des droits sur un objet
de la base de données (table, vue, séquence, base de données,
fonction, 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.
A partir de PostgreSQL™ 8.1,
les concepts d'utilisateurs et de groupes ont été unifiés en un
seul type d'entité appelé rôle. Il n'est ainsi plus nécessaire
d'utiliser le mot clé GROUP pour préciser
si celui à qui le droit est donné est un utilisateur ou un groupe.
GROUP est toujours accepté dans la
commande, mais est devenu inutile.
GRANT sur les objets de la base de données
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.
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 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 décrit par un droit transmissible ; il est
inhérent au propriétaire et ne peut être ni donné ni enlevé. Le
propriétaire possède également toutes les options de transmission
de droits sur cet objet.
En fonction du type de l'objet, les privilèges initiaux par
défaut peuvent inclure la transmission de certains privilèges à
PUBLIC. Par défaut, aucun accès public
n'est accordé sur les tables, schémas et tablespaces ; le droit
de création de table CONNECT et
TEMP est accordé sur les bases de
données ; le droit EXECUTE sur les
fonctions ; et le droit USAGE sur les
langages. Le propriétaire de l'objet peut évidemment choisir de
révoquer ces droits. (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.)
Les droits possibles sont :
-
SELECT
-
Autorise SELECT sur toutes les colonnes de la table,
vue ou séquence indiquée. Autorise aussi l'utilisation de
COPY
TO. Pour les séquences, ce droit autorise aussi
l'utilisation de la fonction currval.
-
INSERT
-
Autorise INSERT d'une nouvelle ligne dans la table
indiquée. Autorise aussi COPY FROM.
-
UPDATE
-
Autorise UPDATE sur toute colonne de la table indiquée.
SELECT ... FOR UPDATE et
SELECT ... FOR SHARE requièrent
également ce droit (en plus du droit SELECT). Pour les séquences, ce droit
autorise l'utilisation des fonctions nextval et setval.
-
DELETE
-
Autorise DELETE d'une ligne sur la table indiquée.
-
REFERENCES
-
Ce privilège est requis sur la table de référence et la
table qui référence pour créer une contrainte de clé
étrangère.
-
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 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 et
d'index 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.
-
EXECUTE
-
Autorise l'utilisation de la fonction indiquée et
l'utilisation de tout opérateur défini sur cette fonction.
C'est le seul type de droit applicable aux fonctions.
(Cette syntaxe fonctionne aussi pour les fonctions
d'agrégat.)
-
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.
-
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.
GRANT sur les rôles
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. Toutefois, les
superutilisateurs peuvent donner ou enlever à tout rôle
l'appartenance à un rôle. Les rôles qui possèdent le droit
CREATEROLE peuvent agir ainsi sur tout
rôle qui n'est pas superutilisateur.
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.
Notes
La commande REVOKE est utilisée pour retirer les droits d'accès.
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.
Actuellement, PostgreSQL™ ne
permet pas d'attribuer ou de révoquer des droits sur les colonnes
individuelles d'une table. Une manière de mimer ce comportement
consiste à créer une vue composée des colonnes désirées et
d'attribuer les droits sur cette vue.
La commande
\z
de
psql(1) permet d'obtenir des informations sur
les droits existants, par exemple :
=> \z matable
Access privileges for database "lusitania"
Schema | Name | Type | Access privileges
--------+---------+-------+-----------------------------------------------------------
public | matable | table | {miriam=arwdxt/miriam,=r/miriam,"group todos=arw/miriam"}
(1 row)
Les entrées affichées par
\z
sont interprétées ainsi :
=xxxx -- droits donnés à PUBLIC
uname=xxxx -- droits donnés à un utilisateur
group gname=xxxx -- droits donnés à un groupe
r -- SELECT ("lecture")
w -- UPDATE ("écriture")
a -- INSERT ("ajout")
d -- DELETE
x -- REFERENCES
t -- TRIGGER
X -- EXECUTE
U -- USAGE
C -- CREATE
c -- CONNECT
T -- TEMPORARY
arwdxt -- ALL PRIVILEGES (pour les tables)
* -- option de transmission du privilège qui précède
/yyyy -- utilisateur 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 GROUP todos;
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=arwdxt/miriam}) puis les modifie
en fonction de la requête spécifiée.
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.
Exemples
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;
Compatibilité
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 et
DELETE. 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.
Le standard SQL autorise l'initialisation de droits pour des
colonnes spécifiques à l'intérieur d'une table :
GRANT droits
ON table [ ( colonne [, ...] ) ] [, ...]
TO { PUBLIC | nomutilisateur [,
...] } [ WITH GRANT OPTION ]
Le standard SQL fournit un droit USAGE sur
d'autres types d'objet : jeux de caractères, collations,
conversions, domaines.
Les droits sur les bases de données, tablespaces, langages, schémas
et séquences sont des extensions PostgreSQL™.