Управление доступом
Привилегии
13
Авторские права
© Postgres Professional, 2015‒2022
Авторы: Егор Рогов, Павел Лузанов, Илья Баштанов
Использование материалов курса
Некоммерческое использование материалов курса (презентации,
демонстрации) разрешается без ограничений. Коммерческое
использование возможно только с письменного разрешения компании
Postgres Professional. Запрещается внесение изменений в материалы
курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу:
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за
любые повреждения и убытки, включая потерю дохода, нанесенные
прямым или непрямым, специальным или случайным использованием
материалов курса. Компания Postgres Professional не предоставляет
каких-либо гарантий на материалы курса. Материалы курса
предоставляются на основе принципа «как есть» и компания Postgres
Professional не обязана предоставлять сопровождение, поддержку,
обновления, расширения и изменения.
2
Темы
Виды привилегий для разных объектов
Категории ролей с точки зрения управления доступом
Групповые привилегии
Выдача и отзыв привилегий и право передачи
Привилегии по умолчанию
Примеры управления доступом
3
Привилегии
Привилегии определяют права доступа ролей к объектам
Таблицы
SELECT чтение данных
INSERT вставка строк
UPDATE изменение строк
REFERENCES внешний ключ
DELETE удаление строк
TRUNCATE опустошение таблицы
TRIGGER создание триггеров
Представления
SELECT чтение данных
TRIGGER создание триггеров
можно на уровне столбцов
Привилегии определяются на пересечении объектов кластера и ролей.
Они ограничивают действия, доступные для ролей в отношении этих
объектов.
Список возможных привилегий отличается для объектов различных
типов. Привилегии для объектов основных типов приведены на этом и
следующем слайдах.
Больше всего привилегий определено для таблиц. Некоторые из них
можно определить не только для всей таблицы, но и для отдельных
столбцов.
4
Привилегии
Табличные пространства,
базы данных, схемы
Последовательности
SELECT currval
UPDATE nextval setval
USAGE currval nextval
база данных
схема pg_temp
табл.
пр-во
таблица
таблица
объект
CREATE
USAGE
CREATE
таблица
таблица
объект
TEMPORARY
CREATE
CONNECT
Возможно, несколько неожиданный набор привилегий имеют
последовательности. Выбирая нужные, можно разрешить или
запретить доступ к трем управляющим функциям.
Для табличных пространств есть привилегия CREATE, разрешающая
создание объектов в этом пространстве.
Для баз данных привилегия CREATE разрешает создавать схемы в этой
БД, а для схемы привилегия CREATE разрешает создавать объекты
в этой схеме.
Поскольку точное имя схемы для временных объектов заранее
неизвестно, привилегия на создание временных таблиц вынесена на
уровень БД (TEMPORARY).
Привилегия USAGE схемы разрешает обращаться к объектам в этой
схеме.
Привилегия CONNECT базы данных разрешает подключение к этой БД.
5
Категории ролей
Суперпользователи
полный доступ ко всем объектам — проверки не выполняются
Владельцы
доступ в рамках выданных привилегий
(изначально получает полный набор)
а также действия, не регламентируемые привилегиями,
например: удаление, выдача и отзыв привилегий и т. п.
Остальные роли
доступ исключительно в рамках выданных привилегий
В целом можно сказать, что доступ роли к объекту определяется
привилегиями. Но можно выделить три категории ролей.
1. Проще всего с ролями с атрибутом суперпользователя. Такие роли
могут делать все, что угодно — для них проверки разграничения
доступа не выполняются.
2. Владелец объекта сразу получает полный набор привилегий для
этого объекта. В принципе, эти привилегии можно отозвать, но
владелец объекта обладает также неотъемлемым правом совершать
действия, не регламентируемые привилегиями. В частности, он может
выдавать и отзывать привилегии (в том числе и себе самому), удалять
объект и т. п.
3. Все остальные роли имеют доступ к объекту только в рамках
выданных им привилегий.
6
Управление привилегиями
Выдача привилегии
alice=> GRANT привилегии ON объект TO bob;
одна привилегия может быть независимо выдана разными ролями
Отзыв привилегии
alice=> REVOKE привилегии ON объект FROM bob;
alice bob
привилегии
на объект
Право выдачи и отзыва привилегий на объект имеет владелец этого
объекта (и суперпользователь).
Синтаксис команд GRANT и REVOKE достаточно сложен и позволяет
указывать как отдельные, так и все возможные привилегии; как
отдельные объекты, так и группы объектов, входящие в определенные
схемы и т. п.
8
Групповые привилегии
Роль получает привилегии групповых ролей,
в которые она включена
с атрибутом INHERIT привилегии наследуются автоматически
с атрибутом NOINHERIT требуется явное переключение
командой SET ROLE
Псевдороль public
неявно включает все остальные роли
Роль может получать привилегии для доступа к объекту не только
непосредственно, но и от групповых ролей, в которые она входит. Таким
образом, для упрощения администрирования можно выдать групповой
роли необходимый набор привилегий и затем выдавать пользователям
весь этот набор целиком. Групповую роль можно рассматривать как
особую привилегию; поэтому управление группами и выполняется теми
же командами GRANT и REVOKE, что и управление привилегиями.
Роль с атрибутом INHERIT (по умолчанию) автоматически обладает
привилегиями всех групп, в которые она входит. Это касается и
псевдороли public, в которую неявно входят все роли.
Если же роль создана как NOINHERIT, то она может воспользоваться
привилегиями группы, только выполнив команду SET ROLE и таким
образом переключившись на эту групповую роль. Все действия,
совершаемые ролью, будут совершаться от имени групповой роли
(например, групповая роль будет владельцем созданных объектов).
9
Преднастроенные роли
pg_signal_backend завершение сеансов и отмена
запросов
pg_read_all_settings чтение конфигурационных
параметров
pg_read_all_stats доступ к статистике
pg_stat_scan_tables доступ к статистике,
блокирующей доступ
pg_read_server_files чтение файлов на сервере
pg_write_server_files запись файлов на сервере
pg_execute_server_programs выполнение программ на сервере
pg_monitor
В PostgreSQL уже есть ряд преднастроенных ролей, обладающих
рядом специальных привилегий для выполнения задач, которые
обычно может совершать только суперпользователь. Три последние
роли появилась в версии PostgreSQL 11.
Полный список всех ролей, включая предопределенные системные
роли, можно посмотреть в psql командой \duS.
Аналогично можно создавать и собственные групповые роли,
например, для управления резервным копированием и т. п.
11
Передача права
Выдача привилегии с правом передачи
alice=> GRANT привилегии ON объект TO bob WITH GRANT OPTION;
Отзыв привилегии
alice=> REVOKE привилегии ON объект FROM bob CASCADE;
Отзыв права передачи
alice=> REVOKE GRANT OPTION FOR
привилегии ON объект FROM bob CASCADE;
bob
charlie
alice
привилегии
dave
п
р
и
в
и
л
е
г
и
и
п
р
и
в
и
л
е
г
и
и
обязательно,
если привилегия
была передана
другим ролям
При выдаче роли полномочия можно передать ей право дальнейшей
передачиотзыва) этого полномочия. Это выполняется командой
GRANT WITH GRANT OPTION (похожая конструкция WITH ADMIN
OPTION для атрибутов рассматривалась в предыдущей теме «Роли»).
Если роль воспользуется этим правом, образуется иерархия ролей.
Отозвать привилегию можно с помощью команды REVOKE. Роль может
отозвать привилегию только у той роли, которой она его выдала.
Например, в ситуации, показанной на слайде, alice не может отозвать
привилегию непосредственно у charlie или dave.
Однако при отзыве привилегии у bob привилегия будет автоматически
отозвана у всех ролей в иерархии. Для этого надо указать ключевое
слово CASCADE (если иерархия непуста, то без CASCADE будет
ошибка).
Право передачи можно отозвать, не отзывая у роли саму привилегию.
Это выполняется с помощью команды REVOKE GRANT OPTION FOR.
Слово CASCADE имеет здесь такое же значение, как и при отзыве
привилегии.
12
Вопрос
public
Привилегии на таблицу T получены Бобом от Алисы.
Если Алиса выполнит
REVOKE ALL ON T FROM bob CASCADE,
какие привилегии останутся у Чарли и Дейва?
alice
bob
select, update on T
select on T
dave
charlie
select on T
update on T
И у Чарли, и у Дейва останется только привилегия на чтение T,
полученная от public. Все привилегии, выданные Бобом другим ролям,
будут отозваны.
14
Подпрограммы
Единственная привилегия для функций и процедур
EXECUTE выполнение
Характеристики безопасности
SECURITY INVOKER выполняется с правами вызывающего
(по умолчанию)
SECURITY DEFINER выполняется с правами владельца
Для подпрограмм (функций и процедур) есть единственная привилегия
EXECUTE, разрешающая выполнение этой подпрограммы.
Тонкий момент состоит в том, от имени какого пользователя будет
выполняться подпрограмма. Если подпрограмма объявлена как
SECURITY INVOKER (по умолчанию), она выполняется с правами
вызывающего пользователя. В этом случае операторы внутри
подпрограммы смогут обращаться только к тем объектам, к которым
у вызывающего пользователя есть доступ.
Если же указать фразу SECURITY DEFINER, подпрограмма работает
с правами ее владельца. Так можно позволить другим пользователям
выполнять определенные действия над объектами, к которым у них нет
непосредственного доступа.
15
Привилегии public
По умолчанию роль public получает ряд привилегий
для баз данных CONNECT (подключение)
TEMPORARY (создание временных таблиц)
для схемы public CREATE (создание объектов)
USAGE (доступ к объектам)
для схем pg_catalog USAGE (доступ к объектам)
и information_schema
для подпрограмм EXECUTE (выполнение)
Удобно, но не безопасно
По умолчанию псевдороль public получает ряд привилегий (то есть,
фактически, их получают все роли):
- подключение и создание временных таблиц для всех баз данных;
- использование схемы public и создание в ней объектов;
- использование схем pg_catalog и information_schema;
- выполнение всех функций и процедур.
(В PostgreSQL 15 роль public лишится права создания объектов.)
Такое поведение может оказаться нежелательным. В этом случае надо
явно отозвать у public привилегии. Это можно сделать и в шаблонной
базе данных template1, чтобы изменения распространялись на новые
базы данных. Но для отзыва прав на подпрограммы надо пользоваться
механизмом привилегий по умолчанию, о котором будет сказано
дальше в этой теме.