35.4. Règles et droits
À cause de la réécriture des requêtes par le système de règles de
PostgreSQL™, d'autres
tables/vues que celles utilisées dans la requête originale pourraient
être accédées. Lorsque des règles de mise à jour sont utilisées, ceci
peut inclure des droits d'écriture sur les tables.
Les règles de réécriture n'ont pas de propriétaire séparé. Le
propriétaire d'une relation (table ou vue) est automatiquement le
propriétaire des règles de réécriture qui lui sont définies. Le
système de règles de PostgreSQL™ modifie le comportement du
système de contrôle d'accès par défaut. Les relations qui sont
utilisées à cause des règles se voient vérifier avec les droits du
propriétaire de la règle, et non avec ceux de l'utilisateur appelant
cette règle. Ceci signifie qu'un utilisateur a seulement besoin des
droits requis pour les tables/vues qu'il nomme explicitement dans ses
requêtes.
Par exemple : un utilisateur a une liste de numéros de téléphone dont
certains sont privés, les autres étant d'intérêt pour la secrétaire
du bureau. Il peut construire de cette façon :
CREATE TABLE phone_data (person text, phone text, private boolean);
CREATE VIEW phone_number AS
SELECT person, phone FROM phone_data WHERE NOT private;
GRANT SELECT ON phone_number TO secretary;
Personne sauf lui (et les superutilisateurs de la base de données) ne
peut accéder à la table phone_data. mais, à
cause du
grant
, la
secrétaire peut lancer un
select
sur la vue phone_number. le système de règles réécrira le
select
sur phone_number en un
select
sur phone_data et ajoutera la qualification que seules les
entrées non privées (donc où private est
faux) sont désirées. comme l'utilisateur est le propriétaire de
phone_number et du coup le propriétaire de
la règle, le droit de lecture de phone_data
est maintenant vérifié avec ses propres privilèges et la requête est
autorisée. La vérification de l'accès à phone_number est aussi réalisée mais ceci est fait
avec l'utilisateur appelant, donc personne sauf l'utilisateur et la
secrétaire ne peut l'utiliser.
Les droits sont vérifiés règle par règle. Donc, la secrétaire est
actuellement la seule à pouvoir voir les numéros de téléphone
publiques. Mais la secrétaire peut configurer une autre vue et
autoriser l'accès au public. Du coup, tout le monde peut voir les
données de phone_number via la vue de la
secrétaire. ce que la secrétaire ne peut pas faire est de créer une
vue qui accède directement à phone_data (en
fait, elle le peut mais cela ne fonctionnera pas car tous les accès
seront refusés lors de la vérification des droits). Dès que
l'utilisateur s'en rendra compte, du fait que la secrétaire a ouvert
la vue phone_number à tout le monde, il peut
révoquer son accès. Immédiatement, tous les accès de la vue de la
secrétaire échoueront.
Il pourrait être dit que cette vérification règle par règle est une
brèche de sécurité mais ce n'est pas le cas. Si cela ne fonctionne
pas de cette façon, la secrétaire pourrait copier une table avec les
mêmes colonnes que phone_number et y copier
les données une fois par jour. du coup, ce sont ces propres données
et elle peut accorder l'accès à tout le monde si elle le souhaite.
Une commande
grant
signifie « j'ai confiance en
vous ». si quelqu'un en qui vous avez confiance se
comporte ainsi, il est temps d'y réfléchir et d'utiliser
revoke
.
Ce mécanisme fonctionne aussi pour les règles de mise à jour. Dans
les exemples de la section précédente, le propriétaire des tables de
la base de données d'exemple pourrait accorder les droits select, insert, update et delete sur la vue
lacet à quelqu'un d'autre mais seulement
select sur lacet_log. l'action de la règle pourrait écrire des
entrées de trace qui seraient toujours exécutées avec succès et que
l'autre utilisateur pourrait voir. Mais il ne peut pas créer
d'entrées fausses, pas plus qu'il ne peut manipuler ou supprimer
celles qui existent.