14.2. Сценарий управления правами #

Рассмотрим сценарий управления правами, в котором они предоставляются по иерархии: от главного администратора локальным администраторам групп пользователей и аналитикам (обратитесь к диаграмме ниже).

Где:

  • Суперпользователь — это суперпользователь Postgres Pro с полными правами.

  • metastore_admin — главный администратор с ролью metastore_admin, который является владельцем всех объектов pgpro_metastore.

  • Администраторы A и B — это локальные администраторы групп пользователей, у которых есть доступ к объектам pgpro_metastore, связанным с этими группами.

    Права этим администраторам предоставляет главный администратор. Локальные администраторы в свою очередь могут предоставлять права аналитикам в рамках своих групп.

  • Аналитики A, B, C и D — пользователи, которые работают с OLAP-данными.

Чтобы настроить этот сценарий управления правами:

  1. Создайте пользователей в базе данных от имени суперпользователя:

    postgres=# SELECT current_user;
    current_user
    --------------
    root
    postgres=# CREATE USER metastore_admin;
    postgres=# CREATE USER admin_a;
    postgres=# CREATE USER admin_b;
    postgres=# CREATE USER analyst_a;
    postgres=# CREATE USER analyst_b;
    postgres=# CREATE USER analyst_c;
    postgres=# CREATE USER analyst_d;
  2. Создайте аналитические схемы для групп пользователей:

    postgres=# SELECT current_user;
    current_user
    --------------
    root
    postgres=# CREATE SCHEMA schema_a;
    postgres=# CREATE SCHEMA schema_b;
  3. Предоставьте пользователю admin_a права на аналитическую схему schema_a:

    postgres=# SELECT current_user;
    current_user
    --------------
    root
    postgres=# GRANT ALL ON SCHEMA schema_a to metastore_admin WITH GRANT OPTION;
    postgres=# GRANT ALL ON SCHEMA schema_a to admin_a WITH GRANT OPTION;
  4. Предоставьте пользователю metastore_admin права на аналитическую схему metastore и сделайте его администратором:

    postgres=# SELECT current_user;
    current_user
    --------------
    root
    postgres=# GRANT ALL ON SCHEMA metastore TO metastore_admin ;
    postgres=# ALTER SYSTEM SET duckdb.postgres_role TO 'metastore_admin';
  5. Перезапустите сервер.

Теперь пользователь metastore_admin может настроить каталог pgpro_metastore:

postgres=> SELECT current_user;
  current_user
-----------------
metastore_admin
postgres=> SELECT metastore.define_catalog_connection('localhost','5433','postgres','','');
postgres=> SELECT metastore.init();

Предположим, в схеме группы A есть таблица Postgres Pro, которую для выполнения аналитических запросов необходимо перенести в pgpro_metastore:

  1. Пользователь metastore_admin создаёт хранилище и аналитическую таблицу:

    postgres=> SELECT current_user;
      current_user
    -----------------
    metastore_admin
    postgres=> SELECT metastore.add_storage('mt_storage', 'file:///tmp/mt_storage/', 'file:///tmp/mt_storage/tmp_dir/');
    postgres=> SELECT metastore.add_table('mt_table1', 'mt_storage', 'schema_a.pg_table');
  2. Пользователь metastore_admin находит имя прокси-таблицы, оборачивающей созданную аналитическую таблицу, выполнив запрос в базе данных, которая содержит каталог pgpro_metastore, т.е. схему axe_catalog:

    SELECT proxy_table_name FROM axe_catalog.pga_proxy_table p
    JOIN axe_catalog.pga_table t ON p.proxy_table_id = t.proxy_table_id
    WHERE t.table_name = 'mt_table1';
     proxy_table_name
    -------------------
     t_mt_table1_00001
    (1 row)

    Дальнейшие шаги выполняются на сервере, где установлено расширение pgpro_metastore.

  3. Пользователь metastore_admin предоставляет права пользователю admin_a:

    postgres=> SELECT current_user;
      current_user
    -----------------
    metastore_admin
    postgres=> GRANT ALL ON metastore.t_mt_table1_00001 TO admin_a WITH GRANT OPTION;

    Параметр WITH GRANT OPTION позволяет пользователю admin_a при необходимости предоставлять права другим пользователям.

  4. Пользователь admin_a копирует таблицу Postgres Pro в аналитическую таблицу и создаёт представление Postgres Pro:

    postgres=> SELECT current_user;
    current_user
    --------------
    admin_a
    postgres=> SELECT metastore.copy_table('mt_table1', 'select * from schema_a.pg_table');
    postgres=> SELECT metastore.create_view('mt_table1', 'schema_a');

    Заметьте, что пользователь, вызывающий функцию copy_table должен иметь достаточные права для выполнения запроса, переданного как параметр; в данном случае, admin_a должен иметь разрешение на SELECT из таблицы schema_a.pg_table.

  5. Как владелец объекта пользователь metastore_admin разрешает пользователю admin_a предоставлять права на чтение этого объекта другим пользователям:

    postgres=> SELECT current_user;
      current_user
    -----------------
    metastore_admin
    postgres=> GRANT SELECT ON schema_a.mt_table1 TO admin_a WITH GRANT OPTION ;
  6. Пользователь admin_a предоставляет аналитикам права на чтение представления Postgres Pro:

    postgres=> SELECT current_user;
    current_user
    --------------
    admin_a
    (1 row)
    
    postgres=> GRANT USAGE ON SCHEMA schema_a to analyst_a;
    postgres=> GRANT SELECT ON schema_a.mt_table1 TO analyst_a;
  7. Аналитик читает аналитическую таблицу:

    postgres=> SELECT current_user;
      current_user
      --------------
      analyst_a
      (1 row)
    
      postgres=> SELECT count(*) FROM schema_a.mt_table1 ;
      count
      -------
          50
      (1 row)