01 Занятие 01: Управление доступом / Роли и привилегии
Эта страница извлечена из официального PDF в нативный Markdown. Текст слайдов, код и комментарии сохранены в порядке чтения; исходные PDF и HTML остаются эталоном макета. HTML source: dbs_01_access_roles.html Archive: DBS-handouts-16.zip Страниц PDF: 30
Page 1: Управление доступом / Роли и привилегии
Авторские права
© Postgres Professional, 2017–2026 Авторы: Егор Рогов, Павел Лузанов, Илья Баштанов, Алексей Береснев Фото: Олег Бартунов (монастырь Пху и пик Бхрикути, Непал)
Использование материалов курса
Некоммерческое использование материалов курса (презентации, демонстрации) разрешается без ограничений. Коммерческое использование возможно только с письменного разрешения компании Postgres Professional. Запрещается внесение изменений в материалы курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу: edu@postgrespro.ru
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за любые повреждения и убытки, включая потерю дохода, нанесенные прямым или непрямым, специальным или случайным использованием материалов курса. Компания Postgres Professional не предоставляет каких-либо гарантий на материалы курса. Материалы курса предоставляются на основе принципа «как есть» и компания Postgres Professional не обязана предоставлять сопровождение, поддержку, обновления, расширения и изменения.
Page 2: Темы
- Роли
- Атрибуты
- Владелец
- Привилегии
- Управление привилегиями
- Передача права
- Начальные привилегии
Page 3: Роли
Роль — учетная запись СУБД и набор прав доступа
- Определяется на уровне кластера
- Не связана с учетной записью ОС
- хотя многие программы используют имя пользователя ОС
- как имя роли по умолчанию
Комментарии преподавателя
PostgreSQL использует вариант ролевой модели доступа (Role-Based Access Control, RBAC). В классической модели выделяются пользователи (учетные записи) и назначаемые им роли, которые определяют права пользователей. В PostgreSQL оба этих понятия объединены и называются ролью. Таким образом, роль — это и учетная запись СУБД, и набор прав доступа.
Роли задаются на уровне кластера: для всех баз данных набор ролей одинаков. Клиент всегда подключается к базе данных от имени некоторой роли. Формально роли (как учетные записи СУБД) никак не связаны с учетными записями операционной системы, хотя многие программы это предполагают, выбирая значения по умолчанию. Например, psql, запущенный от имени пользователя ОС student, автоматически использует одноименную роль student (если в ключах утилиты не указана какая-либо другая роль).
https://postgrespro.ru/docs/postgresql/16/database-roles
Page 4: Атрибуты
Права роли, не связанные с определенными объектами
- LOGIN
- возможность подключения
- SUPERUSER
- суперпользователь
- CREATEDB
- возможность создавать базы данных
- CREATEROLE
- возможность создавать роли
- REPLICATION
- использование протокола репликации
- и другие
Комментарии преподавателя
Роль обладает атрибутами, которые определяют права доступа, не связанные с определенными объектами баз данных.
Обычно атрибуты имеют два варианта, например, CREATEDB (дает право на создание БД) и NOCREATEDB (не дает такого права).
Если у роли есть атрибут LOGIN, она имеет право подключаться к серверу, то есть является пользователем. Атрибут NOLOGIN запрещает подключение, то есть роль может использоваться только как набор прав (который можно передать другим пользователям, о чем будет говориться в следующей теме «Членство в ролях»).
На слайде перечислены некоторые атрибуты.
https://postgrespro.ru/docs/postgresql/16/role-attributes
https://postgrespro.ru/docs/postgresql/16/sql-createrole
Page 5: Роли и атрибуты
Сейчас в кластере две пользовательские роли:
postgres — начальный суперпользователь, создается при инициализации кластера, удалить его нельзя, student — тоже суперпользователь, создан для курса, большинство действий в демонстрациях выполняется от его имени; Создадим базу данных:
Создадим роль для пользователя Алисы с несколькими атрибутами:
Атрибуты роли alice: LOGIN — имеет право подключаться, то есть является пользовательской; CONNECTION LIMIT 1 — не более одного соединения. Обратите внимание, что наличие атрибута LOGIN не показывается. Алиса может подключиться к базе данных:
Но это подключение — единственное возможное для нее:
Алиса не имеет атрибута CREATEROLE, поэтому она не может создать роль для Боба:
Придется использовать сеанс роли с атрибутом SUPERUSER.
Page 6: Page 6
Роль для Боба создана, теперь он может подключаться:
Существующие роли можно изменять. Например, student может отобрать у Боба право входа:
Метакоманда \du не показывает атрибут LOGIN, но показывает его отсутствие:
Вернем Бобу право подключаться к базам данных кластера:
Теперь он снова может начать сеанс:
А Алису освободим от ограничения на количество сеансов:
Page 7: Привилегия и владелец
Привилегия
- дает роли право на определенные действия с объектом Владелец объекта
- изначально — создавшая его роль, может быть переназначен
- получает все привилегии для этого объекта
- имеет право на действия, не регулируемые привилегиями
Комментарии преподавателя
Привилегия на объект, полученная ролью, дает ей право на определенные действия с этим объектом. Например, привилегия SELECT на таблицу позволяет читать данные из нее.
Когда роль создает какой-либо объект, она по умолчанию становится его владельцем. Для некоторых объектов команда создания позволяет указать другого владельца. При необходимости владельца объекта можно сменить командой ALTER с предложением OWNER TO.
Права на некоторые действия привилегиями не регулируются. Это, например, удаление и изменение объекта, выдача и отзыв привилегий, построение индекса по таблице. Помимо суперпользователей, такие действия может выполнять только владелец, и лишить его этого права нельзя.
В дополнение к таким неотъемлемым правам, при создании объекта владелец получает все возможные привилегии на него. Формально эти привилегии могут быть отозваны суперпользователем, однако владелец всегда может их вернуть, поскольку имеет право на выдачу привилегий, в том числе и самому себе.
Page 8: Владелец
Создадим схему alice, сразу назначив владельца:
Алиса может создавать объекты в своей схеме:
Как владелец, Алиса имеет право на все действия с таблицей, например, построить индекс:
Поменяем владельца таблицы:
Теперь Алиса не может перестроить индекс:
Это право привилегиями не регулируется.
Page 9: Привилегии
{#source-figure-009 caption=“Source slide page 9: Привилегии”}
Табличные пространства, базы данных, схемы
Комментарии преподавателя
Список возможных привилегий отличается для объектов различных типов. Привилегии для основных объектов приведены на этом и следующих слайдах.
Для табличных пространств есть привилегия CREATE, разрешающая создание объектов в этом пространстве.
Для баз данных привилегия CREATE разрешает создавать схемы в этой БД, а привилегия CONNECT разрешает подключение к этой базе данных.
Привилегия USAGE схемы разрешает обращаться к объектам в этой схеме, а для создания объектов в ней требуется привилегия CREATE.
Привилегия на создание временных таблиц вынесена на уровень БД (TEMPORARY), поскольку точное имя схемы для временных объектов заранее неизвестно.
https://postgrespro.ru/docs/postgresql/16/ddl-priv#PRIVILEGES-SUMMARY-TABLE
Page 10: Привилегии
Таблицы и представления
- SELECT
- чтение данных
- INSERT
- вставка строк
- можно на уровне столбцов
- UPDATE
- изменение строк
- REFERENCES
- внешний ключ (для таблиц)
- DELETE
- удаление строк
- TRUNCATE
- опустошение (для таблиц)
- TRIGGER
- создание триггеров
- Последовательности
- SELECT
- currval
- UPDATE
- nextval
- setval
- USAGE
- currval
- nextval
Комментарии преподавателя
Больше всего привилегий существует для таблиц и представлений, они показаны на слайде. Часть привилегий можно выдать не только для всего отношения, но и для отдельных столбцов. В PostgreSQL 17 добавлена привилегия MAINTAIN, разрешающая выполнять с таблицей служебные операции, такие как очистка, анализ, перестроение индекса и другие.
Возможно, несколько неожиданный набор привилегий имеют последовательности. Выбирая нужные, можно разрешить или запретить доступ к трем управляющим функциям.
https://postgrespro.ru/docs/postgresql/16/ddl-priv
Page 11: Привилегии
Подпрограммы
- EXECUTE
- выполнение
- Типы данных, языки, …
- USAGE
- использование
- Параметры
- ALTER SYSTEM
- изменение в кластере
- SET
- изменение в сеансе
Комментарии преподавателя
Набор привилегий для других объектов довольно прост.
Для подпрограмм единственная привилегия EXECUTE разрешает выполнение функции или процедуры.
Для таких объектов, как тип данных, домен, язык, обертка сторонних данных и внешний сервер, есть единственная привилегия USAGE, разрешающая использовать объект. Эти виды объектов изучаются в курсе DEV2 «Разработка серверной части PostgreSQL. Расширенный курс».
Для параметров конфигурации привилегия SET дает право задать значение на уровне сеанса, а привилегия ALTER SYSTEM — в postgresql.auto.conf командой ALTER SYSTEM.
Page 12: Управление привилегиями
{#source-figure-012 caption=“Source slide page 12: Управление привилегиями”}
Выдача привилегии
- alice
- bob
- Отзыв привилегии
- alice
- bob
Комментарии преподавателя
Привилегии выдаются командой GRANT, а отзываются командой REVOKE. Для выдачи и отзыва привилегии на объект нужно иметь на это право. Изначально такое право есть у владельца.
Синтаксис команд GRANT и REVOKE достаточно сложен и позволяет указывать как отдельные, так и все возможные привилегии; как отдельные объекты, так и группы объектов, входящие в определенные схемы и т. п. Можно указать одну или несколько ролей, а также использовать ключевое слово PUBLIC; в последнем случае команда действует на все роли кластера, в том числе и будущие.
https://postgrespro.ru/docs/postgresql/16/sql-grant
https://postgrespro.ru/docs/postgresql/16/sql-revoke
Page 13: Привилегии
{#source-figure-013 caption=“Source slide page 13: Привилегии”}
Алиса создает пару таблиц:
А Боб пытается обратиться к таблицам Алисы:
Не получилось: у Боба нет привилегий на схему Алисы, по умолчанию их имеет только владелец:
Метакоманды не отображают начальный набор привилегий, выданных при создании объекта, но его можно увидеть с помощью функции:
Привилегии выводятся как массив значений в формате: роль=привилегии/кем_предоставлены. При создании объекта владелец получает привилегии от самого себя. Привилегии обозначаются одной буквой. Для схем: U = usage — право обращаться к объектам схемы; C = create — право создавать объекты в схеме. Алиса выдает Бобу привилегию на доступ к объектам схемы:
Теперь метакоманда покажет выданные привилегии:
Боб повторяет попытку обратиться к таблице alice.t1:
Теперь Бобу не хватает прав на чтение таблицы. Алиса выдает привилегию:
Page 14: Page 14
{#source-figure-014 caption=“Source slide page 14: Page 14”}
Посмотрим, какие привилегии установлены:
Видим, что привилегии Бобу предоставила Алиса. Обозначения привилегий для таблиц (не вполне очевидные): a = insert; r = select; w = update; d = delete; D = truncate; x = reference; t = trigger. Теперь Боб может прочитать содержимое таблицы:
Но, например, добавить строку в таблицу он не сможет:
Некоторые привилегии можно выдать на определенные столбцы:
Теперь Боб может добавлять строки в t2:
А читать сможет только один столбец:
Если необходимо, Алиса может выдать Бобу все привилегии, не перечисляя их явно:
Page 15: Page 15
{#source-figure-015 caption=“Source slide page 15: Page 15”}
Теперь Бобу доступны все действия, например, удаление строк:
Однако удалить таблицу он не может, поскольку привилегии для этого не существует:
Page 16: Право передачи
{#source-figure-016 caption=“Source slide page 16: Право передачи”}
Выдача привилегии с правом передачи
- alice
Комментарии преподавателя
При выдаче привилегии можно передать роли право дальнейшей передачи (и отзыва) этой привилегии с помощью команды GRANT с предложением WITH GRANT OPTION.
Таким образом могут образовываться цепочки передачи привилегий; переданные привилегии считаются зависимыми от передавшей их роли. Причем одна привилегия может быть получена ролью несколько раз от разных ролей (как ролью charlie на слайде).
Page 17: Право передачи
{#source-figure-017 caption=“Source slide page 17: Право передачи”}
Отзыв привилегии вместе с правом передачи
- alice
- Отзыв только права передачи
- alice
Комментарии преподавателя
Команда REVOKE отзывает привилегию вместе с правом передачи. Роль может отозвать привилегию только у той роли, которой она непосредственно выдала эту привилегию. Например, в ситуации, показанной на слайде, alice не может отозвать привилегию у dave.
Однако при отзыве привилегии у роли bob также должны быть отозваны и все зависимые привилегии: отзыв коснется всех ролей, которым эта привилегия досталась через Боба. Для этого надо указать ключевое слово CASCADE (без него команда завершится ошибкой, если Боб успел передать привилегию кому-либо).
Право передачи можно отозвать, не отзывая у роли саму привилегию. Это выполняется с помощью команды REVOKE GRANT OPTION FOR. Слово CASCADE имеет здесь такое же значение, как и при отзыве привилегии: поскольку Боб теперь не может передавать привилегию другим ролям, все зависимые привилегии будут отозваны.
Page 18: Право передачи
{#source-figure-018 caption=“Source slide page 18: Право передачи”}
Создадим третью роль, для Чарли.
У Боба есть полный доступ к t1, принадлежащей Алисе:
Но Боб не может передать свою привилегию Чарли:
Заметьте, что команда завершилась успешно, однако при этом ничего не сделала. В подобных случаях PostgreSQL может выдавать предупреждение, но рассчитывать на него не стоит. Чтобы Боб мог передать привилегию, Алиса, владелец таблицы, должна выдать Бобу разрешение.
Звездочки справа от символов привилегий показывают право передачи. Теперь Боб может поделиться с Чарли привилегиями, в том числе и правом передачи:
Роль может получить одну и ту же привилегию от разных ролей. Обратите внимание: если привилегию выдает суперпользователь, она выдается от имени владельца.
Page 19: Page 19
{#source-figure-019 caption=“Source slide page 19: Page 19”}
Роль может отозвать привилегию или право передачи только у той роли, которой она их непосредственно выдала. Например, Алиса не сможет отозвать право передачи у Чарли, потому что она его не выдавала.
Никакой ошибки не фиксируется, но и права не изменяются:
В то же время Алиса не может просто так отозвать привилегии у Боба, если он успел передать их кому-либо еще:
В таком случае надо отзывать и все переданные Бобом привилегии с помощью CASCADE:
Как видим, у Боба пропало право передачи привилегии, а у Чарли была отозвана и сама привилегия, поскольку она досталась Чарли только от Боба. Аналогично можно отозвать по иерархии и привилегию:
Page 20: Начальные привилегии
Клонируемые объекты — привилегии в шаблонной БД
- Новые объекты — привилегии по умолчанию
- база данных
- CONNECT, TEMPORARY
- подпрограмма
- EXECUTE
- язык, домен, тип
- USAGE
Комментарии преподавателя
При создании объекта ролям назначаются определенные привилегии на него.
Поскольку базы данных клонируются из шаблонов, после создания базы объекты в ней уже имеют определенный набор привилегий. В частности, псевдороль PUBLIC, а вместе с ней и все роли, имеют привилегию USAGE на схемы public и information_schema.
В PostgreSQL 14 и более ранних версиях псевдороль PUBLIC получала на схему public еще и привилегию CREATE; такая конфигурация небезопасна, поскольку позволяет подменить объект из схемы pg_catalog собственным объектом. Подробности описаны в статье:
https://wiki.postgresql.org/wiki/A\_Guide\_to\_CVE-2018-1058%3A\_Protect\_Y our_Search_Path
Для новых объектов начальные привилегии определяются их типом. Для объектов некоторых типов псевдороль PUBLIC получает определенный набор привилегий — эти ситуации приведены на слайде.
Привилегии по умолчанию на новые объекты можно настроить для определенного владельца и схемы с помощью команды ALTER DEFAULT PRIVILEGES. Механизм срабатывает при создании объекта определенного класса в указанной (или любой) схеме определенным пользователем.
https://postgrespro.ru/docs/postgresql/16/ddl-priv.html#PRIVILEGES-SUMM ARY-TABLE
https://postgrespro.ru/docs/postgresql/16/sql-alterdefaultprivileges
Page 21: Начальные привилегии
Посмотрим на привилегии, выданные на схемы:
Слева от некоторых знаков равенства нет имени роли — это означает, что привилегии на схему public и две схемы системного каталога выданы псевдороли PUBLIC. Привилегии были выданы в шаблонной базе template1 и скопированы в базу access_roles при ее создании. Алиса создает простую функцию (она попадет в схему alice):
Псевдороль PUBLIC автоматически получает привилегию EXECUTE для любой создаваемой функции. Поэтому, например, Боб может выполнить функцию, которую только что создала Алиса.
Если это нежелательно, можно отозвать привилегию EXECUTE у псевдороли PUBLIC и выдавать ее явно только нужным ролям:
Однако на вновь создаваемые функции привилегия EXECUTE опять будет выдана всем ролям.
И Боб сможет выполнить новую функцию Алисы:
Page 22: Page 22
{#source-figure-022 caption=“Source slide page 22: Page 22”}
При создании объекта на него выдается определенный набор начальных привилегий. Набор по умолчанию показывает функция acldefault:
Обратите внимание, что набор содержит привилегию EXECUTE для псевдороли PUBLIC. Если Алиса не хочет автоматически разрешать всем ролям выполнять свои функции, она может исключить привилегию из начального набора:
Можно и наоборот, выдавать дополнительные привилегии:
Настроенные привилегии по умолчанию показывает метакоманда:
Теперь выполнение новых функций будет доступно только Алисе, а Боб будет получать доступ на чтение ко всем новым таблицам Алисы. Проверим.
Page 23: Page 23
Page 24: Итоги
Роль — учетная запись СУБД и набор прав
- Атрибуты определяют права роли, не привязанные к объектам
- Владелец объекта имеет неявные права на него
- Привилегии определяют права доступа ролей к объектам
- Привилегии можно передавать
- Начальные привилегии на объект определяются шаблоном базы данных или привилегиями по умолчанию
Page 25: Практика
- Создайте пользователей для Алисы и Боба.
- Алиса создает две схемы: приватную alice и публичную app, и дает Бобу право обращаться к объектам публичной схемы.
- Алиса создает таблицу с целочисленным столбцом в схеме app и дает Бобу привилегию на изменение ее строк. Сможет ли Боб увеличить значения во всех строках таблицы на единицу? А изменить значение всех строк на 42? Почему?
- Алиса настраивает привилегии по умолчанию так, чтобы Боб получал право чтения строк любой таблицы, созданной Алисой в публичной схеме. Проверьте настройку.
Page 26: 1. Роли
Зарегистрируем роли Алисы и Боба с правом подключения.
2. Схемы
Приватная схема:
Публичная схема:
3. Таблица
Так не работает:
А так — работает:
Дело в том, что привилегия UPDATE дает право изменять значения столбцов, но не позволяет прочитать текущие значения. Поэтому привилегию UPDATE (как и DELETE) обычно выдают вместе с SELECT:
Page 27: 4. Привилегии по умолчанию
{#source-figure-027 caption=“Source slide page 27: 4. Привилегии по умолчанию”}
Проверяем:
Уборка
Page 28: Практика+
- Создайте пользователя для Алисы и установите для него нулевое значение параметра log_min_duration_statement.
- Убедитесь, что все запросы Алисы записываются в журнал сообщений и что Алиса не может отменить эту запись.
- Выдайте Алисе разрешение изменять параметр в своем сеансе. Убедитесь, что после этого она может отменить запись своих запросов в журнал сообщений.
Page 29: 1. Пользователь и значение параметра
2. Сеанс Алисы
Действия Алисы записываются в журнал сообщений:
И Алиса не может отменить эту запись:
3. Привилегия на параметр
Дадим Алисе право менять значение параметра в текущем сеансе:
Теперь она может избавиться от записи своих действий.
Уборка
Удалить роль Алисы сейчас нельзя, от нее зависит привилегия на параметр:
Придется сначала удалить привилегию.