Postgres привилегии по умолчанию для роли только для чтения - PullRequest
1 голос
/ 07 апреля 2020

Я создал базу данных PostgreSQL (версия 11.5) и хочу создать два основных типа основных ролей (readonly и readwrite), а затем назначить эти роли отдельным лицам (user1, user2). , et c.).

Я читал документацию PostgreSQL и следую за этой статьей в качестве примера: https://aws.amazon.com/blogs/database/managing-postgresql-users-and-roles/

Однако Я не смог правильно установить разрешения. По сути, я хочу, чтобы роль readwrite могла создавать любые схемы и / или таблицы, которые они хотят в этой базе данных, и я хочу, чтобы роль readonly могла SELECT из любой из схем и / или таблиц. в этой базе данных. Однако, следуя моему примеру ниже, user2 может создать таблицу, но user1 не имеет доступа к этой таблице.

Я создал следующий скрипт, который я могу запустить как основной пользователь для базы данных для создания базы данных, схемы и ролей.

Команда для запуска SQL script:

psql -h <INSERT HOST HERE> -U postgres -W -f create_db.sql

Содержимое create_db. sql

-- drop the existing database
DROP DATABASE IF EXISTS new_db;

-- create the database
CREATE DATABASE new_db;

-- connect to the database
\c new_db

-- create the new schema
CREATE SCHEMA new_schema;

-- revoke privileges from 'public' role
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON DATABASE new_db FROM PUBLIC;

-- create readonly role
DROP ROLE IF EXISTS readonly;
CREATE ROLE readonly;
GRANT CONNECT ON DATABASE new_db TO readonly;
GRANT USAGE ON SCHEMA new_schema TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA new_schema TO readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA new_schema GRANT SELECT ON TABLES TO readonly;

-- create read/write role
DROP ROLE IF EXISTS readwrite;
CREATE ROLE readwrite;
GRANT CONNECT, CREATE ON DATABASE new_db TO readwrite;
GRANT USAGE, CREATE ON SCHEMA new_schema TO readwrite;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA new_schema TO readwrite;
ALTER DEFAULT PRIVILEGES IN SCHEMA new_schema GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO readwrite;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA new_schema TO readwrite;
ALTER DEFAULT PRIVILEGES IN SCHEMA new_schema GRANT USAGE ON SEQUENCES TO readwrite;

-- create users
DROP USER IF EXISTS user1;
DROP USER IF EXISTS user2;
CREATE USER user1 WITH PASSWORD 'password';
CREATE USER user2 WITH PASSWORD 'password';

-- grant privileges to users
GRANT readonly TO user1;
GRANT readwrite TO user2;

После успешного запуска сценария я могу запустить следующий сценарий как user2, чтобы создать таблицу в новой схеме.

Команда для запуска SQL script

psql -h <INSERT HOST HERE> -d new_db -U user2 -W -f create_.sql

Содержание of create_table. sql

-- drop the existing table
DROP TABLE IF EXISTS new_schema.new_table;

-- create a new table
CREATE TABLE new_schema.new_table (name VARCHAR, age INT);

-- insert data into the new table
INSERT INTO new_schema.new_table (name, age) VALUES ('Bob', 42);

Теперь, если user1 (только для чтения) регистрируется в базе данных, я надеюсь, что они смогут SELECT из этой вновь созданной таблицы, однако, похоже, у них нет правильного доступа. Они могут видеть таблицу, но не запрашивать ее.

psql -h <INSERT HOST HERE> -d new_db -U user1 -W
new_db=> \dt new_schema.*
           List of relations
   Schema   |   Name    | Type  | Owner 
------------+-----------+-------+-------
 new_schema | new_table | table | user2
(1 row)

new_db=> SELECT * FROM new_schema.new_table;
ERROR:  permission denied for table new_table

1 Ответ

0 голосов
/ 07 апреля 2020

С PostgreSQL 11.7 он работает со следующими модификациями:

  1. либо вновь созданная таблица должна быть создана postgres пользователем
  2. или запуск ALTER DEFAULT PRIVILEGES IN SCHEMA new_schema GRANT SELECT ON TABLES TO readonly; должен выполняться user2 .

Например, если я запускаю create_table. sql как user2 с вышеуказанной модификацией:

ALTER DEFAULT PRIVILEGES IN SCHEMA new_schema GRANT SELECT ON TABLES TO readonly;
ALTER DEFAULT PRIVILEGES

CREATE TABLE new_schema.new_table (name VARCHAR, age INT);
CREATE TABLE

INSERT INTO new_schema.new_table (name, age) VALUES ('Bob', 42);
INSERT 0 1

$ psql -U user1 -d new_db
psql (11.7)
Type "help" for help.

new_db=> select * from new_schema.new_table;
 name | age 
------+-----
 Bob  |  42
(1 row)


new_db=> \dp+ new_schema.new_table;
                                  Access privileges
   Schema   |   Name    | Type  |  Access privileges  | Column privileges | Policies 
------------+-----------+-------+---------------------+-------------------+----------
 new_schema | new_table | table | readonly=r/user2   +|                   | 
            |           |       | user2=arwdDxt/user2 |                   | 
(1 row)

Я понимаю, что ALTER DEFAULT PRIVILEGES должен запускаться владельцем будущих задействованных объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...