Управление доступом
Роли и привилегии
16
Авторские права
© Postgres Professional, 2017–2026
Авторы: Егор Рогов, Павел Лузанов, Илья Баштанов, Алексей Береснев
Фото: Олег Бартунов (монастырь Пху и пик Бхрикути, Непал)
Использование материалов курса
Некоммерческое использование материалов курса (презентации,
демонстрации) разрешается без ограничений. Коммерческое
использование возможно только с письменного разрешения компании
Postgres Professional. Запрещается внесение изменений в материалы
курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу:
edu@postgrespro.ru
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за
любые повреждения и убытки, включая потерю дохода, нанесенные
прямым или непрямым, специальным или случайным использованием
материалов курса. Компания Postgres Professional не предоставляет
каких-либо гарантий на материалы курса. Материалы курса
предоставляются на основе принципа «как есть» и компания Postgres
Professional не обязана предоставлять сопровождение, поддержку,
обновления, расширения и изменения.
2
Темы
Роли
Атрибуты
Владелец
Привилегии
Управление привилегиями
Передача права
Начальные привилегии
3
Роли
Роль — учетная запись СУБД и набор прав доступа
Определяется на уровне кластера
Не связана с учетной записью ОС
хотя многие программы используют имя пользователя ОС
как имя роли по умолчанию
PostgreSQL использует вариант ролевой модели доступа (Role-Based
Access Control, RBAC). В классической модели выделяются
пользователи (учетные записи) и назначаемые им роли, которые
определяют права пользователей. В PostgreSQL оба этих понятия
объединены и называются ролью. Таким образом, роль — это и учетная
запись СУБД, и набор прав доступа.
Роли задаются на уровне кластера: для всех баз данных набор ролей
одинаков. Клиент всегда подключается к базе данных от имени
некоторой роли. Формально роли (как учетные записи СУБД) никак не
связаны с учетными записями операционной системы, хотя многие
программы это предполагают, выбирая значения по умолчанию.
Например, psql, запущенный от имени пользователя ОС student,
автоматически использует одноименную роль student (если в ключах
утилиты не указана какая-либо другая роль).
4
Атрибуты
Права роли, не связанные с определенными объектами
LOGIN возможность подключения
SUPERUSER суперпользователь
CREATEDB возможность создавать базы данных
CREATEROLE возможность создавать роли
REPLICATION использование протокола репликации
и другие
Роль обладает атрибутами, которые определяют права доступа, не
связанные с определенными объектами баз данных.
Обычно атрибуты имеют два варианта, например, CREATEDB (дает
право на создание БД) и NOCREATEDB (не дает такого права).
Если у роли есть атрибут LOGIN, она имеет право подключаться
к серверу, то есть является пользователем. Атрибут NOLOGIN
запрещает подключение, то есть роль может использоваться только как
набор прав (который можно передать другим пользователям, о чем
будет говориться в следующей теме «Членство в ролях»).
На слайде перечислены некоторые атрибуты.
6
Привилегия и владелец
Привилегия
дает роли право на определенные действия с объектом
Владелец объекта
изначально — создавшая его роль, может быть переназначен
получает все привилегии для этого объекта
имеет право на действия, не регулируемые привилегиями
Привилегия на объект, полученная ролью, дает ей право на
определенные действия с этим объектом. Например, привилегия
SELECT на таблицу позволяет читать данные из нее.
Когда роль создает какой-либо объект, она по умолчанию становится
его владельцем. Для некоторых объектов команда создания позволяет
указать другого владельца. При необходимости владельца объекта
можно сменить командой ALTER с предложением OWNER TO.
Права на некоторые действия привилегиями не регулируются. Это,
например, удаление и изменение объекта, выдача и отзыв привилегий,
построение индекса по таблице. Помимо суперпользователей, такие
действия может выполнять только владелец, и лишить его этого права
нельзя.
В дополнение к таким неотъемлемым правам, при создании объекта
владелец получает все возможные привилегии на него. Формально эти
привилегии могут быть отозваны суперпользователем, однако владелец
всегда может их вернуть, поскольку имеет право на выдачу привилегий,
в том числе и самому себе.
8
Привилегии
Табличные пространства,
базы данных,
схемы
база данных
схема pg_temp
табличное
пр-во
таблица
таблица
объект
CREATE
USAGE
CREATE
таблица
таблица
объект
TEMPORARY
CREATE
CONNECT
Список возможных привилегий отличается для объектов различных
типов. Привилегии для основных объектов приведены на этом и
следующих слайдах.
Для табличных пространств есть привилегия CREATE, разрешающая
создание объектов в этом пространстве.
Для баз данных привилегия CREATE разрешает создавать схемы в этой
БД, а привилегия CONNECT разрешает подключение к этой базе
данных.
Привилегия USAGE схемы разрешает обращаться к объектам в этой
схеме, а для создания объектов в ней требуется привилегия CREATE.
Привилегия на создание временных таблиц вынесена на уровень БД
(TEMPORARY), поскольку точное имя схемы для временных объектов
заранее неизвестно.
9
Привилегии
Таблицы и представления
SELECT чтение данных
INSERT вставка строк
UPDATE изменение строк
REFERENCES внешний ключ (для таблиц)
DELETE удаление строк
TRUNCATE опустошение (для таблиц)
TRIGGER создание триггеров
Последовательности
SELECT currval
UPDATE nextval setval
USAGE currval nextval
можно на уровне столбцов
Больше всего привилегий существует для таблиц и представлений, они
показаны на слайде. Часть привилегий можно выдать не только для
всего отношения, но и для отдельных столбцов. В PostgreSQL 17
добавлена привилегия MAINTAIN, разрешающая выполнять с таблицей
служебные операции, такие как очистка, анализ, перестроение индекса
и другие.
Возможно, несколько неожиданный набор привилегий имеют
последовательности. Выбирая нужные, можно разрешить или запретить
доступ к трем управляющим функциям.
10
Привилегии
Подпрограммы
EXECUTE выполнение
Типы данных, языки, ...
USAGE использование
Параметры
ALTER SYSTEM изменение в кластере
SET изменение в сеансе
Набор привилегий для других объектов довольно прост.
Для подпрограмм единственная привилегия EXECUTE разрешает
выполнение функции или процедуры.
Для таких объектов, как тип данных, домен, язык, обертка сторонних
данных и внешний сервер, есть единственная привилегия USAGE,
разрешающая использовать объект. Эти виды объектов изучаются
в курсе DEV2 «Разработка серверной части PostgreSQL. Расширенный
курс».
Для параметров конфигурации привилегия SET дает право задать
значение на уровне сеанса, а привилегия ALTER SYSTEM —
в postgresql.auto.conf командой ALTER SYSTEM.
11
Управление привилегиями
Выдача привилегии
Отзыв привилегии
alice
bob
владелец
привилегии
на объект
alice
bob
Привилегии выдаются командой GRANT, а отзываются командой
REVOKE. Для выдачи и отзыва привилегии на объект нужно иметь на
это право. Изначально такое право есть у владельца.
Синтаксис команд GRANT и REVOKE достаточно сложен и позволяет
указывать как отдельные, так и все возможные привилегии; как
отдельные объекты, так и группы объектов, входящие в определенные
схемы и т. п. Можно указать одну или несколько ролей, а также
использовать ключевое слово PUBLIC; в последнем случае команда
действует на все роли кластера, в том числе и будущие.
13
Выдача привилегии с правом передачи
Право передачи
bob
charlie
dave
владелец
GRANT
OPTION
alice
привилегия
получена от двух
ролей
При выдаче привилегии можно передать роли право дальнейшей
передачи (и отзыва) этой привилегии с помощью команды GRANT
с предложением WITH GRANT OPTION.
Таким образом могут образовываться цепочки передачи привилегий;
переданные привилегии считаются зависимыми от передавшей их
роли. Причем одна привилегия может быть получена ролью несколько
раз от разных ролей (как ролью charlie на слайде).
14
Отзыв привилегии вместе с правом передачи
Отзыв только права передачи
Право передачи
bob
charlie
alice
dave
каскадный
отзыв
bob
charlie
alice
dave
каскадный
отзыв
GRANT
OPTION
Команда REVOKE отзывает привилегию вместе с правом передачи.
Роль может отозвать привилегию только у той роли, которой она
непосредственно выдала эту привилегию. Например, в ситуации,
показанной на слайде, alice не может отозвать привилегию у dave.
Однако при отзыве привилегии у роли bob также должны быть отозваны
и все зависимые привилегии: отзыв коснется всех ролей, которым эта
привилегия досталась через Боба. Для этого надо указать ключевое
слово CASCADE (без него команда завершится ошибкой, если Боб
успел передать привилегию кому-либо).
Право передачи можно отозвать, не отзывая у роли саму привилегию.
Это выполняется с помощью команды REVOKE GRANT OPTION FOR.
Слово CASCADE имеет здесь такое же значение, как и при отзыве
привилегии: поскольку Боб теперь не может передавать привилегию
другим ролям, все зависимые привилегии будут отозваны.
16
Начальные привилегии
Клонируемые объекты — привилегии в шаблонной БД
Новые объекты — привилегии по умолчанию
база данных CONNECT, TEMPORARY
подпрограмма EXECUTE
язык, домен, тип USAGE
При создании объекта ролям назначаются определенные привилегии
на него.
Поскольку базы данных клонируются из шаблонов, после создания
базы объекты в ней уже имеют определенный набор привилегий.
В частности, псевдороль PUBLIC, а вместе с ней и все роли, имеют
привилегию USAGE на схемы public и information_schema.
В PostgreSQL 14 и более ранних версиях псевдороль PUBLIC получала
на схему public еще и привилегию CREATE; такая конфигурация
небезопасна, поскольку позволяет подменить объект из схемы
pg_catalog собственным объектом. Подробности описаны в статье:
our_Search_Path
Для новых объектов начальные привилегии определяются их типом.
Для объектов некоторых типов псевдороль PUBLIC получает
определенный набор привилегий — эти ситуации приведены на слайде.
Привилегии по умолчанию на новые объекты можно настроить для
определенного владельца и схемы с помощью команды ALTER
DEFAULT PRIVILEGES. Механизм срабатывает при создании объекта
определенного класса в указанной (или любой) схеме определенным
пользователем.
18
Итоги
Роль — учетная запись СУБД и набор прав
Атрибуты определяют права роли,
не привязанные к объектам
Владелец объекта имеет неявные права на него
Привилегии определяют права доступа ролей к объектам
Привилегии можно передавать
Начальные привилегии на объект определяются шаблоном
базы данных или привилегиями по умолчанию
19
Практика
1. Создайте пользователей для Алисы и Боба.
2. Алиса создает две схемы: приватную alice и публичную app,
и дает Бобу право обращаться к объектам публичной схемы.
3. Алиса создает таблицу с целочисленным столбцом в схеме
app и дает Бобу привилегию на изменение ее строк.
Сможет ли Боб увеличить значения во всех строках таблицы
на единицу? А изменить значение всех строк на 42? Почему?
4. Алиса настраивает привилегии по умолчанию так, чтобы Боб
получал право чтения строк любой таблицы, созданной
Алисой в публичной схеме. Проверьте настройку.
20
Практика+
1. Создайте пользователя для Алисы и установите для него
нулевое значение параметра log_min_duration_statement.
2. Убедитесь, что все запросы Алисы записываются в журнал
сообщений и что Алиса не может отменить эту запись.
3. Выдайте Алисе разрешение изменять параметр в своем
сеансе. Убедитесь, что после этого она может отменить
запись своих запросов в журнал сообщений.