Re: DROP OWNED BY fails to drop privileges granted by non-owners (was Re: [GENERAL] Bug, Feature, or what else?) - Mailing list pgsql-hackers

From Adrian Klaver
Subject Re: DROP OWNED BY fails to drop privileges granted by non-owners (was Re: [GENERAL] Bug, Feature, or what else?)
Date
Msg-id 51153B61.5010207@gmail.com
Whole thread Raw
In response to DROP OWNED BY fails to drop privileges granted by non-owners (was Re: [GENERAL] Bug, Feature, or what else?)  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: DROP OWNED BY fails to drop privileges granted by non-owners (was Re: [GENERAL] Bug, Feature, or what else?)  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
On 02/08/2013 09:09 AM, Tom Lane wrote:
> Adrian Klaver <adrian.klaver@gmail.com> writes:
>> On 02/08/2013 08:14 AM, Tom Lane wrote:
>>> Of course, postgres has other options besides that, of which "DROP OWNED
>>> BY ak02" is probably the most appropriate here.  Or if you really want
>>> to get rid of just that grant, SET ROLE TO akretschmer01 and revoke.
>
>> The DROP OWNED was tried further up the thread and did not seem to work:
>
> Huh.  You're right, here is a complete test case:
>
> regression=# create schema s1;
> cCREATE SCHEMA
> regression=# create user u1;
> CREATE ROLE
> regression=# create user u2;
> CREATE ROLE
> regression=# grant all on schema s1 to u1 with grant option;
> GRANT
> regression=# \c - u1
> You are now connected to database "regression" as user "u1".
> regression=> grant all on schema s1 to u2;
> GRANT
> regression=> \c - postgres
> You are now connected to database "regression" as user "postgres".
> regression=# \dn+ s1
>                     List of schemas
>   Name |  Owner   |  Access privileges   | Description
> ------+----------+----------------------+-------------
>   s1   | postgres | postgres=UC/postgres+|
>        |          | u1=U*C*/postgres    +|
>        |          | u2=UC/u1             |
> (1 row)
>
> regression=# drop user u2; -- expect failure here
> ERROR:  role "u2" cannot be dropped because some objects depend on it
> DETAIL:  privileges for schema s1
> regression=# drop owned by u2;
> DROP OWNED
> regression=# drop user u2; -- failure here is wrong
> ERROR:  role "u2" cannot be dropped because some objects depend on it
> DETAIL:  privileges for schema s1
> regression=# \dn+ s1
>                     List of schemas
>   Name |  Owner   |  Access privileges   | Description
> ------+----------+----------------------+-------------
>   s1   | postgres | postgres=UC/postgres+|
>        |          | u1=U*C*/postgres    +|
>        |          | u2=UC/u1             |
> (1 row)
>
> I believe the problem is that DROP OWNED for privileges is implemented
> by calling REVOKE.  As noted upthread, when a superuser does REVOKE,
> it's executed as though the object owner did the REVOKE, so only
> privileges granted directly by the object owner go away.  In this
> particular example, "DROP OWNED BY u1" makes the grant to u1 go away,
> and then the grant to u2 goes away via cascade ... but "DROP OWNED BY
> u2" fails to accomplish anything at all, because postgres never granted
> anything directly to u2.
>
> We haven't seen this reported before, probably because the use of
> GRANT OPTIONS isn't very common, but AFAICS it's been wrong since
> the invention of DROP OWNED.
>
> It looks to me like DropOwnedObjects doesn't actually insist on
> superuserness to do DROP OWNED, only ability to become the role,
> which means that DROP OWNED BY is completely broken for privileges
> if executed by a non-superuser; the only privileges it would remove
> would be those granted by the current user to the target user.
> I'm not really sure what the desirable behavior would be in such a
> case though.  Ordinary users can't revoke privileges granted *to*
> them, only privileges granted *by* them.  So it's not necessarily
> the case that a non-superuser should be able to make all privileges
> granted to a target role go away, even if he's allowed to become
> the target role and thereby drop objects that it owns.  I wonder
> how sensible it is really to allow DROP OWNED to non-superusers.

I am not sure I am following. Are we talking two different cases here?

1) As mentioned in the first paragraph the case where running DROP OWNED 
as a supersuser does not work.

2) A non-superuser running DROP OWNED and not having the necessary 
privileges.

>
>             regards, tom lane
>


-- 
Adrian Klaver
adrian.klaver@gmail.com



pgsql-hackers by date:

Previous
From: Andrew Dunstan
Date:
Subject: Re: Alias hstore's ? to ~ so that it works with JDBC
Next
From: Robert Haas
Date:
Subject: Re: [COMMITTERS] pgsql: Stamp 9.1.8.