Перейти к содержанию

Управление доступом

В данном разделе описана ролевая модель управления доступом в Picodata и приведены примеры необходимых для ее настройки с помощью DCL-команд языка SQL.

Ролевая модель

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

Также, привилегии могут быть назначены роли, которая, в свою очередь, может быть присвоена пользователю:

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

Пользователь, который назначает привилегию, должен сам обладать ею. Глобальные привилегии может назначать только администратор СУБД.

См. также:

Объекты доступа

Picodata является распределенной СУБД, и управление доступом происходит централизованно на всем кластере. Для управления доступом в Picodata используются дискреционный и ролевой методы. Объектами доступа являются:

Доступ к объектам предоставляется на основе настраиваемого списка управления доступом (access control list, ACL), который определяет, какими привилегиями обладает пользователь или роль.

Привилегии

В Picodata определены следующие виды привилегий:

  • привилегии для работы с пользователями (CREATE USER, ALTER USER, DROP USER)
  • привилегии для работы с ролями (CREATE ROLE, DROP ROLE)
  • привилегии для работы с таблицами (CREATE TABLE, ALTER TABLE, DROP TABLE, READ TABLE, WRITE TABLE)
  • привилегии для работы с процедурами (CREATE PROCEDURE, DROP PROCEDURE, EXECUTE PROCEDURE)
  • LOGIN — право подключаться к экземпляру кластера. Автоматически выдается новым пользователям при создании.

Пользователи СУБД

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

Каждый объект в системе (таблица, роль, учетная запись) имеет привязанного к нему владельца — пользователя СУБД. Владелец объекта автоматически получает все привилегии на этот объект.

Picodata предоставляет несколько встроенных учетных записей:

  • admin — Администратор СУБД
  • pico_service — служебный пользователь, от имени которого происходит коммуникация между инстансами кластера
  • guest — неавторизованный пользователь

Администратор СУБД

Администратором СУБД является встроенный пользователь admin.

Администратор СУБД является суперпользователем и обладает следующими привилегиями:

  • создавать учетные записи пользователей СУБД
  • модифицировать, блокировать и удалять учетные записи пользователей СУБД
  • назначать права доступа пользователям СУБД к объектам доступа СУБД
  • управлять конфигурацией СУБД
  • создавать, подключать БД

Администратор БД

Наделить пользователя СУБД правами Администратора БД можно следующим набором SQL-команд:

GRANT CREATE TABLE TO <grantee>
GRANT CREATE USER TO <grantee>
GRANT CREATE ROLE TO <grantee>
GRANT CREATE PROCEDURE TO <grantee>

Это обеспечивает наличие у администратора БД следующих прав:

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

При создании объекта пользователь становится его владельцем и автоматически получает на него следующие права (в зависимости от типа объекта):

-- CREATE TABLE <table name> ...
GRANT ALTER ON TABLE <table name> TO <owner>
GRANT DROP ON TABLE <table name> TO <owner>
GRANT READ ON TABLE <table name> TO <owner>
GRANT WRITE ON TABLE <table name> TO <owner>

-- CREATE USER <user name>
GRANT ALTER ON USER <user name> TO <owner>
GRANT DROP ON USER <user name> TO <owner>

-- CREATE ROLE <role name>
GRANT DROP ON ROLE <role name> TO <owner>

-- CREATE PROCEDURE <procedure name>
GRANT ALTER ON PROCEDURE <procedure name> TO <owner>
GRANT EXECUTE ON PROCEDURE <procedure name> TO <owner>
GRANT DROP ON PROCEDURE <procedure name> TO <owner>

Пользователь БД

Picodata позволяет наделить пользователя БД следующими правами:

  • создавать и манипулировать таблицами БД
  • создавать и манипулировать хранимыми процедурами
  • выполнять хранимые процедуры

Для этого используйте следующие SQL-команды:

GRANT CREATE TABLE TO <grantee>
GRANT ALTER ON TABLE <table name> TO <grantee>
GRANT DROP ON TABLE <table name> TO <grantee>
GRANT READ ON TABLE <table name> TO <grantee>
GRANT WRITE ON TABLE <table name> TO <grantee>

GRANT CREATE PROCEDURE TO <grantee>
GRANT ALTER ON PROCEDURE <procedure name> TO <grantee>
GRANT DROP ON PROCEDURE <procedure name> TO <grantee>

GRANT EXECUTE ON PROCEDURE <procedure name> TO <grantee>

Роли

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

Названия ролей public и super являются зарезервированными.

Роль public автоматически назначается всем создаваемым пользователям. Наделение роли public привилегией на какой-либо объект делает его общедоступным.

Роль super является системной и используется исключительно для внутренних целей.

Начало работы

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

Управление пользователями

Создание

Для создания пользователя используйте SQL-команду CREATE USER.

Пример:

CREATE USER alice WITH PASSWORD 'T0tallysecret' USING chap-sha1
CREATE USER bob USING ldap

Для имени пользователя (и в целом для объектов в Picodata) действуют правила использования допустимых символов. Также следует учитывать требования к длине и сложности пароля.

Для выполнения команды требуется привилегия CREATE USER:

GRANT CREATE USER TO <grantee>

Такое право по умолчанию есть у Администратора СУБД (admin).

Модификация

Для изменения учетных данных пользователя используйте SQL-команду ALTER USER.

Пример блокировки / разблокировки пользователя:

ALTER USER alice WITH NOLOGIN
ALTER USER alice WITH LOGIN

Для выполнения команды требуется привилегия ALTER USER на конкретную учетную запись или на все учетные записи сразу:

GRANT ALTER ON USER <user name> TO <grantee>
GRANT ALTER USER TO <grantee>

Привилегия ALTER USER есть по умолчанию у создателя данной учетной записи и у Администратора СУБД.

Удаление

Для удаления пользователя используйте SQL-команду DROP USER.

Пример:

DROP USER alice

Для выполнения команды требуется привилегия DROP USER на конкретную учетную запись или на все учетные записи сразу:

GRANT DROP ON USER <user name> TO <grantee>
GRANT DROP USER TO <grantee>

Привилегия DROP USER есть по умолчанию у создателя данной учетной записи и у Администратора СУБД.

Требования к паролю

При установке или изменении пароля пользователя следует учитывать требования к его длине и сложности:

  • пароль должен быть не короче 8 символов
  • пароль должен одновременно содержать минимум один символ в нижнем регистре, символ в верхнем регистре и одну цифру

Пример некорректного пароля: topsecret

Пример корректного пароля: T0psecret

Примечание

Требования к паролю применимы при использовании методов аутентификации chap-sha1 и md5. Для метода ldap пароль не требуется и игнорируется.

Использование ролей

Для создания и удаления ролей используйте команды CREATE ROLE и DROP ROLE.

Выполнение данных действий требует наличия привилегий CREATE ROLE / DROP ROLE соответственно.

Для назначения роли используйте команду GRANT:

GRANT <role name> TO <grantee>

Назначение привилегий роли:

GRANT <action> ON <object name> TO <grantee>

В качестве grantee может выступать идентификатор как роли, так и пользователя. Стоит отметить, что не все привилегии можно выдать ролям, например, привилегия SESSION не может быть выдана другой роли при помощи GRANT, а только командой ALTER USER.

Выдать или отозвать роль может только ее создатель. Исключением является администратор СУБД, который может выдать или отозвать любую роль.

Отозвать роль можно с помощью команды REVOKE:

REVOKE <role name> FROM <grantee>

Управление доступом к таблицам

Picodata позволяет задавать разрешение пользователям и процедурам выполнять следующие операции в отношении таблиц БД: создание, модификация, удаление, чтение.

Для наделения пользователя и созданных им процедур указанными привилегиями используйте SQL-команду GRANT:

GRANT CREATE TABLE TO <grantee>
GRANT ALTER ON TABLE <table name> TO <grantee>
GRANT DROP ON TABLE <table name> TO <grantee>
GRANT READ ON TABLE <table name> TO <grantee>

Отозвать привилегию можно SQL-командой REVOKE:

REVOKE <priv> ON TABLE <table name> FROM <grantee>

Управление доступом к процедурам

Picodata позволяет задавать разрешение пользователям СУБД выполнять следующие операции в отношении процедур: создание, модификация, удаление, исполнение.

Для наделения пользователя указанными привилегиями используйте SQL-команду GRANT:

GRANT CREATE PROCEDURE TO <grantee>
GRANT ALTER ON PROCEDURE <procedure name> TO <grantee>
GRANT DROP ON PROCEDURE <procedure name> TO <grantee>
GRANT EXECUTE ON PROCEDURE <procedure name> TO <grantee>

Отозвать привилегию можно SQL-командой REVOKE:

REVOKE <priv> ON PROCEDURE <procedure name> FROM <grantee>

Дополнительные примеры SQL-запросов

CREATE USER <user name>
    [ [ WITH ] PASSWORD 'password' ]
    [ USING chap-sha1 | md5 | ldap ]
ALTER USER <user name>
    [ [ WITH ] PASSWORD 'password' ]
    [ USING chap-sha1 | md5 | ldap ]
DROP USER <user name>

CREATE ROLE <role name>
DROP ROLE <role name>

GRANT READ ON TABLE <table name> TO <grantee>
GRANT READ TABLE TO <grantee>

GRANT WRITE TABLE TO <grantee>
GRANT WRITE ON TABLE <table name> TO <grantee>

GRANT CREATE TABLE TO <grantee>
GRANT CREATE ROLE TO <grantee>
GRANT CREATE USER TO <grantee>

GRANT ALTER TABLE TO <grantee> // alter any table
GRANT ALTER ON TABLE <table name> TO <grantee>
GRANT ALTER USER to <grantee>
GRANT ALTER ON USER <user name> to <grantee>

GRANT DROP TABLE TO <grantee>
GRANT DROP USER TO <grantee>
GRANT DROP ROLE TO <grantee>
GRANT DROP ON TABLE <table name> TO <grantee>
GRANT DROP ON USER <user name> TO <grantee>
GRANT DROP ON ROLE <role name> TO <grantee>

GRANT EXECUTE ON PROCEDURE <proc name> TO <grantee>
GRANT DROP ON PROCEDURE <proc name> TO <grantee>

GRANT <role name> TO <grantee>