5.7. Привилегии#

5.7. Привилегии

5.7. Привилегии #

При создании объекта, ему назначается владелец. Обычно владельцем является роль, с которой было выполнена команда создания. Для большинства типов объектов начальное состояние таково, что только владелец (или суперпользователь) может выполнять операции с объектом. Чтобы позволить другим ролям использовать его, необходимо предоставить привилегии.

В PostgreSQL существуют различные виды привилегий: SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER, CREATE, CONNECT, TEMPORARY, EXECUTE, USAGE, SET и ALTER SYSTEM. Привилегии, применимые к конкретному объекту, зависят от его типа (таблица, функция и т. д.). Более подробно о значениях этих привилегий см. ниже. В следующих разделах и главах вы также узнаете, как используются эти привилегии.

Право изменять или уничтожать объект присуще его владельцу и не может быть предоставлено или отозвано само по себе. (Однако, как и все привилегии, это право может быть унаследовано членами роли-владельца; см. Раздел 20.3).

Объект может быть назначен новому владельцу с помощью команды ALTER для соответствующего типа объекта, например

ALTER TABLE table_name OWNER TO new_owner;

Суперпользователи всегда могут это сделать; обычные роли могут сделать это только в том случае, если они одновременно являются текущими владельцами объекта (или наследуют привилегии роли-владельца) и могут выполнить SET ROLE для новой роли владельца.

Для назначения привилегий используется команда GRANT. Например, если joe - существующая роль, а accounts - существующая таблица, то привилегия на обновление таблицы может быть назначена следующим образом:

GRANT UPDATE ON accounts TO joe;

Запись ALL вместо конкретной привилегии предоставляет все привилегии, относящиеся к типу объекта.

Специальное имя роли PUBLIC можно использовать для предоставления привилегий каждой роли в системе. Кроме того, можно настроить групповые роли для управления привилегиями, когда в базе данных много пользователей. Для получения более подробной информации см. Глава 20.

Чтобы отозвать ранее предоставленные привилегии, используйте команду REVOKE.

REVOKE ALL ON accounts FROM PUBLIC;

Обычно только владелец объекта (или суперпользователь) может предоставлять или отзывать привилегии для объекта. Однако можно предоставить привилегию с правом передачи, которая дает получателю право предоставлять ее другим. Если право передачи впоследствии отзывается, то все, кто получил привилегию от этого получателя (непосредственно или через цепочку передачи), потеряют привилегию. Подробности см. на страницах GRANT и REVOKE.

Владелец объекта может также отозвать свои собственные обычные привилегии, например, чтобы сделать таблицу доступной только для чтения для себя и других. Но владельцы сохраняют возможность управления привилегиями, поэтому они всегда могут вернуть себе привилегии.

Существующие привилегии:

SELECT #

Позволяет использовать SELECT из любого столбца или конкретного столбца(-ов) таблицы, представления, материализованного представления или другого объекта, схожего с таблицей. Также позволяет использовать COPY TO. Данная привилегия также позволяет ссылаться на существующие значения столбцов в UPDATE, DELETE или MERGE. Для последовательностей эта привилегия также позволяет использовать функцию currval. Для больших объектов позволяет читать объект.

INSERT #

Позволяет вставлять с помощью команды INSERT новые строки в таблицу, представление, и т.д. Может быть предоставлена для конкретных столбцов, и тогда только этим столбцам могут быть назначены значения в команде INSERT (в остальных столбцах будут значения по умолчанию). Также позволяет использовать COPY FROM.

UPDATE #

Позволяет выполнить команду UPDATE для любого столбца или определенного набора столбцов таблицы, представления и т. д. (На практике любая сложная команда UPDATE также потребует наличия привилегии SELECT, так как она должна ссылаться на столбцы таблицы, чтобы определить, какие строки обновлять, и/или вычислять новые значения для столбцов). Кроме того, для выполнения команд SELECT ... FOR UPDATE и SELECT ... FOR SHARE также требуется наличие этой привилегии хотя бы для одного столбца, помимо привилегии SELECT. Для последовательностей эта привилегия позволяет использовать функции nextval и setval. Для больших объектов эта привилегия позволяет записывать или обрезать объект.

DELETE #

Позволяет с помощью команды DELETE удалить строку из таблицы, представления и т. д. (На практике любая сложная команда DELETE также потребует привилегии SELECT, так как она должна ссылаться на столбцы таблицы, чтобы определить, какие строки удалять).

TRUNCATE #

Позволяет использовать команду TRUNCATE на таблице.

REFERENCES #

Позволяет создать ограничение внешнего ключа, ссылающееся на таблицу или конкретные столбцы таблицы.

TRIGGER #

Позволяет создать триггер на таблице, представлении и т.д.

CREATE #

Для баз данных позволяет создавать новые схемы и публикации внутри базы данных, а также устанавливать доверенные расширения внутри базы данных.

Для схем позволяет создавать новые объекты внутри схемы. Чтобы переименовать существующий объект, вы должны быть владельцем объекта и иметь данную привилегию для содержащей ее схемы.

Для табличных пространств позволяет создавать таблицы, индексы и временные файлы внутри табличного пространства, а также позволяет создавать базы данных, у которых табличное пространство является их табличным пространством по умолчанию.

Обратите внимание, что отзыв этой привилегии не влияет на существование или расположение существующих объектов.

CONNECT #

Позволяет подключаться к базе данных. Это привилегия проверяется при установлении соединения (в дополнение к проверке любых ограничений, указанных в pg_hba.conf).

TEMPORARY #

Позволяет создавать временные таблицы в базе данных.

EXECUTE #

Позволяет вызывать функцию или процедуру, а также использовать любые операторы, реализованные данной функцией. Это единственный тип привилегии, применимый к функциям и процедурам.

USAGE #

Для процедурных языков позволяет использовать язык для создания функций на этом языке. Это единственный тип привилегии, применимый к процедурным языкам.

Для схем позволяет получить доступ к объектам, содержащимся в схеме (при условии, что также выполняются требования к привилегиям самих объектов). По сути, это позволяет "просматривать" объекты внутри схемы. Без этого разрешения все равно возможно видеть имена объектов, например, запросив системные каталоги. Кроме того, после отзыва этого разрешения у существующих сессий могут остаться операторы, которые ранее выполняли этот поиск, поэтому данная привилегия не является полностью безопасным способом предотвращения доступа к объектам.

Для последовательностей позволяет использовать функции currval и nextval.

Для типов и доменов позволяет использовать соответствующий тип или домен при создании таблиц, функций и других объектов схемы. (Обратите внимание, что эта привилегия не контролирует общее "использование" типа, например значения типа, появляющиеся в запросах. Она только предотвращает создание объектов, зависящих от типа. Основная задача этой привилегии - контроль над тем, какие пользователи могут создавать зависимости от типа, чтобы они не мешали владельцу впоследствии менять тип).

Для внешних оберток данных позволяет создавать новые серверы с использованием внешней обертки данных.

Для внешних серверов позволяет создавать внешние таблицы с использованием сервера. Пользователи с данной привилегией могут также создавать, изменять или удалять свои собственные карты пользователей, связанные с этим сервером.

SET #

Позволяет установить новое значение параметра конфигурации сервера в текущей сессии. (Хотя это разрешение может быть предоставлено для любого параметра, оно бессмысленно, за исключением параметров, установка которых обычно требует привилегий суперпользователя).

ALTER SYSTEM #

Позволяет установить новое значение параметра конфигурации сервера с помощью команды ALTER SYSTEM.

Необходимые привилегии для других команд перечислены на справочной странице соответствующей команды.

PostgreSQL по умолчанию предоставляет привилегии на некоторые типы объектов для роли PUBLIC при их создании. По умолчанию привилегии на таблицы, столбцы таблиц, последовательности, обертки внешних данных, внешние серверы, большие объекты, схемы, табличные пространства или параметры конфигурации не предоставляются роли PUBLIC. Ниже приведен список привилегий, по умолчанию предоставляемых роли PUBLIC для других типов объектов: привилегии CONNECT и TEMPORARY (создание временных таблиц) для баз данных; привилегия EXECUTE для функций и процедур; и привилегия USAGE для языков и типов данных (включая домены). Владелец объекта, конечно же, может отозвать как привилегии по умолчанию, так и явно предоставленные привилегии. (Для максимальной безопасности выполняйте команду REVOKE в той же транзакции, которая создает объект; тогда у другого пользователя не будет возможности использовать объект). Кроме того, эти настройки привилегий по умолчанию могут быть переопределены с помощью команды ALTER DEFAULT PRIVILEGES.

В Таблица 5.1 приведены обозначения, которые используются для этих типов привилегий в ACL (Список контроля доступа). Эти буквы выводятся в командах psql, перечисленных ниже, или при просмотре столбцов ACL системных каталогов.

Таблица 5.1. Сокращения привилегий ACL

ПривилегияАббревиатураПрименимые типы объектов
SELECTr (чтение) LARGE OBJECT, SEQUENCE, TABLE (и объекты, схожие с таблицами), столбец таблицы
INSERTa (добавление)TABLE, столбец таблицы
UPDATEw (запись) LARGE OBJECT, SEQUENCE, TABLE, столбец таблицы
DELETEdTABLE
TRUNCATEDTABLE
REFERENCESxTABLE, столбец таблицы
TRIGGERtTABLE
CREATEC DATABASE, SCHEMA, TABLESPACE
CONNECTcDATABASE
TEMPORARYTDATABASE
EXECUTEXFUNCTION, PROCEDURE
USAGEU DOMAIN, FOREIGN DATA WRAPPER, FOREIGN SERVER, LANGUAGE, SCHEMA, SEQUENCE, TYPE
SETsPARAMETER
ALTER SYSTEMAPARAMETER

В Таблица 5.2 перечислены привилегии, доступные для каждого типа SQL-объекта с соответствующими сокращениями. Также приведены команды psql, которые можно использовать для проверки настроек привилегий для каждого типа объекта.

Таблица 5.2. Сводка прав доступа

Тип объектаВсе привилегииПривилегии по умолчанию для PUBLICКоманда psql
DATABASECTcTc\l
DOMAINUU\dD+
FUNCTION или PROCEDUREXX\df+
FOREIGN DATA WRAPPERUнет\dew+
FOREIGN SERVERUнет\des+
LANGUAGEUU\dL+
LARGE OBJECTrwнет\dl+
PARAMETERsAнет\dconfig+
SCHEMAUCнет\dn+
SEQUENCErwUнет\dp
TABLE (и объекты, схожие с таблицами)arwdDxtнет\dp
Столбец таблицыarwxнет\dp
TABLESPACECнет\db+
TYPEUU\dT+

Привилегии, которые были предоставлены для конкретного объекта, отображаются в виде списка записей aclitem, каждая из которых имеет формат:

grantee=privilege-abbreviation[*].../grantor

В каждом списке aclitem перечисляются все разрешения одного правополучателя, которые были предоставлены определенным праводателем. Конкретные привилегии представлены однобуквенными обозначениями из Таблица 5.1, с добавлением *, если привилегия была предоставлена с опцией передачи. Например, calvin=r*w/hobbes указывает, что роль calvin имеет привилегию SELECT (r) с опцией передачи (*), а также непередаваемую привилегию UPDATE (w), обе предоставлены ролью hobbes. Если у calvin также есть некоторые привилегии на тот же объект, предоставленные другим праводателем, они будут отображаться как отдельная запись aclitem. Пустое поле получателя в aclitem соответствует роли PUBLIC.

В качестве примера, предположим, что пользователь miriam создает таблицу mytable и выполняет:

GRANT SELECT ON mytable TO PUBLIC;
GRANT SELECT, UPDATE, INSERT ON mytable TO admin;
GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;

Затем команда psql \dp покажет:

=> \dp mytable
                                  Access privileges
 Schema |  Name   | Type  |   Access privileges   |   Column privileges   | Policies
--------+---------+-------+-----------------------+-----------------------+----------
 public | mytable | table | miriam=arwdDxt/miriam+| col1:                +|
        |         |       | =r/miriam            +|   miriam_rw=rw/miriam |
        |         |       | admin=arw/miriam      |                       |
(1 row)

Если столбец Access privileges пуст для данного объекта, это означает, что действуют привилегии по умолчанию (то есть, запись привилегий в соответствующем системном каталоге является пустой). Привилегии по умолчанию всегда включают все привилегии для владельца и могут включать некоторые привилегии роли PUBLIC в зависимости от типа объекта, как объяснялось выше. Первая команда GRANT или REVOKE для объекта создает привилегии по умолчанию (например, miriam=arwdDxt/miriam) и затем меняет их в соответствии с указанным запросом. Аналогично, записи отображаются в Column privileges только для столбцов с нестандартными привилегиями. (Примечание: в данном случае привилегии по умолчанию всегда подразумевают встроенные привилегии по умолчанию для типа объекта. Объект, привилегии которого были изменены командой ALTER DEFAULT PRIVILEGES, всегда будет отображаться явно, отображая изменения, выполненные командой ALTER).

Обратите внимание, что неявная передача привилегий владельцу не отмечаются при отображении привилегий доступа. Знаком * помечаются только те привилегии с правом передачи, которые были явно назначены кому-либо.