Изменение привилегий по умолчанию для групповой роли в PostgreSQL
Я создал две групповые роли в Postgres 9.2: один называется admins
, а другой называется readers
.
Идея очень проста: admins
создать таблицы и readers
иметь доступ на чтение к этим таблицам.
После предоставления привилегий обеим ролям группы все работало как ожидалось для объектов exisintg. Но как насчет новых объектов?
Итак, прочитав этот пост, я изменил привилегии по умолчанию, чтобы предоставить SELECT
привилегии readers
для любой новой таблицы, которая admins
create:
ALTER DEFAULT PRIVILEGES FOR ROLE admins IN SCHEMA public GRANT SELECT ON TABLES TO readers;
ALTER DEFAULT PRIVILEGES FOR ROLE admins IN SCHEMA public GRANT SELECT ON SEQUENCES TO readers;
Но, по-видимому, ALTER DEFAULT PRIVILEGES
влияет только на роль, а не на роль этой роли. Позвольте мне показать вам.
Если я вхожу в качестве userX
(член admins
) и создаю новую таблицу, не предоставляются привилегии по умолчанию (и, следовательно, readers
не может получить доступ к этой таблице):
test=# CREATE TABLE table1 (name VARCHAR(10)); -- Creating table as userX
test=# \dp table1
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+--------+-------+-------------------+--------------------------
public | table1 | table | |
Однако привилегии по умолчанию предоставляются, если я создаю таблицу как admins
(readers
может получить доступ к этой таблице):
test=# SET ROLE admins;
test=# CREATE TABLE table2 (name VARCHAR(10)); -- Creating table as admins
test=# \dp table2
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+--------+-------+-----------------------+--------------------------
public | table2 | table | readers=r/admins +|
| | | admins=arwdDxt/admins |
Есть ли способ изменить привилегии по умолчанию для ВСЕХ членов групповой роли? Или я должен просто изменять привилегии по умолчанию для каждого пользователя?
ОБНОВЛЕНИЕ: В этом форуме PostgreSQL кто-то задал очень похожий вопрос, и ответ был:
К сожалению, я не вижу способа добиться желаемого, не предоставляя привилегии по умолчанию всем, кто участвует.
Однако этот вопрос задавали 2 года назад. Есть ли решение сейчас?
Ответы
Ответ 1
Если пользователь создает таблицу, этот пользователь становится владельцем таблицы. Поэтому в вашем случае применяются любые привилегии по умолчанию для userX, а не админы. решение должно быть SET ROLE admins
перед созданием вашей таблицы:
SET ROLE admins;
CREATE TABLE ... -- This now applies default privileges of admins
;
RESET ROLE;
В общем, вы хотели бы сделать это всегда: создавать все таблицы и представления через роль группы или какую-либо другую роль, не используемую в ежедневных операциях, и предоставлять доступ к отношениям другой роли группы, чьи привилегии наследуются путем обычного входа в систему роли (пользователи). Это значительно облегчает управление безопасностью.
Cheers,
Патрик