Skip to content
Snippets Groups Projects
access_control.md 23.9 KiB
Newer Older
Alexander Tolstoy's avatar
Alexander Tolstoy committed
# Управление доступом
В данном разделе описана ролевая модель управления доступом в Picodata и
приведены примеры необходимых для ее настройки с помощью
[DCL](../reference/sql/dcl.md)-команд языка SQL.

## Ролевая модель {: #role_model }

Ролевая модель Picodata позволяет гибко разграничивать возможности
пользователей распределенной системы. Разграничение строится на базе
трех основных понятий: [пользователей](#users),
[привилегий](#privileges) и [ролей](#roles). Привилегии можно назначать
напрямую пользователям:
![Users and privileges](../images/user_priv.svg)

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

![Users and roles](../images/user_roles.svg)

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

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

См. также:

- [Википедия — Управление доступом на основе ролей][Wiki - RBAC]
- [Википедия — Избирательное управление доступом][Wiki - DAC]
[Wiki - RBAC]: https://ru.wikipedia.org/wiki/Управление_доступом_на_основе_ролей
[Wiki - DAC]: https://ru.wikipedia.org/wiki/Избирательное_управление_доступом

### Объекты доступа {: #access_objects }

<!--
7.1 В СУБД 6, 5, 4 классов защиты должны быть реализованы дискреционный
и ролевой методы управления доступом.
-->

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

<!-- Keep in sync with overview/glossary.md#access_objects -->
- `table`[таблица БД](#tables_access)
- `user` – учетная запись [пользователя СУБД](#users)
- `role`[роль](#roles)
- `procedure`[процедура](#proc_access)
Дискреционный метод управления доступом субъектов доступа к объектам
доступа СУБД (БД, таблица, запись или столбец, поле, представление,
процедура (программный код) или иные объекты доступа) должен
осуществляться на основе настраиваемых списков управления доступом
(матриц управления доступом).
-->

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

### Привилегии {: #privileges }

В 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` — право подключаться к экземпляру кластера. Автоматически выдается
  новым пользователям при создании.
### Пользователи СУБД {: #users }

При подключении к системе пользователь указывает имя учетной записи.
Действия, которые пользователь может совершать в системе, определяются
выданными ему привилегиями.
Каждый объект в системе (таблица, роль, учетная запись, процедура) имеет
привязанного к нему владельца — пользователя СУБД. Владельцем объекта
является его создатель. Он обладает неотъемлемыми полными привилегиями
на этот объект.
Picodata предоставляет несколько встроенных учетных записей:
- `admin` — Администратор СУБД
- `pico_service` — служебный пользователь, от имени которого происходит
  коммуникация между инстансами кластера
- `guest` — неавторизованный пользователь
<!--
Ролевой метод управления доступом должен быть реализован для следующих
ролей пользователей СУБД:

- администратор СУБД,
- администратор БД (администратор информационной системы),
- пользователь БД (пользователь информационной системы).
-->

#### Администратор СУБД {: #admin }

<!--
СУБД должна обеспечивать наделение администратора СУБД следующими правами:

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

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

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

#### Администратор БД {: #db_admin }
<!--
СУБД должна обеспечивать наделение администратора БД следующими правами:

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

Наделить пользователя СУБД правами Администратора БД можно следующим
набором SQL-команд:
Alexander Tolstoy's avatar
Alexander Tolstoy committed
CREATE ROLE "db_admin"
GRANT READ TABLE TO "db_admin"
GRANT CREATE TABLE TO "db_admin"
GRANT CREATE USER TO "db_admin"
GRANT CREATE ROLE TO "db_admin"
GRANT CREATE PROCEDURE TO "db_admin"
GRANT "db_admin" to <grantee>
Это обеспечивает наличие у администратора БД следующих прав:
- создавать учетные записи пользователей БД
- модифицировать, блокировать и удалять учетные записи пользователей БД
- управлять конфигурацией БД через создание и удаление таблиц БД
- назначать права доступа пользователям БД к таблицам БД
- создавать резервные копии БД и восстанавливать БД из резервной копии
- создавать, модифицировать и удалять хранимые процедуры
При создании объекта пользователь становится его владельцем и
автоматически получает на него неотъемлемые полные привилегии.
#### Пользователь БД {: #db_user }
<!--
СУБД должна обеспечивать наделение пользователя БД следующими правами:

- создавать и манипулировать объектами доступа БД (таблица, запись или
  столбец, поле, представление и иные объекты доступа);
- выполнять процедуры (программный код), хранимые в БД.
-->

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

Для этого используйте следующие SQL-команды:
Alexander Tolstoy's avatar
Alexander Tolstoy committed
GRANT WRITE ON TABLE <table name> TO <grantee>
GRANT READ ON TABLE <table name> TO <grantee>
GRANT EXECUTE ON PROCEDURE <procedure name> TO <grantee>
### Роли {: #roles }
Роль представляет собой именованную группу привилегий, что позволяет
структурировать управление доступом. Чтобы выдать или отозвать
привилегию у роли, используйте команды [GRANT](../reference/sql/grant.md)
и [REVOKE](../reference/sql/revoke.md).
Названия ролей `public` и `super` являются зарезервированными.
Роль `public` автоматически назначается всем создаваемым
пользователям. Наделение роли `public` привилегией на какой-либо объект
делает его общедоступным.
Роль `super` является системной и используется исключительно для
внутренних целей.
## Начало работы {: #getting_started }
Для начала работы с пользователями, привилегиями и ролями следует
[подключиться](../tutorial/connecting.md) к инстансу Picodata.
## Управление пользователями {: #user_management }

### Создание {: #create_user }

Для создания пользователя используйте SQL-команду [CREATE
USER](../reference/sql/create_user.md).
Alexander Tolstoy's avatar
Alexander Tolstoy committed
CREATE USER "alice" WITH PASSWORD 'P@ssw0rd' USING chap-sha1;
CREATE USER "bob" USING ldap;
Для имени пользователя (и в целом для объектов в Picodata) действуют
[правила использования допустимых
символов](../reference/sql/object.md). Также следует учитывать
[требования](#allowed_passwords) к длине и сложности пароля.

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

GRANT CREATE USER TO <grantee>
```

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

### Модификация {: #alter_user }
Для изменения учетных данных пользователя используйте SQL-команду [ALTER
USER](../reference/sql/alter_user.md).
Для выполнения команды требуется привилегия `ALTER USER` на
конкретную учетную запись или на все учетные записи сразу:

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

Привилегия `ALTER USER` есть по умолчанию у создателя данной учетной
записи и у [Администратора СУБД](#admin).
### Блокирование {: #block_user }

Для блокировки пользователя используйте следующую SQL-команду:

```sql
Alexander Tolstoy's avatar
Alexander Tolstoy committed
ALTER USER "alice" WITH NOLOGIN;
```
После 4 неуспешных попыток аутентификации в [picodata connect] пользователь
блокируется автоматически.

[picodata connect]: ../reference/cli.md#connect

Для разблокировки пользователя используйте следующую SQL-команду:

```sql
Alexander Tolstoy's avatar
Alexander Tolstoy committed
ALTER USER "alice" WITH LOGIN;
```

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

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

### Удаление {: #drop_user }

Для удаления пользователя используйте SQL-команду
[DROP USER](../reference/sql/drop_user.md).

Пример:
Alexander Tolstoy's avatar
Alexander Tolstoy committed
DROP USER "alice";
Для выполнения команды требуется привилегия `DROP USER` на
конкретную учетную запись или на все учетные записи сразу:

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

Привилегия `DROP USER` есть по умолчанию у создателя данной учетной
записи и у [Администратора СУБД](#admin).
### Просмотр списка пользователей {: #list_users }

Пользователи Picodata хранятся в глобальной системной таблице
`_pico_user`. Для просмотра всего списка используется следующая
Alexander Tolstoy's avatar
Alexander Tolstoy committed
SELECT * FROM "_pico_user";
```

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

```sql
GRANT READ ON TABLE "_pico_user" TO <grantee>
```

### Установка и изменение пароля {: #setting_password }

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

```sql
ALTER USER <user name> WITH PASSWORD '<password>'
```

### Требования к паролю {: #allowed_passwords }

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

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

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

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

Требования к паролю хранятся в системной таблице
[_pico_property](../architecture/system_tables.md#_pico_property).

PasswordEnforceUppercase (default value: true)
PasswordEnforceLowercase (default value: true)
PasswordEnforceDigits (default value: true)
PasswordEnforceSpecialchars (default value: false)
-->

!!! note "Примечание"
    Требования к паролю применимы при использовании
    методов аутентификации `chap-sha1` и `md5`. Для метода `ldap` пароль не
    требуется и игнорируется.
### Использование ролей {: #role_management }

Для создания и удаления ролей используйте команды
[CREATE ROLE](../reference/sql/create_role.md) и
[DROP ROLE](../reference/sql/drop_role.md).

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

Для назначения роли используйте команду [GRANT](../reference/sql/grant.md):
GRANT <role name> TO <grantee>
Назначение привилегий роли:

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

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

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

Отозвать роль можно с помощью команды [REVOKE](../reference/sql/revoke.md):
REVOKE <role name> FROM <grantee>
```

## Управление доступом к таблицам {: #tables_access }

<!--
Списки управления доступом (матрицы управления доступом) должны
позволять задавать разрешение или запрет пользователям и процедурам
(программному коду), хранимым в БД, выполнять следующие операции в
отношении объектов доступа СУБД (БД, таблица, запись или столбец, поле,
представление или иные объекты доступа): создание, модификация,
удаление, чтение.
-->

Picodata позволяет задавать разрешение пользователям и процедурам
выполнять следующие операции в отношении таблиц БД: создание,
модификация, удаление, чтение.
Для наделения пользователя и созданных им процедур указанными
привилегиями используйте SQL-команду [GRANT](../reference/sql/grant.md):
<!-- Keep in sync with #db_user -->
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>
Отозвать привилегию можно SQL-командой
[REVOKE](../reference/sql/revoke.md):

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

В качестве `<table_name>` можно использовать имена [системных таблиц] —
по умолчанию доступ к ним запрещен всем [пользователям СУБД][u], кроме
`admin` и `pico_service`.

[системных таблиц]: ../architecture/system_tables.md
[u]: #users

## Управление доступом к процедурам {: #proc_access }
<!--
Списки управления доступом (матрицы управления доступом) должны
позволять задавать разрешение или запрет пользователям СУБД выполнять
следующие операции в отношении процедур (программного кода), хранимых в
БД:

- создание;
- модификация, удаление, исполнение.
-->

Picodata позволяет задавать разрешение пользователям СУБД
выполнять следующие операции в отношении процедур: создание,
модификация, удаление, исполнение.
Для наделения пользователя указанными привилегиями используйте
SQL-команду [GRANT](../reference/sql/grant.md):
<!-- Keep in sync with #db_user -->
GRANT CREATE PROCEDURE TO <grantee>
GRANT DROP ON PROCEDURE <procedure name> TO <grantee>
GRANT EXECUTE ON PROCEDURE <procedure name> TO <grantee>
Отозвать привилегию можно SQL-командой
[REVOKE](../reference/sql/revoke.md):
REVOKE <priv> ON PROCEDURE <procedure name> FROM <grantee>
## Дополнительные примеры SQL-запросов {: #sql_examples }

```sql
CREATE USER <user name>
    [ WITH ] PASSWORD 'password'
Alexander Tolstoy's avatar
Alexander Tolstoy committed
    [ USING chap-sha1 | ldap | md5 ]
ALTER USER <user name>
    [ WITH ] PASSWORD 'password'
Alexander Tolstoy's avatar
Alexander Tolstoy committed
    [ USING chap-sha1 | ldap | md5 ]
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 CREATE PROCEDURE TO <grantee>
GRANT ALTER TABLE TO <grantee> -- alter any table
GRANT ALTER USER TO <grantee> -- alter any user
GRANT ALTER ON TABLE <table name> TO <grantee>
Alexander Tolstoy's avatar
Alexander Tolstoy committed
GRANT ALTER ON USER <user name> to <grantee>;
GRANT DROP TABLE TO <grantee> -- drop any table
GRANT DROP USER TO <grantee> -- drop any user
GRANT DROP ROLE TO <grantee> -- drop any role
Alexander Tolstoy's avatar
Alexander Tolstoy committed
GRANT DROP PROCEDURE TO <grantee>; -- drop any procedure
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 DROP ON PROCEDURE <procedure name> TO <grantee>
GRANT EXECUTE ON PROCEDURE <procedure name> TO <grantee>
GRANT EXECUTE PROCEDURE TO <grantee> -- execute any procedure
GRANT <role name> TO <grantee>