Роли и привилегии базы данных

ADPG использует роли для управления разрешениями на доступ к базе данных. Роль представляет собой пользователя базы данных или группу пользователей. Роли могут владеть объектами базы данных, например, таблицами и функциями, разрешать доступ и действия над этими объектами (назначать привилегии). Также можно предоставить членство в роли другой роли, чтобы использовать её привилегии.

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

Кластер ADPG содержит предопределенную роль суперпользователя postgres. Чтобы создать дополнительные роли, подключитесь к хосту ADPG как postgres.

Создание роли

Чтобы создать роль, используйте SQL-команду CREATE ROLE. Вы можете выполнять команды в пользовательском интерфейсе ADCM или в командной строке 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)

CREATE ROLE name LOGIN;

SUPERUSER

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

CREATE ROLE name SUPERUSER;

CREATEDB

Роль может создавать базы данных

CREATE ROLE name CREATEDB;

CREATEROLE

Роль может создавать, изменять и удалять другие роли, предоставлять или отзывать членство в ролях

CREATE ROLE name CREATEROLE;

REPLICATION

Роль имеет разрешение инициировать потоковую репликацию. Эта роль также должна иметь привилегию LOGIN

CREATE ROLE name REPLICATION LOGIN;

PASSWORD

Используйте этот атрибут, если для метода аутентификации клиента требуется пароль. Дополнительную информацию можно найти в статье Аутентификация в ADPG по паролю

CREATE ROLE name PASSWORD 'password_string';
ПРИМЕЧАНИЕ
Мы рекомендуем создать роль с привилегиями 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.

Атрибут INHERIT

Ролям участников группы с атрибутом INHERIT автоматически назначаются привилегии группы. В приведенном ниже примере user3 может использовать привилегии group1 сразу после входа в систему.

CREATE ROLE user3 LOGIN INHERIT;
GRANT group1 TO user3;

Удаление ролей

Чтобы удалить роль, удалите или переназначьте владельца всем объектам, которыми эта роль владеет. Предоставленные разрешения также должны быть отозваны.

Вы можете использовать команду 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
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней