Лекция 11. Авторизация и аутентификация
В этой главе:
- Роли
- Свойства ролей
- Атрибуты
- Владельцы объектов
- Привилегии
- Членство в групповых ролях
- Права на функции и процедуры
- Ограничение доступа
Роли
postgres=# CREATE ROLE grp_students NOLOGIN;
CREATE ROLE
postgres=# CREATE ROLE student LOGIN PASSWORD 'student' IN ROLE grp_students; CREATE ROLE
postgres=# \du
Список ролей
Имя роли | Атрибуты | Член ролей
--------------+-------------------------------------------------------------------------+----------------
grp_students | Cannot login | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS student | {}
student | | {grp_students}
В PostgreSQL любой сеанс является подключением зарегистрированной в СУБД роли к конкретной базе данных. В ранних версиях PostgreSQL были понятия пользователя и группы, как в Unix-подобных ОС. Однако сейчас имеются лишь роли, которые могут представлять конкретного пользователя базы данных или абстрактного владельца объектов, а в случае, если в роль входят несколько членов, то и целую группу. Роль - глобальный объект кластера баз данных.
При создании кластера, которое выполняется средствами команды initdb от имени некоторого пользователя ОС (обычно postgres), создается исходный суперпользователь. Он обладает полными правами на все объекты кластера баз данных и может выполнять любые действия в СУБД.
В примере на слайде зарегистрирована групповая роль grp_students, которая не имеет права входа в сеанс. Также зарегистрирована обычная роль для пользователя student, который таким правом обладает, а также ему установлен пароль.
Для получения списка ролей удобно использовать метакоманду \du psql. Членство в группе отражено в отдельном столбце. В PostgreSQL 16 это не так, там система ролей претерпела значительные изменения.
Список зарегистрированных ролей выводит \du.
List of roles
Role name | Attributes | Member of
--------------+------------------------------------------------------------+----------------
grp_students | Cannot login | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
student | | {grp_students}
Атрибуты выводятся в отдельном столбце. Атрибут LOGIN не выводится, а NOLOGIN, наоборот, выводится. Членство в групповых ролях в 15й версии и более ранних видно в выводе \du.
Любой объект базы данных принадлежит какой-то роли. Объекты, которые роль создала в сеансе, принадлежат ей. И на принадлежащие ей объекты роль имеет полные права и может выполнить с этими объектами любые действия, определенные для них. Например, владелец таблицы может ее удалить командой DROP.
А на все остальные объект ы необходимо предоставить привилегии для выполнения конкретной ролью требуемых действий. Набор возможностей, которые имеет роль с точки зрения СУБД, определяются:
- атрибутами, например, возможностью входить в сеанс;
- владением объектами;
- членством в групповых ролях;
- привилегиями.
https://www.postgresql.org/docs/15/database-roles.html.
Атрибуты
Атрибуты ролей
- SUPERUSER | NOSUPERUSER - суперпользователь или нет
- CREATEDB | NOCREATEDB - может создавать БД или нет
- LOGIN | NOLOGIN - может или нет входить в сеанс
- BYPASSRLS | NOBYPASSRLS - игнорирует RLS или нет
- CONNECTION LIMIT - ограничение количества сессий
- PASSWORD - пароль
- VALID UNTIL - срок действия
После создания кластера баз данных имеется исходный суперпользователь (bootstrap superuser) и больше ролей нет. Зарегистрировать рол ь можно командой CREATE ROLE. https://www.postgresql.org/docs/15/sql-createrole.html.
При регистрации роли или уже потом командой ALTER ROLE можно установить атрибуты, указанные на слайде. Например, атрибут SUPERUSER позволяет роли иметь все возможности суперпользователя, но исходным суперпользователем он не будет. Отличие исходного суперпользователя в том, что у него невозможно отобрать права, так как он необходим в системе.
Атрибут BYPASSRLS позволяет игнорировать фильтрующие политики RLS (Row Level Security), предназначенные для скрытой фильтрации строк в таблицах, выполняющейся по заданным правилам. Пароль и ограничение на количество открытых от имени этой роли сеансов также являются атрибутами ролей. После момента времени, указанного атрибутом VALID UNTIL пароль роли не считается более действительным. https://www.postgresql.org/docs/15/role-attributes.html.
Атрибут CONNECTION LIMIT в PostgreSQL ограничивает количество разрешенных подключений для данной роли. В Pangolin реализована возможность резервирования количества доступных подключений для ролей, что гар антирует пользователю наличие свободных подключений. Настроить резервирование соединения можно для конфигурации standalone, изменяя параметры в файле pg_quota.conf. После редактирования этого файла требуется выполнить перезагрузку СУБД.
Запрет входа в сеанс
postgres=# \c - grp_students
connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL:
role "grp_students" is not permitted to log in Previous connection kept
- Атрибут NOLOGIN роли grp_students не позволяет зайти в сеанс непосредственно от имени этой роли.
- Групповые роли НЕ обязаны иметь запрет на вход в сеанс.
- Обычное применение групповых ролей состоит в назначении им атрибутов и привилегий, наследуемых их членами.
Главное предназначение групповых ролей в упрощении администрирования прав, имеющихся у обычных ролей. Так, привилегии проще назначать конкретным ролям, которым эти права потребовались. Если этих ролей тысячи, то управлять этим коллективом крайне затруднительно. Гораздо проще классифицировать все роли по разновидностям выполняемых ими действиям, сгруппировать роли в категорийные групповые роли. Достаточно назначить необходимые привилегии групповым ролям, а все члены роли МОГУТ эти права наследовать. Действительно ли произойдет наследование привилегии зависит от атрибута INHERIT/NOINHERIT.
https://www.postgresql.org/docs/15/role-attributes.html. Если члену групповой роли требуется воспользоваться атрибутом, то ему придется воспользоваться командой SET ROLE.
Проверка атрибутов
postgres=# ALTER ROLE grp_students CREATEDB; ALTER ROLE
postgres=# \du *student*
Role name | Attributes | Member of
--------------+---------------------------+----------------
grp_students | Create DB, Cannot login | {}
student | | {grp_students}
postgres=# \c - student
You are now connected to database "postgres" as user "student". postgres=> CREATE DATABASE my_db;
ERROR: permission denied to create database
- Групповой роли grp_students установлен атрибут, позволяющий создавать базы данных.
- Не смотря на вхождение в группу, student не унаследовал атрибут.
Роли легко назначить или изъять у нее какой-либо атрибут командой ALTER ROLE. https://www.postgresql.org/docs/15/sql-alterrole.html.
Если эта роль групповая, то хотелось бы для ролей - членов группы иметь возможность воспользоваться возможностями, которые предоставляет атрибут. Например, команда на слайде устанавливает атрибут CREATEDB групповой роли grp_students. Членом этой роли является student, но при входе в его сеанс выясняется, что он этим атрибутом (а он имеется у его групповой роли) воспользоваться не может. Дело в том, что атрибуты НЕ наследуются и для того, чтобы ими воспользоваться, необходимо стать ролью, в которую входит роль - член групповой роли. Делается это с помощью команды SET ROLE. https://www.postgresql.org/docs/15/sql-set-role.html.
Команда SET ROLE
postgres=> \c - student
You are now connected to database "postgres" as user "student".
postgres=> SET ROLE grp_students;
SET
postgres=> SELECT current_user;
current_user
--------------
grp_students
(1 ст рока)
postgres=> SELECT session_user;
session_user
--------------
student
(1 строка)
postgres=> CREATE DATABASE my_db;
CREATE DATABASE
postgres=> \l *db
Name | Owner | Encoding | Collate | Ctype | ICU Locale | Locale Provider | Access privil
-------+--------------+-----------+------------+------------+------------+-----------------+---------------
my_db | grp_students | UTF8 | en_US.UTF8 | en_US.UTF8 | | libc |
(1 row)
При выполнении команды SET ROLE <целевая_роль>
пользователь в сеансе получает права целевой роли, если он в нее входит. Проверить эффективные права, какой роли имеются сейчас в сеансе, можно функцией current_user. Но если исходно сеанс был открыт другой ролью, то это никак не повлияет на выводимую функцией session_user информацию. Она всегда выводит имя роли, открывшей сеанс.
Вернуться к исходной роли можно командой RESET ROLE.
postgres=> RESET ROLE;
RESET
postgres=> SELECT session_user, current_user;
session_user | current_user
--------------+--------------
student | student
(1 строка)
https://www.postgresql.org/docs/15/functions-info.html.
Владельцы объектов
Владелец объекта
postgres=# \c - student
You are now connected to database "postgres" as user "student". postgres=> \l my*
Список баз данных
Имя | Владелец | Кодировка | LC_COLLATE | LC_CTYPE | локаль ICU | Провайдер локали | Права доступа
-------+--------------+-----------+------------+------------+----------+------------------+---------------
my_db | grp_students | UTF8 | en_US.UTF8 | en_US.UTF8 | | libc |
(1 row)
postgres=> \c my_db
You are now connected to database "my_db" as user "student".
Любой объект в базе данных, включая саму базу данных, имеет владельца. Владелец - особый пользователь: он обладает полными правами на объект. Включая его удаление. Поменять владельца объекта может одной из команд ALTER владелец объекта, либо суперпользователь. В примере на слайде с помощью метакоманды \l получены сведения о базе данных my_db. Заметно, что владельцем ее является роль grp_students. Напомним, что эта БД была создана в сеансе, который был исходно запущен для роли student, но далее в этом сеансе была выполнена команда SET ROLE grp_students. Напрямую роль grp_students в сеанс зайти не может в силу наличия атрибута NOLOGIN, но после SET ROLE эффективным владельцем сеанса стала роль grp_students. Эта роль и стала владельцем БД my_db.
Смена владельца
my_db=> CREATE TABLE studentab(id int, str text);
CREATE TABLE
my_db=> \d
List of relations
Schema | Name | Type | Owner
--------+-----------+---------+---------- public | studentab | таблица | student
(1 row)
my_db=> ALTER TABLE studentab OWNER TO grp_students;
ALTER TABLE
my_db=> \d
List of relations
Schema | Name | Type | Owner
--------+-----------+---------+--------------
public | studentab | таблица | grp_students
(1 row)
- В сеансе student создана таблица studentab, владелец - student.
- Владелец может передать объект другой роли, членом которой он является.
- Все роли, входящие в групповую роль, являются владельцами объектов, принадлежащих этой групповой роли.
Возможность передачи объекта другому пользователю не считается хорошей практикой с точки зрения безопасности. В ранних версиях PostgreSQL это еще допускалось. В 15й версии передать владение объектом можно роли, членом которой является передающая роль.
my_db=> ALTER TABLE studentab OWNER TO student;
ALTER TABLE
my_db=> \d
List of relations
Schema | Name | Type | Owner
--------+-----------+---------+----------
public | studentab | таблица | student
(1 строка)
my_db=> ALTER TABLE studentab OWNER TO grp_students;
ALTER TABLE
my_db=> \d
List of relations
Schema | Name | Type | Owner
--------+-----------+---------+--------------
public | studentab | таблица | grp_students
(1 строка)
my_db=> ALTER TABLE studentab OWNER TO postgres;
ERROR: must be member of role "postgres"
В PostgreSQL 16 это поведение изменено в сторону ужесточения требований.
Привилегии
Назначение привилегий
postgres=# CREATE USER aspirant;
CREATE ROLE
postgres=# \c my_db student
You are now connected to database "my_db" as user "student". my_db=> GRANT SELECT ON studentab TO aspirant ;
GRANT
my_db=> \c - aspirant
You are now connected to database "my_db" as user "aspirant".
my_db=> SELECT * FROM studentab ;
id | str
----+-----
(0 rows)
- Роли требуются привилегии для выполнения действий с объектами.
- Привилегии доступа устанавливаются в метаданных объектов.
- При выполнении команды GRANT привилегия на объект или группу объектов устанавливается для конкретной роли, отзыв - команда REVOKE.
- Кроме суперпользователя назначить привилегии может лишь владелец.
Для получения доступа к объекту роли, не обладающей атрибутом суперпользователя и не являющейся владельцем объекта, необходимы привилегии. Привилегии устанавливаются на объекты в их метаданных и запоминаются в форме ACL (Access Control List) следующим образом: grantee=privilege-abbreviation[*].../grantor, где grantee - роль, которой были назначены привилегии, а grantor - роль, предоставившая эту привилегию. Привилегии отображаются в виде буквенных аббревиатур, которые будут показаны далее. Назначить привилегию на объект или несколько объектов можно командой GRANT, в которой после ключевого слова TO указывается роль, которой привилегия предоставлена. После аббревиатуры может присутствовать символ звездочки *, который означает возможность передачи привилегии, о которой будет рассказано далее. В примере на слайде зарегистрирован новый пользователь, которому владелец таблицы предоставил право чтения, то есть, возможность выполнять SELECT для всех колонок таблицы.
https://www.postgresql.org/docs/15/ddl-priv.html.
https://www.postgresql.org/docs/15/sql-grant.html.
https://www.postgresql.org/docs/15/sql-revoke.html.
Привилегий для таблиц и представлений
- SELECT - чтение таблицы, представления, столбца (r - read);
- INSERT - вставка в таблицу или представление (a -append);
- UPDATE - изменение значений столбцов таблиц или представлений (w - write);
- DELETE - удаление строк в таблицах или представлениях (d - delete);
- TRUNCATE - опустошение таблицы (D);
- REFERENCES - создание ссылки на столбец внешним ключом (x);
- TRIGGER - создание триггера для таблицы или представления (t).
Привилегии, указанные на слайде, устанавливают на таблицы и подобные им объекты, например, представления. Привилегии могут быть установлены также и на отдельные столбцы.
my_db=> GRANT SELECT(n),INSERT(n,t) ON ptab TO aspirant; GRANT
my_db=> \dp ptab
Access privileges
Schema | Name | Type |Access privileges| Column privileges | Policies
--------+------+---------+-----------------+-----------------------+----------
public | ptab | таблица | | n: +|
| | | | aspirant=ar/student+|
| | | | t: +|
| | | | aspirant=a/student |
(1 строка)
Просмотр привилегий на доступ к таблице
my_db=> \dp studentab
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+-----------+---------+-----------------------------------+--------------------+----------
public | studentab | таблица | grp_students=arwdDxt/grp_students+| |
| | | aspirant=r/grp_students | |
(1 row)
Получить установленные привилегий на таблицу можно метакомандой \dp psql. Привилегии по умолчанию для владельца - все права на объект не отображаются до тех пор пока ACL не будет изменен любым способом.
Получить информацию о привилегиях, установленных на таблицу или подобный таблице объект, можно метакомандой psql \dp. Причем, если на объект установлены привилегии по умолчанию - полные права для владельца, то в они просто не отображаются. Например:
my_db=> CREATE TABLE def_privs(n int);
CREATE TABLE
my_db=> \dp def_privs
Access privileges
Schema | Name | Type |Access privileges|Column privileges|Policies
--------+-----------+---------+-----------------+-----------------+----------
public | def_privs | таблица | | |
(1 строка)
Привилегий для баз данных
-
CREATE (C):
- создание новых схем;
- создание публикаций;
- разрешение подключать расширения;
-
CONNECT (c) - разрешает подключение к базе данных;
-
TEMPORARY (T) - создание временных объектов в базе данных.
Привилегии, устанавливаемые по умолчанию на базы данных - Tc, то есть возможность подключаться и создавать временные объекты. Подключение к базе данных требует наличия не только наличия соответствующей привилегии, но и разрешения на подключение в файле pg_hba.conf, о котором будет рассказано далее. Если у роли имеется привилегия на создание объектов в базе данных, то эта роль может создать, например, схему. У обычных ролей, не владельцев базы, есть права на подключение и создание временных объектов. Однако эту привилегию, конечно, можно назначить индивидуально. https://www.postgresql.org/docs/15/ddl-priv.html.
Привилегий для схем
my_db=> CREATE SCHEMA my_schema;
CREATE SCHEMA
my_db=> GRANT USAGE ON SCHEMA my_schema TO aspirant; GRANT
my_db=> \dn+ my_schema
List of schemas
Name | Owner | Access privileges | Description
-----------+----------+--------------------+----------
my_schema | student | student=UC/student+|
| | aspirant=U/student |
(1 row)
В примере на слайде в сеансе student создана схема my_schema. Так как student входит в групповую роль grp_students, владеющей базой, он также является владельцем. Соответственно, право на создание объектов имеется. Для схем существуют лишь две привилегии: Usage (U) и Create (C). После того, как привилегия U была предоставлена роли aspirant, в выводе метакоманды \dn+, информирующей о схемах, появилась соответствующая запись: aspirant=U/student То есть, роли aspirant предоставлена привилегия U, а предоставил ее student.
Привилегии на установку параметров
my_db=# \dconfig+ commit_delay
List of configuration parameters
Parameter | Value | Type | Context |Access privileges
--------------+----------+---------+-----------+--------------------
commit_delay | 0 | integer | superuser |
my_db=# GRANT SET ON PARAMETER commit_delay TO student ; my_db=# \dconfig+ commit_delay
List of configuration parameters
Parameter | Value | Type | Context |Access privileges
--------------+----------+---------+-----------+----------------------
commit_delay | 0 | integer | superuser | postgres=sA/postgres+
| | | | student=s/postgres
- SET (s) - право на установку параметра в текущей сессии;
- ALTER SYSTEM (A) - право на установку параметра сервера.
Суперпользователь может предоставить право изменять конкретные сессионные параметры с контекстом, не позволяющим менять их обычным ролям. Это позволяет делать привилегия SET с аббревиатурой s. Более того, можно даже предоставить привилегию на изменение параметров на уровне экземпляра командой ALTER SYSTEM - привилегия с аббревиатурой (A). В примере установлено разрешение для роли student влиять на значение параметра commit_delay, позволяющего дожидаться в течении разрешенного времени фиксации сразу нескольких активных транзакций для снижения нагрузки на журнал предзаписи. Этот параметр имеет контекст superuser, что не позволяет обычным пользователям его менять. Получить подробности о параметре удобно метакомандой \dconfig+ .
Другие привилегии
-
CREATE (C) - для табличных пространств позволяет создавать в них объекты;
-
EXECUTE (X) - право выполнения функций и процедур;
-
USAGE (U):
- использование процедурных языков;
- для последовательность право выполнять функции currval и nextval;
- для оберток внешних данных (FDW foreign-data wrappers) право создания нового сервера;
- для внешних серверов позволяет создавать внешние таблицы.
Привилегии, установленные на табличные пространства, можно увидеть с помощью команды \db+. Для функций и процедур определена единственная привилегия на право исполнения EXECUTE с аббревиатурой X. Привилегии на функции и процедуры показывает метакоманда \df+. Расширения для подключения внешних источников данных (FDW - Foreign Data Wrapper) будут обсуждаться в главе 14. Привилегии на последовательности SEQUENCE:
- SELECT(r)-правовызыватьфункцияcurrvalдляполученияранее сгенерированного значения;
- UPDATE(w)-правонавыполнениефункцийnextvalдляполучения нового значения последовательности и setval для установки начального значения последовательности;
- USAGE (U) - право выполнять функции currval и nextval.
Право передачи
my_db=# CREATE TABLE suptab (s date);
CREATE TABLE
my_db=# GRANT SELECT ON suptab TO student WITH GRANT OPTION;
GRANT
my_db=# \c - student
You are now connected to database "my_db" as user "student". my_db=> \dp suptab
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+--------+---------+---------------------------+--------------------+----------
public | suptab | table | postgres=arwdDxt/postgres+| |
| | | student=r*/postgres | |
my_db=> GRANT SELECT ON suptab TO aspirant;
GRANT
my_db=> \dp suptab
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+--------+---------+---------------------------+--------------------+----------
public | suptab | table | postgres=arwdDxt/postgres+| |
| | | student=r*/postgres + | |
| | | aspirant=r/student | |
Команда GRANT предоставляет опцию GRANT OPTION, которая позволяет роли-получателю передавать полученные полномочия другим ролям. В примере суперпользователь создал таблицу и предоставил на нее право чтения роли student с правом передачи, а student предоставил привилегию чтения роли aspirant. Команда REVOKE позволяет изъять право передачи. Отнимать права командой REVOKE необходимо в том порядке, в котором осуществлялась передача прав.
my_db=# REVOKE SELECT ON suptab FROM aspirant ;
REVOKE
my_db=# \dp suptab
Access privileges
Schema | Name | Type | Access privileges | Column privileges |
--------+--------+---------+---------------------------+--------------------+-
public | suptab | таблица | postgres=arwdDxt/postgres+| |
| | | student=r*/postgres +| |
| | | aspirant=r/student | |
(1 строка)
Право чтения не изъято, так как postgres не выдавал его aspirant.
my_db=# REVOKE GRANT OPTION FOR SELECT ON suptab FROM student CASCADE;
REVOKE
my_db=# \dp suptab
Access privileges
Schema | Name | Type | Access privileges | Column privileges |
--------+--------+---------+---------------------------+--------------------+-
public | suptab | таблица | postgres=arwdDxt/postgres+| |
| | | student=r/postgres | |
Ключевое слово CASCADE необходимо, так как права изымаются по цепочке.
Права по умолчанию
my_db=> \c - student
You are now connected to database "my_db" as user "student".
my_db=> CREATE SCHEMA def_sch;
CREATE SCHEMA
my_db=> ALTER DEFAULT PRIVILEGES IN SCHEMA def_sch GRANT SELECT ON TABLES TO aspirant ;
ALTER DEFAULT PRIVILEGES
my_db=> \ddp
Default access privileges
Owner | Schema | Type | Access privileges
----------+---------+-------+--------------------
student | def_sch | table | aspirant=r/student
(1 rows)
- Привилегии по умолчанию будут использоваться при создании новых объектов.
- Привилегии по умолчанию устанавливает команда ALTER DEFAULT PRIVILEGES.
PostgreSQL позволяет заранее задать права для объектов, которые еще не существуют. При создании этих объектов на них будут автоматически установлены именно эти права. В примере создана схема def_sch, она принадлежит роли, создавшей ее - student. Объекты, которые student будет создавать в этой схеме (или иной пользователь, имеющий на это право), будут автоматически получать ACL с установленными привилегиями для пользователя aspirant с правами на чтение.
my_db=> CREATE TABLE def_sch.new_tab();
CREATE TABLE
my_db=> \dp def_sch.new_tab
Access privileges
Schema | Name | Type | Access privileges | Column privileges |
---------+---------+---------+-------------------------+--------------------+-
def_sch | new_tab | таблица | student=arwdDxt/student+| |
| | | aspirant=r/student | |
(1 строка)
Проверить привилегии, установленные по умолчанию, можно метакомандой \ddp. https://www.postgresql.org/docs/15/sql-alterdefaultprivileges.html.
Членство в групповых ролях
Предоставление членства в группе
my_db=# CREATE USER abiturient NOINHERIT; CREATE ROLE
my_db=# GRANT grp_students TO abiturient ; GRANT ROLE
my_db=# \du *ent*
List of roles
Role name | Attributes | Member of
--------------+-------------------------------+----------------
abiturient | No inheritance | {grp_students}
grp_students | Create DB, Cannot login | {}
student | | {grp_students}
- Команда
GRANT <группа> TO <роль>
предоставляет членство роли в группе. - Удаление роли из группы:
REVOKE <группа> FROM <роль>
.
Членством ролей в других ролях также управляют команды GRANT и REVOKE. Отдельного понятия для роли, включающей в себя другие роли, в PostgreSQL нет, но для простоты будем называть такие роли групповыми или же просто группами. Напомним, что если роль владеет какими-либо объектами, то все роли, входящие в групповую роль, также являются владельцами этих объектов на равноправных условиях. Вплоть до 15-й версии PostgreSQL членство роли в группах отображала метакоманда \du (с 16-й версии это не так). В примере на слайде создана новая роль abiturient (можно было бы использовать CREATE ROLE ... LOGIN, что эквивалентно CREATE USER). Обратите внимание на атрибут NOINHERIT, который запрещает наследование привилегий от групповой роли. По умолчанию для вновь регистрируемых ролей включен атрибут INHERIT, предоставляющий роли те же привилегии, что и групповая роль. Роли без наследования с атрибутом NOINHERIT могут использовать SET ROLE, как это было продемонстрировано ранее в примере с созданием базы данных my_db. Подробнее о наследовании привилегий далее. https://www.postgresql.org/docs/15/role-attributes.html. Далее в примере командой GRANT роль abiturient предоставлено участие в группе grp_students. Это можно также было сделать самой командой CREATE ROLE. https://www.postgresql.org/docs/15/sql-grant.html.
https://www.postgresql.org/docs/15/sql-createrole.html.
Наследование привилегий
my_db=# GRANT INSERT ON suptab TO grp_students ;
GRANT
my_db=# \c - student
You are now connected to database "my_db" as user "student".
my_db=> \dp suptab
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+--------+---------+---------------------------+--------------------+----------
public | suptab | table | postgres=arwdDxt/postgres+| |
| | | student=r/postgres +| |
| | | grp_students=a/postgres | |
(1 row)
my_db=> INSERT INTO suptab VALUES (now());
INSERT 0 1
my_db=> SELECT * FROM suptab ;
s
------------
2024-10-26
(1 row)