Search Postgresql Archives

Re: grant connect to all databases

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/5/24 09:04, Matt Zagrabelny wrote:


On Sat, Oct 5, 2024 at 10:27 AM Adrian Klaver <adrian.klaver@xxxxxxxxxxx <mailto:adrian.klaver@xxxxxxxxxxx>> wrote:

    On 10/5/24 07:13, Matt Zagrabelny wrote:
     > Hi David (and others),
     >
     > Thanks for the info about Public.
     >
     > I should expound on my original email.
     >
     > In our dev and test environments our admins (alice, bob, eve) are
     > superusers. In production environments we'd like the admins to be
    read-only.

    What are the REVOKE and GRANT commands you use to achieve that?


GRANT alice TO pg_read_all_data;

Does alice have existing GRANTs?

I would try:

GRANT pg_read_all_data TO alice;

As example:

psql -d test -U postgres

                     List of role grants
 Role name  |      Member of       |   Options    | Grantor
------------+----------------------+--------------+----------
 aklaver    | app_admin            | INHERIT, SET | postgres
 aklaver    | production           | INHERIT, SET | postgres
 dd_admin   | dd_owner             | ADMIN, SET   | postgres
 dd_user    | dd_admin             | INHERIT, SET | postgres
 pg_monitor | pg_read_all_settings | INHERIT, SET | postgres
 pg_monitor | pg_read_all_stats    | INHERIT, SET | postgres
 pg_monitor | pg_stat_scan_tables  | INHERIT, SET | postgres
 postgres   | dd_owner             | INHERIT, SET | postgres


grant pg_read_all_data to adrian;
GRANT ROLE

test=# \drgS
                     List of role grants
 Role name  |      Member of       |   Options    | Grantor
------------+----------------------+--------------+----------
 adrian     | pg_read_all_data     | INHERIT, SET | postgres
 aklaver    | app_admin            | INHERIT, SET | postgres
 aklaver    | production           | INHERIT, SET | postgres
 dd_admin   | dd_owner             | ADMIN, SET   | postgres
 dd_user    | dd_admin             | INHERIT, SET | postgres
 pg_monitor | pg_read_all_settings | INHERIT, SET | postgres
 pg_monitor | pg_read_all_stats    | INHERIT, SET | postgres
 pg_monitor | pg_stat_scan_tables  | INHERIT, SET | postgres
 postgres   | dd_owner             | INHERIT, SET | postgres

 \dt csv_test
          List of relations
 Schema |   Name   | Type  |  Owner
--------+----------+-------+----------
 public | csv_test | table | postgres

test=# \q

psql -d test -U adrian

test=> select * from csv_test ;
 id | val
----+------
  1 | test
  2 | dog
  3 | cat
  4 | test
  5 | fish



...and then I could do something like this:
-- for $database in $databases;
GRANT CONNECT ON database $database TO alice;

...but I'd like to achieve it without the `for` loop.


     >
     > Is the Public role something I can leverage to achieve this desire?

    You should read:

    https://www.postgresql.org/docs/current/ddl-priv.html
    <https://www.postgresql.org/docs/current/ddl-priv.html>


Will do.




      From your original post:

    "but I cannot connect to my database"

    Was that due to a GRANT issue or a pg_hba.conf issue?


It was due to the missing GRANT CONNECT from above. pg_hba looks OK.

    What was the actual complete error?


alice$ psql foo
psql: error: connection to server at "db.example.com <http://db.example.com>" (fe80:100), port 5432 failed: FATAL:  permission denied for database "foo" ...after I GRANT CONNECT, I can connect. However, I don't want to have to iterate over all the databases to achieve the GRANT CONNECT.

I guess I was hoping that the pg_read_all_data would also allow connecting. Or if it didn't, there could/would be a pg_connect_all_databases role.

Cheers,

-m

--
Adrian Klaver
adrian.klaver@xxxxxxxxxxx






[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]

  Powered by Linux