Роли и привилегии базы данных
ADPG использует роли для управления разрешениями на доступ к базе данных. Роль представляет собой пользователя базы данных или группу пользователей. Роли могут владеть объектами базы данных, например, таблицами и функциями, разрешать доступ и действия над этими объектами (назначать привилегии). Также можно предоставить членство в роли другой роли, чтобы использовать её привилегии.
Роли базы данных отделены от пользователей операционной системы, но вы можете создавать роли, соответствующие пользователям операционной системы. Роли создаются глобально для всего кластера ADPG, а не для отдельной базы данных.
Кластер ADPG содержит предопределенную роль суперпользователя postgres
. Чтобы создать дополнительные роли, подключитесь к хосту ADPG как postgres
.
Создание роли
Чтобы создать роль, используйте SQL-команду CREATE ROLE. Вы можете выполнять команды в командной строке psql.
CREATE ROLE user1 WITH LOGIN PASSWORD 'password1';
Приведенная выше команда создает роль user1
с паролем password1
. Параметр LOGIN разрешает использовать user1
для первоначального подключения к базе данных.
Если вам нужно использовать специальные символы в имени роли, заключите имя в двойные кавычки. Дополнительные сведения об идентификаторах SQL вы можете найти по ссылке Identifiers and keywords.
Чтобы создать роль, вы также можете выполнить команду createuser из командной строки терминала. createuser
— это обертка SQL-команды CREATE ROLE
. Подключитесь к хосту ADPG как суперпользователь или пользователь с привилегией CREATEROLE, чтобы выполнить команду createuser
.
$ createuser user2
Представление pg_roles предоставляет доступ к информации о ролях в базах данных. Вы можете выполнить следующий запрос, чтобы проверить добавлена ли роль:
SELECT rolname FROM pg_roles;
Роли user1
и user2
должны быть в результате запроса вместе с предопределенными ролями PostgreSQL:
pg_database_owner pg_read_all_data pg_write_all_data pg_monitor pg_read_all_settings pg_read_all_stats pg_stat_scan_tables pg_read_server_files pg_write_server_files pg_execute_server_program pg_signal_backend postgres user1 user2
Метакоманда psql \du
также выводит список существующих ролей.
ПРИМЕЧАНИЕ
Только пользователь с правами суперпользователя может создать новую роль суперпользователя или предоставить привилегию суперпользователя.
|
Атрибуты роли
Роль может иметь атрибуты, которые определяют её привилегии и взаимодействуют с системой аутентификации клиентских приложений.
Наименование | Описание | Пример |
---|---|---|
LOGIN |
Роль можно использовать для первоначального подключения к базе данных (эквивалент команды CREATE USER) |
|
SUPERUSER |
Суперпользователь базы данных, который проходит все проверки разрешений, кроме права входа в систему. Поскольку эта роль имеет привилегии высокого уровня, сведите к минимуму использование этой роли из соображений безопасности |
|
CREATEDB |
Роль может создавать базы данных |
|
CREATEROLE |
Роль может создавать, изменять и удалять другие роли, предоставлять или отзывать членство в ролях |
|
REPLICATION |
Роль имеет разрешение инициировать потоковую репликацию. Эта роль также должна иметь привилегию LOGIN |
|
PASSWORD |
Используйте этот атрибут, если для метода аутентификации клиента требуется пароль. Дополнительную информацию можно найти в статье Аутентификация в ADPG по паролю |
|
ПРИМЕЧАНИЕ
Мы рекомендуем создать роль с привилегиями CREATEDB или CREATEROLE вместо роли суперпользователя и использовать эту роль для рутинных операций. Такой подход увеличивает надежность системы.
|
Используйте команду ALTER ROLE для изменения атрибутов роли после создания.
Следующая команда изменяет пароль роли user1
:
ALTER ROLE user1 WITH PASSWORD 'password2';
Вы также можете добавить привилегии CREATEDB и CREATEROLE роли user2
:
ALTER ROLE user2 CREATEROLE CREATEDB;
Членство в ролях
Вы можете группировать пользователей для управления привилегиями. Для этого создайте групповую роль:
CREATE ROLE group1 CREATEROLE CREATEDB;
Групповая роль от индивидуальной пользовательской роли отличается только способом использования. Также групповые роли обычно не имеют атрибута LOGIN.
Выполните команду GRANT, чтобы добавить участников в групповую роль. Приведенная ниже команда добавляет user1
и user2
в group1
.
GRANT group1 TO user1, user2;
Чтобы удалить участника группы, вызовите команду REVOKE.
REVOKE group1 FROM user1;
Чтобы использовать привилегии группы, вызовите команду SET ROLE или добавьте атрибут INHERIT
роли участника группы.
Команда SET ROLE
Войдите в систему как участник группы и выполните команду SET ROLE:
SET ROLE 'group1';
В результате участник группы временно "становится" ролью group1
. Его сессия имеет доступ к привилегиям роли группы и создает объекты базы данных от имени роли группы — владельцем всех созданных объектов будет group1
.
Удаление ролей
Чтобы удалить роль, удалите или переназначьте владельца всем объектам, которыми эта роль владеет. Предоставленные разрешения также должны быть отозваны.
Вы можете использовать команду ALTER для переназначения владельца объекта. Приведенная ниже команда назначает владельцем таблицы базы данных table1
роль user2
.
ALTER TABLE table1 OWNER TO user2;
Также вы можете выполнить команду REASSIGN OWNED, чтобы переназначить владельца всем объектам роли. Команда REASSIGN OWNED передает объекты базы данных новому владельцу, но не влияет на предоставленные привилегии для объектов, не принадлежащих роли. Вызовите команду DROP OWNED, чтобы удалить эти привилегии.
REASSIGN OWNED BY user1 TO user2;
DROP OWNED BY user1;
Поскольку приведенные выше команды не могут получить доступ к объектам в других базах данных, выполните их для каждой базы данных, содержащей объекты, принадлежащие роли.
После удаления всех зависимостей вызовите команду DROP ROLE, чтобы удалить роль:
DROP ROLE user1;
Вы также можете выполнить команду dropuser из командной строки терминала, чтобы удалить роль. dropuser
— это обертка SQL-команды DROP ROLE
. Подключитесь к хосту ADPG как суперпользователь или пользователь с привилегией CREATEROLE, чтобы выполнить команду dropuser
.
$ dropuser user1