5.7. Привилегии#
5.7. Привилегии #
При создании объекта, ему назначается владелец. Обычно владельцем является роль, с которой было выполнена команда создания. Для большинства типов объектов начальное состояние таково, что только владелец (или суперпользователь) может выполнять операции с объектом. Чтобы позволить другим ролям использовать его, необходимо предоставить привилегии.
В PostgreSQL существуют различные виды привилегий: SELECT
,
INSERT
, UPDATE
, DELETE
,
TRUNCATE
, REFERENCES
, TRIGGER
,
CREATE
, CONNECT
, TEMPORARY
,
EXECUTE
, USAGE
, SET
и ALTER SYSTEM
.
Привилегии, применимые к конкретному объекту, зависят от его типа (таблица, функция и т. д.).
Более подробно о значениях этих привилегий см. ниже.
В следующих разделах и главах вы также узнаете, как используются эти привилегии.
Право изменять или уничтожать объект присуще его владельцу и не может быть предоставлено или отозвано само по себе. (Однако, как и все привилегии, это право может быть унаследовано членами роли-владельца; см. Раздел 20.3).
Объект может быть назначен новому владельцу с помощью команды ALTER
для соответствующего типа объекта, например
ALTER TABLEtable_name
OWNER TOnew_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
Привилегия | Аббревиатура | Применимые типы объектов |
---|---|---|
SELECT | r (“чтение”) |
LARGE OBJECT ,
SEQUENCE ,
TABLE (и объекты, схожие с таблицами),
столбец таблицы
|
INSERT | a (“добавление”) | TABLE , столбец таблицы |
UPDATE | w (“запись”) |
LARGE OBJECT ,
SEQUENCE ,
TABLE ,
столбец таблицы
|
DELETE | d | TABLE |
TRUNCATE | D | TABLE |
REFERENCES | x | TABLE , столбец таблицы |
TRIGGER | t | TABLE |
CREATE | C |
DATABASE ,
SCHEMA ,
TABLESPACE
|
CONNECT | c | DATABASE |
TEMPORARY | T | DATABASE |
EXECUTE | X | FUNCTION , PROCEDURE |
USAGE | U |
DOMAIN ,
FOREIGN DATA WRAPPER ,
FOREIGN SERVER ,
LANGUAGE ,
SCHEMA ,
SEQUENCE ,
TYPE
|
SET | s | PARAMETER |
ALTER SYSTEM | A | PARAMETER |
В Таблица 5.2 перечислены привилегии, доступные для каждого типа SQL-объекта с соответствующими сокращениями. Также приведены команды psql, которые можно использовать для проверки настроек привилегий для каждого типа объекта.
Таблица 5.2. Сводка прав доступа
Тип объекта | Все привилегии | Привилегии по умолчанию для PUBLIC | Команда psql |
---|---|---|---|
DATABASE | CTc | Tc | \l |
DOMAIN | U | U | \dD+ |
FUNCTION или PROCEDURE | X | X | \df+ |
FOREIGN DATA WRAPPER | U | нет | \dew+ |
FOREIGN SERVER | U | нет | \des+ |
LANGUAGE | U | U | \dL+ |
LARGE OBJECT | rw | нет | \dl+ |
PARAMETER | sA | нет | \dconfig+ |
SCHEMA | UC | нет | \dn+ |
SEQUENCE | rwU | нет | \dp |
TABLE (и объекты, схожие с таблицами) | arwdDxt | нет | \dp |
Столбец таблицы | arwx | нет | \dp |
TABLESPACE | C | нет | \db+ |
TYPE | U | U | \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
).
Обратите внимание, что неявная передача привилегий владельцу не отмечаются при
отображении привилегий доступа. Знаком *
помечаются только те привилегии с правом передачи, которые были явно назначены кому-либо.