22.2. Атрибуты ролей #
Роль базы данных может иметь атрибуты, определяющие её полномочия и взаимодействие с системой аутентификации клиентов.
- Право подключения
Только роли с атрибутом
LOGIN
могут использоваться для начального подключения к базе данных. Роль с атрибутомLOGIN
можно рассматривать как пользователя базы данных. Для создания такой роли можно использовать любой из вариантов:CREATE ROLE
имя
LOGIN; CREATE USERимя
;(Команда
CREATE USER
эквивалентнаCREATE ROLE
за исключением того, чтоCREATE USER
по умолчанию включает атрибутLOGIN
, в то время какCREATE ROLE
— нет.)- Статус суперпользователя
Суперпользователь базы данных обходит все проверки прав доступа, за исключением права на вход в систему. Это опасная привилегия и она не должна использоваться небрежно. Лучше всего выполнять большую часть работы не как суперпользователь. Для создания нового суперпользователя используется
CREATE ROLE
. Это нужно выполнить из под роли, которая также является суперпользователем.имя
SUPERUSER- Создание базы данных
Роль должна явно иметь разрешение на создание базы данных (за исключением суперпользователей, которые пропускают все проверки). Для создания такой роли используется
CREATE ROLE
.имя
CREATEDB- Создание роли
Роль должна явно иметь разрешение на создание других ролей (за исключением суперпользователей, которые пропускают все проверки). Для создания такой роли используется
CREATE ROLE
. Роль с правомимя
CREATEROLECREATEROLE
может изменять и удалять роли, которые были назначены пользователю с правамиCREATEROLE
иADMIN OPTION
. Такое назначение ролей происходит автоматически, когда пользователь с правомCREATEROLE
, не являющийся суперпользователем, создаёт новую роль. Поэтому по умолчанию пользователь с правомCREATEROLE
может изменять и удалять созданные им роли. Изменение роли включает большинство действий командыALTER ROLE
, например смену пароля, а также действия командCOMMENT
иSECURITY LABEL
в отношении ролей.Однако, имея право
CREATEROLE
, нельзя ни создавать, ни каким-либо образом влиять на ролиSUPERUSER
. Кроме того, с правомCREATEROLE
нельзя ни создавать пользователейREPLICATION
, ни предоставлять или отзывать правоREPLICATION
, ни изменять свойства ролей таких пользователей. Тем не менее, это право позволяет использовать командыALTER ROLE ... SET
иALTER ROLE ... RENAME
в отношении ролейREPLICATION
, а такжеCOMMENT ON ROLE
,SECURITY LABEL ON ROLE
иDROP ROLE
. Наконец, правоCREATEROLE
не даёт возможности предоставлять или отзывать правоBYPASSRLS
.- Запуск репликации
Роль должна иметь явное разрешение на запуск потоковой репликации (за исключением суперпользователей, которые пропускают все проверки). Роль, используемая для потоковой репликации, также должна иметь атрибут
LOGIN
. Для создания такой роли используетсяCREATE ROLE
.имя
REPLICATION LOGIN- Пароль
Пароль имеет значение, если метод аутентификации клиентов требует, чтобы пользователи предоставляли пароль при подключении к базе данных. Методы аутентификации
password
иmd5
используют пароли. База данных и операционная система используют раздельные пароли. Пароль указывается при создании роли:CREATE ROLE
.имя
PASSWORD 'строка
'- Наследование прав
По умолчанию роль наследует права ролей, членом которых она является. Однако можно создать роль, которая не будет наследовать права по умолчанию. Для этого выполните
CREATE ROLE
. Как вариант, атрибуты наследования отдельных прав можно переопределить, указавимя
NOINHERITWITH INHERIT TRUE
илиWITH INHERIT FALSE
.- Игнорирование защиты на уровне строк
Разрешение обходить все политики защиты на уровне строк (RLS) нужно давать роли явно. Создать роль с таким разрешением можно, выполнив
CREATE ROLE
от имени суперпользователя.имя
BYPASSRLS- Ограничение соединений
Для роли можно ограничить число одновременных соединений. -1 (по умолчанию) означает отсутствие ограничения. Для создания роли с ограничением используется
CREATE ROLE
.name
CONNECTION LIMIT 'число
'
Атрибуты ролей могут быть изменены после создания командой ALTER ROLE
. Более детальная информация в справке по командам CREATE ROLE и ALTER ROLE.
На уровне ролей можно устанавливать многие конфигурационные параметры времени выполнения, описанные в Главе 20. Например, если по некоторым причинам всякий раз при подключении к базе данных требуется отключить использование индексов (подсказка: плохая идея), можно выполнить:
ALTER ROLE myname SET enable_indexscan TO off;
Установленное значение параметра будет сохранено (но не будет применено сразу). Для последующих подключений с этой ролью это будет выглядеть как выполнение команды SET enable_indexscan TO off
перед началом сеанса. Но это только значение по умолчанию; в течение сеанса этот параметр можно изменить. Для удаления установок на уровне ролей для параметров конфигурации используется ALTER ROLE
. Обратите внимание, что установка параметров конфигурации на уровне роли без права имя_роли
RESET имя_переменной
LOGIN
лишено смысла, т. к. они никогда не будут применены.
Когда не суперпользователь с правом CREATEROLE
создаёт роль, созданная роль автоматически становится членом создавшей её роли, как если бы начальный суперпользователь выполнил команду GRANT created_user TO creating_user WITH ADMIN TRUE, SET FALSE, INHERIT FALSE
. Поскольку пользователь с правом CREATEROLE
может пользоваться специальными правами в отношении существующей роли только при наличии атрибута ADMIN OPTION
, такого права вполне достаточно для того, чтобы пользователь с правом CREATEROLE
мог администрировать созданную им роль. Тем не менее, поскольку роль создаётся с атрибутами INHERIT FALSE, SET FALSE
, пользователь с правом CREATEROLE
не будет наследовать права созданной роли и не сможет переключиться на неё с помощью команды SET ROLE
. Однако поскольку любой пользователь с правом ADMIN OPTION
для роли может разрешать членство в этой роли любым пользователям, пользователь с правом CREATEROLE
может стать членом созданной им роли, просто назначив эту роль на себя при помощи INHERIT
и/или SET
. Поэтому факт того, что права не наследуются по умолчанию и что право не назначается по умолчанию командой SET ROLE
, — это способ оградиться от случайных ошибок, а не средство защиты. Кроме того, обратите внимание, что это право автоматически выдаётся от имени начального суперпользователя, поэтому пользователь с правом CREATEROLE
не сможет удалить или изменить его. Тем не менее любой суперпользователь может отозвать, модифицировать и/или выдать дополнительно такие права другим пользователям с правом CREATEROLE
. Любой пользователь с правами CREATEROLE
и ADMIN OPTION
в этой роли может её администрировать.