04 Занятие 04: Управление доступом / Подходы к настройке
Эта страница извлечена из официального PDF в нативный Markdown. Текст слайдов, код и комментарии сохранены в порядке чтения; исходные PDF и HTML остаются эталоном макета. HTML source: dbs_04_access_use_cases.html Archive: DBS-handouts-16.zip Страниц PDF: 27
Page 1: Управление доступом / Подходы к настройке
Авторские права
© Postgres Professional, 2017–2026 Авторы: Егор Рогов, Павел Лузанов, Илья Баштанов, Алексей Береснев Фото: Олег Бартунов (монастырь Пху и пик Бхрикути, Непал)
Использование материалов курса
Некоммерческое использование материалов курса (презентации, демонстрации) разрешается без ограничений. Коммерческое использование возможно только с письменного разрешения компании Postgres Professional. Запрещается внесение изменений в материалы курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу: edu@postgrespro.ru
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за любые повреждения и убытки, включая потерю дохода, нанесенные прямым или непрямым, специальным или случайным использованием материалов курса. Компания Postgres Professional не предоставляет каких-либо гарантий на материалы курса. Материалы курса предоставляются на основе принципа «как есть» и компания Postgres Professional не обязана предоставлять сопровождение, поддержку, обновления, расширения и изменения.
Page 2: Темы
- Администрирование без прав суперпользователя
- Примеры организации доступа
Page 3: Без суперпользователя
Административные роли
- Предопределенные роли
- Управление ролями
Page 4: Административные роли
Не имеют атрибута суперпользователя
- Используются для отдельных действий по сопровождению
- административные атрибуты
- параметр членства ADMIN
- предопределенные роли
- привилегии на параметры сервера
- привилегии на системные функции
Комментарии преподавателя
Традиционное администрирование баз данных средствами суперпользователя удобно отсутствием каких-либо ограничений. Однако в этом случае администратор имеет полный доступ ко всем данным, а любая его ошибка может стать фатальной для системы. Так же и злоумышленник или вредоносное ПО, получив максимальные права, смогут прочитать любую информацию, повредить данные или даже разрушить систему. Поэтому в производственной среде для выполнения конкретных действий по сопровождению часто определяют отдельные административные роли.
Дать административные права таким ролям можно с помощью:
● атрибутов CREATEDB, CREATEROLE, BYPASSRLS, REPLICATION;
● параметра членства ADMIN;
● предопределенных ролей;
● привилегий на изменение параметров сервера;
● привилегий на отдельные системные функции;
● привилегии MAINTAIN на отдельные таблицы для выполнения административных команд, таких как VACUUM (начиная с PostgreSQL 17).
Большинство из этих возможностей были рассмотрены в предыдущих темах курса.
Page 5: Предопределенные роли
Мониторинг
- Чтение любых параметров настройки
- Выполнение задач обслуживания
- Владение базами данных
- Доступ к любым таблицам на чтение или запись
- Доступ к любым файлам сервера на чтение или запись
- Передача сигналов обслуживающим процессам
- …
Комментарии преподавателя
В PostgreSQL имеется набор предопределенных ролей, дающих доступ к часто востребованным, но не общедоступным функциям и данным.
Имеются роли, которые позволяют обращаться к любым таблицам независимо от факта владения и наличия привилегий, разрешают доступ к файлам и программам на сервере (разумеется, от имени пользователя ОС postgres, под которым выполняется обслуживающий процесс), позволяют завершать обслуживающие процессы и т. д.
https://postgrespro.ru/docs/postgresql/16/predefined-roles
Page 6: Предопределенные роли
Вот список всех ролей кластера:
Роль postgres — начальный суперпользователь — была создана при инициализации кластера. Вторая суперпользовательская роль, student, совпадает по имени с пользователем ОС. Она добавлена, чтобы можно было вызывать psql без параметров. Эта роль владеет одноименной базой, к которой подключен наш сеанс:
Предопределенная роль pg_database_owner неявно включает в себя владельца базы данных и не может включать другие роли. Она удобна для настройки шаблонной базы, поскольку может владеть объектами. В частности, ей принадлежит схема public:
Роль pg_monitor удобно использовать для средств мониторинга, она включает в себя три другие предопределенные роли для доступа к значениям конфигурационных параметров, чтения статистических представлений и выполнения функций, связанных с блокировками:
Page 7: Page 7
Предопределенная роль pg_use_reserved_connections позволяет дать приоритет включенным в нее ролям, когда число открытых соединений с сервером приближается к максимальному.
Всего возможно не более max_connections клиентских соединений. Последние reserved_connections + superuser_reserved_connections доступных соединений могут использовать только суперпользователи и члены роли pg_use_reserved_connections. Однако если осталось superuser_reserved_connections соединений или меньше, подключиться смогут только суперпользователи.
Page 8: Управление ролями
Атрибут CREATEROLE
- создание, изменение и удаление ролей
- членство с параметром ADMIN в созданных ролях
- bob
ADMIN
- alice
CREATEROLE
Комментарии преподавателя
Если роль имеет атрибут CREATEROLE, она может создавать и удалять другие роли, а также изменять их атрибуты. Созданная роль автоматически включает в себя создавшую ее роль с параметром членства ADMIN. Таким образом, роль с атрибутом CREATEROLE может управлять членством в созданных ею ролях.
Чтобы создать роль с одним из атрибутов SUPERUSER, CREATEDB, REPLICATION или BYPASSRLS, создающая роль должна сама обладать соответствующим атрибутом.
Суперпользователи могут управлять включением любых ролей в любые.
Page 9: Примеры настройки
Личные схемы
- Групповой доступ
- Группа-владелец
- Внешние пользователи
Page 10: Личные схемы
{#source-figure-010 caption=“Source slide page 10: Личные схемы”}
- alice
- bob
- walter
Комментарии преподавателя
Механизмы управления доступом (роли, атрибуты и привилегии, а также схемы) весьма гибки и позволяют в разных случаях организовать работу удобным образом.
Мы рассмотрим несколько вариантов настройки доступа, чтобы показать, как изученные в предыдущих темах возможности могут работать в реальных ситуациях.
Начнем с простого примера. Алиса и Боб занимаются научной работой под руководством Уолтера и хранят результаты измерений на сервере в базе данных своей лаборатории.
Уолтер не является суперпользователем, администратор баз данных предоставил ему атрибуты CREATEDB и CREATEROLE. Благодаря этому Уолтер может создавать роли для сотрудников и управлять ими.
Путь поиска установлен в значение по умолчанию, чтобы пользователям было удобно работать со своими схемами, не указывая их явно. Каждый пользователь становится владельцем объектов, которые он создает в своей схеме. Уолтер имеет права чтения таблиц в схемах сотрудников.
Page 11: Личные схемы
Администратор зарегистрировал роль руководителя:
Уолтер подключается:
Он создает базу данных для лаборатории.
Руководитель регистрирует сотрудников:
Создающая роль всегда включается в созданную с параметром членства ADMIN, что дает первой возможность управлять членством во второй; такое включение происходит от имени начального суперпользователя:
При желании можно при создании роли дополнительно выдавать параметры членства SET и INHERIT (оба или один из них), задав параметр сервера:
Заметьте, что сначала суперпользователь включил создающую роль в создаваемую, а затем, благодаря параметру членства ADMIN, создавшая роль включила себя в созданную. Таким образом, роль может быть включена в одну и ту же группу несколькими ролями с разными параметрами членства. При этом управлять членством, то есть изменять параметры и исключать из группы, могут только суперпользователи и та роль, которая выполнила включение. Например, Уолтер не может исключить себя из группы Алисы:
Уолтер создает для своих объектов личную схему:
Page 12: Page 12
Параметр search_path установлен в значение по умолчанию:
Поэтому, если не указать полное имя, таблица будет создана в личной схеме.
Руководитель создает схемы для сотрудников, становясь их владельцем.
Сотрудникам нужны привилегии для работы со схемами.
Алиса и Боб подключаются к базе данных и создают таблицы в своих схемах.
Сотрудники могут видеть имена таблиц в других схемах:
Page 13: Page 13
Но доступа к чужим схемам и объектам в них они не имеют:
Уолтер пока не имеет доступа к таблицам сотрудников:
Но сотрудники могут выдавать ему привилегии:
Теперь Уолтер имеет доступ к таблице Алисы:
Чтобы завершить пример, удалим схемы. Это может сделать Уолтер, как владелец:
Удалим также включение в группу Боба с параметром SET, Уолтер имеет такое право как включивший:
Page 14: Групповой доступ
{#source-figure-014 caption=“Source slide page 14: Групповой доступ”}
Комментарии преподавателя
Более сложный пример.
Все лаборатории университета теперь хранят информацию на одном сервере, в одной базе данных. При этом каждая лаборатория хранит свои таблицы в отдельной схеме.
Чтобы упростить настройку, все сотрудники лаборатории включены в групповую роль, имеющую необходимые привилегии.
Чтобы гарантировать порядок, Уолтер создает необходимые объекты сам; он является владельцем и схем, и объектов в них.
Page 15: Групповой доступ
Алиса и Боб работают в одной лаборатории, Чарли — в другой. Уолтер создает группы для лабораторий, сразу включая в них пользователей.
При включении пользователей в групповые роли лабораторий им по умолчанию устанавливаются параметры членства INHERIT и SET:
Уолтер создает схемы и разрешает групповым ролям лабораторий пользоваться объектами в них.
Чтобы не выдавать привилегии на каждый создаваемый объект, удобно настроить привилегии по умолчанию.
Теперь Уолтер создает таблицы.
Поскольку Алиса входит в группу bio_lab с наследованием привилегий, она имеет доступ к таблице в схеме своей лаборатории:
Page 16: Page 16
Но не может создавать или удалять таблицы:
У Алисы также нет доступа к таблицам других лабораторий:
Права для Боба и Чарли работают аналогично.
Page 17: Группа-владелец
{#source-figure-017 caption=“Source slide page 17: Группа-владелец”}
Комментарии преподавателя
Если работа с данными происходит через приложение, конечные пользователи могут и не догадываться о том, какие объекты существуют в базе данных. Созданием и сопровождением приложения занимаются разработчики, для которых в базе данных также созданы пользователи.
Разработчиков может быть несколько, но удобно, чтобы всеми объектами владела одна роль — и с точки зрения администрирования, и чтобы можно было выполнять подпрограммы от имени владельца.
Для установки нужного владельца есть два способа:
● использовать команду смены владельца после создания объекта;
● переключиться на групповую роль, которая должна владеть объектом, а затем создать объект.
В обоих случаях требуются членство ролей разработчиков в групповой роли владельца объектов с параметром SET.
Page 18: Группа-владелец
Биолаборатория теперь использует приложение, и Уолтер уже не может самостоятельно заниматься его разработкой и сопровождением. Он передает владение существующей схемой и таблицами группой роли:
Привилегии по умолчанию необходимо изменить: теперь объектами владеет роль application, а не Уолтер:
Для разработки приложения Уолтер принимает на работу Дейва:
Чтобы Дейв не мог по ошибке создать или изменить таблицу приложения, разрешим ему такие действия только после переключения роли. Для этого включим Дейва в роль application с параметром SET, а параметр INHERIT отключим, чтобы Дейв не унаследовал права, которые дает владение:
Теперь Дейв может, начав сеанс и переключившись на роль application, добавлять объекты для приложения:
Пользователи сразу получают права на таблицу:
Page 19: Page 19
{#source-figure-019 caption=“Source slide page 19: Page 19”}
Проверим, что Дейв, переключившись обратно на свою роль, не может, например, изменить таблицу:
Page 20: Внешние пользователи
{#source-figure-020 caption=“Source slide page 20: Внешние пользователи”}
Комментарии преподавателя
Очень часто бывает так, что аутентификация пользователей информационной системы происходит не в СУБД, а на сервере приложений. Действительно, если у системы тысячи пользователей, регистрирующихся онлайн, нет никакого смысла управлять ими в СУБД.
В этом случае сервер приложений подключается к базе данных под одной общей ролью, а информацию о пользователе передает при необходимости в виде какого-то контекста.
Но даже и в этом случае в СУБД наверняка понадобятся несколько ролей. В нашем примере роли Алисы и Боба больше не нужны, но остаются роли, связанные с разработкой. Может потребоваться роль для технической поддержки, сотрудники которой смогут выполнять ограниченный круг административных задач для быстрого решения проблем, и т. п.
Обычно бывает удобно распределить объекты приложения по нескольким схемам. Часто выделяют схему со служебной информацией приложения: сеансами, учетными записями и т. д. Информацию, относящуюся к предметной области, можно разделить на несколько схем в соответствии с группами пользователей, таких как администраторы, сотрудники компании и клиенты. Это упрощает управление правами доступа.
Page 21: Внешние пользователи
{#source-figure-021 caption=“Source slide page 21: Внешние пользователи”}
Теперь приложение само аутентифицирует пользователей и всегда подключается к базе данных под ролью bio_lab.
Дейв-разработчик создает таблицы для пользователей и сеансов в схеме, к которой bio_lab не имеет доступа:
Представим, что Алиса открыла приложение. Оно подключается к серверу под ролью bio_lab и должно аутентифицировать Алису. Доступа к таблице пользователей у bio_lab нет и не должно быть, поэтому необходима функция с правами владельца:
Функция сохраняет и возвращает токен — случайное значение, которое невозможно подобрать:
Приложение получает токен и передает его тому функционалу приложения, для которого важно идентифицировать пользователя. Он может воспользоваться функцией проверки:
Page 22: Page 22
{#source-figure-022 caption=“Source slide page 22: Page 22”}
Злоумышленник, получив доступ к роли bio_lab, не сможет притвориться Алисой или другим пользователем, потому что не сможет угадать токен.
Скорее всего, прямой доступ bio_lab к таблицам следует запретить, а обращения к данным организовать с помощью API. С таким подходом можно ознакомиться в расширенном курсе по разработке приложений DEV2.
Page 23: Итоги
Отдельные задачи по сопровождению можно делегировать привилегированным ролям
- Схемы, роли и привилегии позволяют варьировать строгость разграничения доступа в зависимости от уровня доверия
Page 24: Практика
Рассмотрите сценарий, в котором на одном сервере право создания ролей имеют два пользователя.
- Создайте базу данных и роли bio_lab и chem_lab, обе с атрибутом CREATEROLE, владеющие одноименными схемами.
- От имени bio_lab создайте пользователей alice и bob, выдайте им доступ к схеме bio_lab. От имени chem_lab создайте пользователя charlie, выдайте ему доступ к схеме chem_lab.
- Убедитесь, что chem_lab не управляет пользователем alice.
- Проверьте, что пользователи имеют доступ к «своим» схемам.
Page 25: 1. База данных и роли
В сеансе суперпользователя создаем базу, схемы и роли.
Назначаем созданные роли владельцами схем.
2. Пользователи и права доступа
От имени bio_lab создаем таблицу и пользователей alice и bob.
Выдаем пользователям необходимые права.
От имени chem_lab создаем таблицу и пользователя charlie.
Page 26: 3. Проверка управления ролями
Выдаем необходимые права.
Так сейчас выглядят включения ролей:
Обратите внимание: создающая роль автоматически включается в созданную с опцией ADMIN. Именно поэтому в выводе \drg роль bio_lab показана как член ролей alice и bob, а не наоборот. В реальных сценариях часто требуется обратная иерархия, при которой, например, роли сотрудников включаются в роль подразделения. Роль chem_lab не может управлять пользователем alice, поскольку не имеет в нем параметра членства ADMIN:
4. Проверка доступности
Алисе доступны объекты схемы ее лаборатории.
Чарли видит таблицы своей лаборатории:
Но не видит объекты “чужой” схемы: