02 Занятие 02: Управление доступом / Членство в ролях
Эта страница извлечена из официального PDF в нативный Markdown. Текст слайдов, код и комментарии сохранены в порядке чтения; исходные PDF и HTML остаются эталоном макета. HTML source: dbs_02_access_membership.html Archive: DBS-handouts-16.zip Страниц PDF: 24
Page 1: Управление доступом / Членство в ролях
Авторские права
© Postgres Professional, 2017–2026 Авторы: Егор Рогов, Павел Лузанов, Илья Баштанов, Алексей Береснев Фото: Олег Бартунов (монастырь Пху и пик Бхрикути, Непал)
Использование материалов курса
Некоммерческое использование материалов курса (презентации, демонстрации) разрешается без ограничений. Коммерческое использование возможно только с письменного разрешения компании Postgres Professional. Запрещается внесение изменений в материалы курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу: edu@postgrespro.ru
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за любые повреждения и убытки, включая потерю дохода, нанесенные прямым или непрямым, специальным или случайным использованием материалов курса. Компания Postgres Professional не предоставляет каких-либо гарантий на материалы курса. Материалы курса предоставляются на основе принципа «как есть» и компания Postgres Professional не обязана предоставлять сопровождение, поддержку, обновления, расширения и изменения.
Page 2: Темы
- Включение роли в роль
- Способы получения прав на объект
- Наследование
- Переключение на роль
- Управление включением ролей
Page 3: Включение роли в роль
{#source-figure-003 caption=“Source slide page 3: Включение роли в роль”}
Включение в роль Исключение из роли
- dba
- alice
- Псевдороль PUBLIC неявно включает остальные роли
Комментарии преподавателя
Роль можно включить в другую роль. В таком случае вторая роль выступает в качестве группы и говорят, что первая роль становится членом второй. Роль может быть включена в несколько ролей; включенная роль может, в свою очередь, включать в себя третьи роли и т. д., но циклы при этом не допускаются.
Роль может быть одновременно «пользовательской» (иметь атрибут LOGIN) и «групповой» (включать другие роли).
В кластере существует также псевдороль PUBLIC, которая неявно включает в себя все остальные роли.
https://postgrespro.ru/docs/postgresql/16/role-membership
Page 4: Получение прав на объект
Суперпользовательский доступ
- суперпользователи не ограничены в действиях, за исключением удаления начального суперпользователя Владение
- Обладание привилегией
- Членство в группе
- INHERIT
- наследование прав групповой роли
- SET
- переключение на групповую роль
- ADMIN
- управление членством в групповой роли
Комментарии преподавателя
В целом у роли есть несколько вариантов получить право на действия с определенным объектом.
Суперпользователи (роли с атрибутом SUPERUSER) — особый случай, для них проверки прав доступа не выполняются. При этом нельзя удалить начальную суперпользовательскую роль или лишить ее атрибута SUPERUSER. Начальный суперпользователь (bootstrap superuser) создается при создании кластера баз данных.
Становясь владельцем объекта, роль получает право выполнять с ним практически любые действия.
Помимо этого, у роли может возникнуть право на действие с объектом, если она получит привилегию на объект (автоматически при создании объекта или явно).
И наконец, роль может получить дополнительные права при включении в другую роль. При включении можно указать любую комбинацию параметров членства:
● INHERIT включает наследование прав групповой роли на действия с объектами;
● SET позволяет переключаться на групповую роль;
● ADMIN дает право включать в группу другие роли, изменять атрибуты членства в группе и исключать роли из группы.
Параметры INHERIT и SET появились в PostgreSQL 16.
Page 5: Наследование
{#source-figure-005 caption=“Source slide page 5: Наследование”}
Атрибуты не наследуются
- Права на объекты наследуются
- если роль входит в группу с параметром членства INHERIT
- grp1
- grp2
- grp3
Комментарии преподавателя
Если роль включена в другую роль, она может наследовать права на объекты, которыми обладает группа благодаря привилегиям или владению. Атрибуты ролей никогда не наследуются.
Роль может наследовать права на объекты от нескольких ролей, как при непосредственном включении в несколько групп, так и по цепочке включений. Наследуются не только права, которыми непосредственно обладает группа, но и права, которые она сама унаследовала.
Наследование срабатывает, когда роль включена в группу с параметром членства INHERIT. По умолчанию именно так и происходит, поскольку команда GRANT берет значение параметра INHERIT из одноименного атрибута включаемой роли, а при создании роли этот атрибут по умолчанию устанавливается. Однако параметр можно установить и явно, переопределив атрибут. Для этого надо указать в команде GRANT предложение WITH INHERIT.
Page 6: Наследование
Зарегистрируем роли Алисы и Боба.
Алиса будет владельцем базы данных:
Алиса подключается к БД и создает таблицу в схеме public.
Включим Боба в роль Алисы:
Параметры членства ролей в группах можно увидеть в системном каталоге:
Заметьте, что в сеансе student включение в роль выполнено от имени начального суперпользователя postgres. В этом случае не возникает зависимость от роли student, которая затруднит ее удаление. Последний столбец показывает параметр членства INHERIT. Он унаследован от атрибута INHERIT роли bob, который у нее включен по умолчанию. Поэтому Боб, подключившись, сможет прочитать таблицу.
Убедиться, что привилегии Алисы унаследованы Бобом, можно и с помощью системной функции. Ее вызов с параметром USAGE показывает, наследует ли текущий пользователь привилегии роли alice:
Можно задать параметр членства явно:
Что будет, если лишить роль Боба атрибута INHERIT?
Page 7: Page 7
{#source-figure-007 caption=“Source slide page 7: Page 7”}
Наследование обеспечивается параметром членства INHERIT, поэтому Боб по-прежнему может читать содержимое таблицы:
Параметр появился в PostgreSQL 16, в более ранних версиях отмена атрибута привела бы к потере наследования. Заметьте, что наследуются и права, которые дает владение, поэтому Боб может, например, изменить таблицу:
Page 8: Переключение на роль
{#source-figure-008 caption=“Source slide page 8: Переключение на роль”}
Параметр членства SET
- Переключение на роль Возврат к исходной роли
Комментарии преподавателя
Параметр членства SET позволяет выполнить команду SET ROLE и (временно) переключиться на групповую роль со всеми ее атрибутами и привилегиями на объекты. Все действия будут выполняться от имени групповой роли и создаваемые объекты будут принадлежать групповой роли. Права исходной роли при этом недоступны. Параметр появился в PostgreSQL 16, до этого переключение на групповую роль разрешалось всегда.
Имя пользователя, подключившегося к серверу, возвращает функция session_user. А имя текущей роли можно узнать с помощью функции current_user (или current_role, что одно и то же).
https://postgrespro.ru/docs/postgresql/16/functions-info#FUNCTIONS-INFO-SESSION
Page 9: Переключение на роль
{#source-figure-009 caption=“Source slide page 9: Переключение на роль”}
Удалим параметр INHERIT членства роли bob в группе alice:
Членство ролей в группах и параметры членства удобно проверять с помощью метакоманды \drg:
Привилегии отозваны немедленно:
Оставшийся параметр членства SET позволяет члену группы переключиться на групповую роль:
Теперь все действия в сеансе Боба происходят от имени Алисы. Узнать имена текущей роли и роли, начавшей сеанс, можно с помощью функций:
Боб может, например, от имени Алисы выдать себе все привилегии на таблицу:
При переключении роль также получает атрибуты групповой роли. Добавим роли alice атрибут, разрешающий создавать базы данных:
Обладает ли теперь Боб, переключивший свой сеанс на роль Алисы, правом создавать базы данных?
Page 10: Page 10
Да, право есть. Вернемся к исходной роли сеанса:
Суперпользователь может использовать другую команду для переключения на любую роль:
Такой подход позволяет, например, тестировать работу под разными пользователями без необходимости подключаться к серверу под каждым из них (подробнее об этом пойдет речь в модуле «Методы аутентификации»). Обратите внимание, что имя пользователя, начавшего сеанс, скрыто:
Вернем сеанс суперпользователя к исходной роли:
Page 11: Управление членством
{#source-figure-011 caption=“Source slide page 11: Управление членством”}
Параметр членства ADMIN
- включение в группу
- исключение из группы
- изменение параметров членства
- alice
Комментарии преподавателя
Управлять включением ролей в группу (а также исключением ролей из группы и изменением параметров членства ролей в группе) могут те члены группы, которые имеют в ней параметр членства ADMIN.
Роль не может иметь параметр членства ADMIN сама в себе, поэтому не может управлять включением в себя других ролей.
Суперпользователи могут управлять включением любых ролей в любые.
Page 12: Управление включением
{#source-figure-012 caption=“Source slide page 12: Управление включением”}
Зарегистрируем еще роль для Чарли:
Если роль входит в группу с параметром ADMIN, она может добавлять в группу другие роли:
Обладая параметром членства ADMIN в группе Алисы, Боб теперь может включить Чарли в эту группу:
По умолчанию параметр SET устанавливается, а параметр INHERIT, как мы уже видели, наследуется от атрибута INHERIT включаемой роли. Параметр членства ADMIN в группе Алисы дает Бобу право изменять параметры членства других ролей в этой группе:
Включать в свою группу другие роли Боб не может:
Page 13: Каскадное исключение
{#source-figure-013 caption=“Source slide page 13: Каскадное исключение”}
Лишение членства в роли с параметром ADMIN
- bob
Комментарии преподавателя
Когда пользователь лишается членства в роли, которым он обладал с параметром ADMIN, членства должны лишиться и другие роли, которым оно было предоставлено этим пользователем. В этом случае в команде REVOKE необходимо указать ключевое слово CASCADE, иначе будет зафиксирована ошибка.
Такое лишение членства действует рекурсивно, точно так же, как при отзыве права передачи привилегии GRANT OPTION, которое рассматривалось в предыдущей теме.
https://postgrespro.ru/docs/postgresql/16/sql-revoke
Page 14: Каскадное исключение
Боб был включен в группу Алисы с правом управления и воспользовался им:
Поэтому нельзя просто так исключить его из группы:
Но можно, используя ключевое слово CASCADE, удалить Боба из группы вместе со всеми, кого тот успел включить в группу Алисы:
Можно было бы отозвать у Боба право управления, не исключая его из группы Алисы, но при этом все равно пришлось бы указать CASCADE. Роль можно удалить, если она не владеет объектами. Просто так удалить Алису и Боба не получится:
Можно удалить объекты, принадлежащие роли, если они не нужны:
Если же удалить объекты нельзя, можно передать их другому владельцу:
В общем случае (без прав суперпользователя) для смены владельца командой REASSIGN OWNED BY или ALTER … OWNER TO нужен параметр членства SET в роли нового владельца.
Page 15: Итоги
Роли можно включать друг в друга
- Права на объекты приобретаются за счет привилегий, владения и членства в группах
- Параметры членства определяют порядок передачи прав при включении
Page 16: Практика
- Создайте роль для Алисы, включив ее в суперпользователь-скую роль с параметром SET. Все дальнейшие действия выполняются в сеансе Алисы.
- Создайте пользователя Боб — члена группы readers — и пользователя Чарли — члена группы writers. Оба включения выполнены с параметром INHERIT (без SET).
- Создайте таблицу в отдельной схеме, выдайте роли readers привилегию на ее чтение, а роли writers — на изменение.
- Проверьте, могут ли Алиса, Боб и Чарли читать и менять строки таблицы.
Page 17: 1. Роль Алисы
Эта команда эквивалентна двум следующим:
2. Пользователи и группы
Создадим группы readers и writers.
Боб — читатель.
Чарли — писатель.
Вот что получилось:
3. База данных, схема и таблица
Page 18: Page 18
Привилегии:
4. Права на таблицу
Алиса может читать и менять строки, поскольку является владельцем:
Боб может читать:
Но не может менять:
Чарли может менять строки:
Но не читать их:
Уборка
Page 19: Page 19
Page 20: Практика+
Изучите способы получения метаинформации.
- Создайте роли, схему и таблицу, как это сделано в Практике.
- Получите: список объектов Алисы; права пользователей на эти объекты; список ролей, имеющих право чтения таблицы; информацию о включении ролей в группы.
- Может ли пользователь Дейв, не имеющий доступа к объектам, увидеть эту метаинформацию?
Комментарии преподавателя
2, 3. Для получения метаинформации можно использовать следующие источники:
● системный каталог https://postgrespro.ru/docs/postgresql/16/catalogs;
● системные информационные функции https://postgrespro.ru/docs/postgresql/16/functions-info;
● метакоманды psql https://postgrespro.ru/docs/postgresql/16/app-psql#:~:text=удаляет%20п еред%20отправкой.-,Метакоманды,-Всё%2C%20что%20вводится
● информационную схему https://postgrespro.ru/docs/postgresql/16/information-schema.
Page 21: 1. Роли, схема, таблица
Роль Алисы.
Группы readers и writers.
Боб — читатель.
Чарли — писатель.
Вот что получилось:
База данных и таблица.
Привилегии.
Page 22: 2. Метаинформация
Получим информацию от имени суперпользователя.
В системном каталоге можно увидеть список схем:
А также список объектов Алисы с привилегиями на них:
Получить список ролей, имеющих право чтения таблицы, можно с помощью функции:
А сведения о включении ролей — используя другую функцию:
Более подробную информацию о включении дает метакоманда psql:
Page 23: Page 23
В некоторых случаях полезна информационной схема: например, доступные текущему пользователю таблицы показывает представление tables.
3. Обычный пользователь
Дейв не имеет доступа к схеме и таблице:
Однако он видит список всех таблиц:
Список ролей, имеющих право чтения таблицы, тоже доступен (используем oid вместо имени, так как доступа к схеме нет):
Пользователь может получить и информацию о включении ролей: