Re: Restricted access on DataBases

From: "Charles Clavadetscher" <clavadetscher(at)swisspug(dot)org>
To: "'Durumdara'" <durumdara(at)gmail(dot)com>
Cc: <pgsql-general(at)postgresql(dot)org>
Subject: Re: Restricted access on DataBases
Date: 2016-10-04 11:04:35
Message-ID: 001a01d21e2f$1dfa12f0$59ee38d0$@swisspug.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hello

> > Also try this:
> > ALTER DEFAULT PRIVILEGES FOR ex_mainuser GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER
> > ON TABLES TO ex_dbuser;
> >
> > You execute the ALTER DEFAULT PRIVILEGES as su, so the grant applies to objects created by su and not
> > ex_mainuser, unless you specify it with FOR ex_mainuser.
> >
>
> So... I repeated the test.
>
> --- login with postgres:
>
> CREATE DATABASE db_testrole
> WITH ENCODING='UTF8'
> TEMPLATE=template0
> CONNECTION LIMIT=-1;
>
> CREATE ROLE u_tr_db LOGIN NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
>
>
> CREATE ROLE u_tr_main LOGIN
> NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
> GRANT u_tr_db TO u_tr_main;
>
>
> ALTER DATABASE db_testrole
> OWNER TO u_tr_db;
>
> REVOKE ALL ON DATABASE db_testrole FROM public;
> GRANT CREATE, TEMPORARY ON DATABASE db_testrole TO public;
> GRANT ALL ON DATABASE db_testrole TO u_tr_db;
>
> ALTER DEFAULT PRIVILEGES
> GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES
> TO u_tr_db;

Here you are telling PostgreSQL to grant those privileges to u_tr_db on tables created by user postgres.

> ---- login with u_tr_main:
>
> create table t_canyouseeme_1 (k int);
>
> ---- login with u_tr_db:
>
> select * from t_canyouseeme_1;
>
> ERROR: permission denied for relation t_canyouseeme_1
> SQL state: 42501
> As you see before, u_tr_db got all default privileges on future tables, so I don't understand why he don't get to
> "t_canyouseeme_1".

This is not correct. You issued the ALTER DEFAULT PRIVILEGES statement as user postgres. So u_tr_db is granted privileges only on tables created by user postgres. Since you created the table as user u_tr_main the default privileges don't apply, because there are none defined.

> If I try to use these things they would work:
>
> A.)
>
> ---- login with u_tr_main:
>
> set role u_tr_db;
>
> create table t_canyouseeme_2 (k int);
>
> ---- login with u_tr_db:
>
> select * from t_canyouseeme_2; -- OK!

Yes, because the owner of the table is u_tr_db. With set role user u_tr_main is impersonating user u_tr_db.

> B.)
>
> ---- login with su:
>
>
> ALTER DEFAULT PRIVILEGES FOR role u_tr_main GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE,
> REFERENCES, TRIGGER ON TABLES TO u_tr_db;

Here you are telling PostgreSQL to grant privileges on tables created by u_tr_main to u_tr_db.

> ---- login with u_tr_main:
>
> create table t_canyouseeme_3 (k int);
>
> ---- login with u_tr_db:
>
> select * from t_canyouseeme_3; -- OK!
>
>
> A.) is because I can set role to u_tr_db and then he is the creator, he get all rights.
> B.) I don't understand this statement... :-( :-( :-(
>
> So the main questions.
> Why the default privilege settings aren't affected on newly created table?
> See:
>
> ALTER DEFAULT PRIVILEGES
> GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES
> TO u_tr_db;

They do if the user creating the table is the user that issued the statement. In the case above postgres.

> What are the meaning of this statement if they won't usable for object created by another users?
> U_TR_DB is owner, so they have all privileges for next tables he will create.
> So I supposed that "default privileges" is for future objects created by different users.
> But this not works here.
>
> I don't understand case B.
> U_TR_MAIN gives all privileges to U_TR_DB for all newly created table?

Yes. You may also choose to restrict the privileges, instead of granting all of them.

> What are the differences between?
>
> 1. ALTER DEFAULT PRIVILEGES
> GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES
> TO u_tr_db;
> 2. ALTER DEFAULT PRIVILEGES FOR role u_tr_main GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES,
> TRIGGER ON TABLES TO u_tr_db;

In 1 the rule apply for tables created by the user that created the default privileges. Specifically the current_user is the one used for authorization checks.
In 2 you say explicitly that the rule applies to tables created by user u_tr_main.

> Why the second works and first not?

They both work. In the first statement it works if you create tables as the user who was the current_user when you issued the alter default privileges statement. In the second it works if you create a table as user u_tr_main.

> ---
>
>
> db_testrole-# \ddp
> Default access privileges
> Owner | Schema | Type | Access privileges
> -----------+--------+-------+-----------------------------
> postgres | | table | postgres=arwdDxt/postgres +
> | | | u_tr_db=arwdDxt/postgres
> u_tr_main | | table | u_tr_db=arwdDxt/u_tr_main +
> | | | u_tr_main=arwdDxt/u_tr_main
> (2 rows)

Here you see in different form what I already mentioned above.
Bye
Charles

>
> db_testrole-# \d
> List of relations
> Schema | Name | Type | Owner
> --------+-----------------+-------+-----------
> public | t_canyouseeme_1 | table | u_tr_main
> public | t_canyouseeme_2 | table | u_tr_db
> public | t_canyouseeme_3 | table | u_tr_main
> (3 rows)
>
>
> ---
>
>
>
> Thank you for your help!
>
> Best wishes
> dd
>

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Durumdara 2016-10-04 11:52:38 Re: Restricted access on DataBases
Previous Message Albe Laurenz 2016-10-04 10:57:03 Re: Restricted access on DataBases