Re: Utilisation de drop owned ou reassign owned

From: Guillaume Lelarge <guillaume(at)lelarge(dot)info>
To: Marc Jacquin <marc(dot)jacquin(at)magellium(dot)fr>
Cc: "'pgsql-fr-generale(at)postgresql(dot)org'" <pgsql-fr-generale(at)postgresql(dot)org>
Subject: Re: Utilisation de drop owned ou reassign owned
Date: 2010-03-27 01:48:02
Message-ID: 4BAD63D2.4000808@lelarge.info
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Le 26/03/2010 21:51, Marc Jacquin a écrit :
> Merci Guillaume pour ces infos.
>
> En réalité on peut considérer que l'utilisateur qui fait le drop owned est
> le 'manager' d'un groupe et qu'il supprime ou créé un utilisateur de ce
> groupe mais avant de le faire supprime ou réassigne les données de
> l'utilisateur.
>
> L'utilisateur qui exécute est donc par essence membre du groupe dont
> l'utilisateur à supprimer est aussi. Pour tout dire, le manager créé
> l'utilisateur et lui donne le rôle du même groupe que lui-même et cherche à
> le supprimer après. Une délégation d'administration sur un groupe en
> quelques sortes.
>
> Donc il y a un rôle de groupe toto un role de connexion toto_mgr qui a le
> droit CREATEROLE et INHERIT et un utilisateur lambda toto2.
>
> Mon 'manager' a le droit INHERIT mais le problème reste entier, toto_mgr ne
> peut pas faire un drop owned sur toto2.
>
> Est-ce que le role de groupe toto doit hériter d'un groupe qui a les droits
> superuser ?
>

Une explication plus détaillée :

guillaume(at)laptop:~$ psql postgres
psql (8.4.3)
Saisissez « help » pour l'aide.

postgres=# CREATE USER u1 CREATEROLE;
CREATE ROLE
postgres=# CREATE USER u2 CREATEUSER;
CREATE ROLE
postgres=# CREATE USER u3;
CREATE ROLE
postgres=# CREATE DATABASE b1;
CREATE DATABASE
postgres=# \c b1 u3
psql (8.4.3)
Vous êtes maintenant connecté à la base de données « b1 » comme
utilisateur « u3 ».
b1=> CREATE TABLE t1 ();
CREATE TABLE

J'ai donc trois utilisateurs, leur différence étant dans le droit de
création d'utilisateurs (CREATEROLE, CREATEUSER et NOCREATEROLE). u3 est
propriétaire de la table t1.

b1=> \c b1 u1
psql (8.4.3)
Vous êtes maintenant connecté à la base de données « b1 » comme
utilisateur « u1 ».
b1=> DROP USER u3;
ERREUR: le rôle « u3 » ne peut pas être supprimé car d'autres objets en
dépendent
DÉTAIL: propriétaire de table t1
INSTRUCTION : DROP USER u3;
b1=> DROP OWNED BY u3;
ERREUR: droit refusé pour supprimer les objets
INSTRUCTION : DROP OWNED BY u3;

Tout à fait logiquement, u1, bien qu'ayant le droit de créer des
utilisateurs, ne peut pas les supprimer s'ils sont propriétaires
d'objets, et ne peut pas supprimer les objets qu'ils ont créé.

b1=> \c b1 u2
psql (8.4.3)
Vous êtes maintenant connecté à la base de données « b1 » comme
utilisateur « u2 ».
b1=# DROP USER u3;
ERREUR: le rôle « u3 » ne peut pas être supprimé car d'autres objets en
dépendent
DÉTAIL: propriétaire de table t1
INSTRUCTION : DROP USER u3;
b1=# DROP OWNED BY u3;
DROP OWNED

u2 a la droit de supprimer les objets de u1 car il a le droit CREATEUSER
(qui est l'équivalent de SUPERUSER). Donc bien différencier CREATEUSER
et CREATEROLE, ce n'est pas la même chose.

b1=# GRANT u3 TO u1;
GRANT ROLE
b1=# \c b1 u3
psql (8.4.3)
Vous êtes maintenant connecté à la base de données « b1 » comme
utilisateur « u3 ».
b1=> CREATE TABLE t1 ();
CREATE TABLE
b1=> \c b1 u1
psql (8.4.3)
Vous êtes maintenant connecté à la base de données « b1 » comme
utilisateur « u1 ».
b1=> DROP USER u3;
ERREUR: le rôle « u3 » ne peut pas être supprimé car d'autres objets en
dépendent
DÉTAIL: propriétaire de table t1
INSTRUCTION : DROP USER u3;
b1=> DROP OWNED BY u3;
DROP OWNED

Avec le GRANT de u1 sur u3, u1 dispose des droits sur les objets de u3
et peut donc logiquement supprimer les objets de u3.

b1=> \c b1 guillaume
psql (8.4.3)
Vous êtes maintenant connecté à la base de données « b1 » comme
utilisateur « guillaume ».
b1=# CREATE ROLE proprio;
CREATE ROLE
b1=# GRANT proprio TO u3;
GRANT ROLE
b1=# \c b1 u3
psql (8.4.3)
Vous êtes maintenant connecté à la base de données « b1 » comme
utilisateur « u3 ».
b1=> ALTER TABLE t1 OWNER TO proprio;
ALTER TABLE
b1=> \c b1 u1
psql (8.4.3)
Vous êtes maintenant connecté à la base de données « b1 » comme
utilisateur « u1 ».
b1=> DROP USER u3;
DROP ROLE

Évidemment, le plus simple est de mettre comme propriétaire un groupe.
Comme ça, même pas besoin du DROP OWNED BY.

--
Guillaume.
http://www.postgresqlfr.org
http://dalibo.com

In response to

Browse pgsql-fr-generale by date

  From Date Subject
Next Message dazz 2010-03-29 17:51:45 Re: Devenir membre de l'association PostgreSQL Europe : c'est facile !
Previous Message Guillaume Lelarge 2010-03-26 18:20:03 Re: Utilisation de drop owned ou reassign owned