Re: Curious case of the unstoppable user - Mailing list pgsql-general

From Thom Brown
Subject Re: Curious case of the unstoppable user
Date
Msg-id AANLkTin=rjGZ5D0YNyKupebdefJOuxDpBH6ruTBTTDWy@mail.gmail.com
Whole thread Raw
In response to Re: Curious case of the unstoppable user  (Guillaume Lelarge <guillaume@lelarge.info>)
Responses Re: Curious case of the unstoppable user
List pgsql-general
On 29 March 2011 21:59, Guillaume Lelarge <guillaume@lelarge.info> wrote:
> Le 29/03/2011 20:44, Thom Brown a écrit :
>> Hi all,
>>
>> I've just set up a test user, revoked all access from them to a
>> database, then tried to connect to that database and it let me in.
>> When I try it all from scratch, it works correctly.
>>
>> Here's the set running correctly:
>>
>> postgres=# CREATE DATABASE testdb;
>> CREATE DATABASE
>> postgres=# CREATE ROLE testrole;
>> CREATE ROLE
>> postgres=# REVOKE ALL ON DATABASE testdb FROM testrole CASCADE;
>> REVOKE
>> postgres=# \c testdb testrole
>> FATAL:  role "testrole" is not permitted to log in
>> Previous connection kept
>>
>
> This is because you created a role without the login attribute. IOW, it
> has nothing to do with your REVOKE statement. Proof:
>
> postgres=# CREATE DATABASE testdb;
> CREATE DATABASE
> postgres=# CREATE ROLE testrole;
> CREATE ROLE
> postgres=# \c testdb testrole
> FATAL:  role "testrole" is not permitted to log in
> Previous connection kept
>
>> But now if I try something similar with an existing user and existing
>> database, it doesn't work:
>>
>> postgres=# REVOKE ALL ON DATABASE stuff FROM meow CASCADE;
>> REVOKE
>> postgres=# \c stuff meow
>> You are now connected to database "stuff" as user "meow".
>>
>> So, I'm overlooking something.  Could someone tell me what it is?  I
>> bet it's something obvious.  I'm using 9.1dev if it's relevant.
>>
>
> Yeah. You probably created meow as a user, with is a role with the login
> attribute. The \dg+ metacommand tells us exactly that:
>
>> stuff=> \dg+
>>                                     List of roles
>>  Role name |                   Attributes                   | Member
>> of | Description
>> -----------+------------------------------------------------+-----------+-------------
>>  meow      |                                                | {}        |
>>  testrole  | Cannot login                                   | {}        |
>>  thom      | Superuser, Create role, Create DB, Replication | {}        |
>
> So:
>
> postgres=# CREATE USER meow;
> CREATE ROLE
> postgres=# \c testdb meow
> You are now connected to database "testdb" as user "meow".
>
> Now, you not only need to revoke connect permission to meow. You need to
> do it to public too:
>
> testdb=> \c testdb postgres
> You are now connected to database "testdb" as user "postgres".
> testdb=# REVOKE ALL ON DATABASE testdb FROM meow CASCADE;
> REVOKE
> testdb=# \c testdb meow
> You are now connected to database "testdb" as user "meow".
>
> Same result as you. Now, revoke connect permission to public:
>
> testdb=> \c testdb postgres
> You are now connected to database "testdb" as user "postgres".
> testdb=# REVOKE ALL ON DATABASE testdb FROM PUBLIC CASCADE;
> REVOKE
> testdb=# \c testdb meow
> FATAL:  permission denied for database "testdb"
> DETAIL:  User does not have CONNECT privilege.
> Previous connection kept

I altered the role with NOLOGIN, then tried to connect as that user
again, and it doesn't let the user in, so you're correct.

Thanks for the explanation.  I take it the access priviledges field
shown in \l+ reveals this?  It must be the line that begins with =.  I
need to familiarise myself with it more.

--
Thom Brown
Twitter: @darkixion
IRC (freenode): dark_ixion
Registered Linux user: #516935

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

pgsql-general by date:

Previous
From: Guillaume Lelarge
Date:
Subject: Re: Curious case of the unstoppable user
Next
From: Guillaume Lelarge
Date:
Subject: Re: Curious case of the unstoppable user