Перейти к основному содержимому
Перейти к основному содержимому

Общие запросы управления доступом

Самоуправляемый

Если вы работаете с самоуправляемым ClickHouse, пожалуйста, посмотрите SQL пользователи и роли.

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

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

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

Когда вы добавляете дополнительных SQL пользователей для вашего сервиса ClickHouse Cloud, им понадобится SQL имя пользователя и пароль. Если вы хотите, чтобы у них были привилегии на уровне администратора, назначьте новым пользователям роль default_role. Например, добавление пользователя clickhouse_admin:

CREATE USER IF NOT EXISTS clickhouse_admin
IDENTIFIED WITH sha256_password BY 'P!@ssword42!';
GRANT default_role TO clickhouse_admin;
примечание

При использовании SQL консоли ваши SQL запросы не будут выполняться от имени пользователя default. Вместо этого запросы будут выполняться от лица пользователя с именем sql-console:${cloud_login_email}, где cloud_login_email — это электронная почта пользователя, который в данный момент выполняет запрос.

Эти автоматически сгенерированные пользователи SQL консоли имеют роль default.

Аутентификация без пароля

Доступны две роли для SQL консоли: sql_console_admin с аналогичными разрешениями к default_role и sql_console_read_only с правами только на чтение.

Администраторские пользователи по умолчанию получают роль sql_console_admin, поэтому для них ничего не меняется. Однако роль sql_console_read_only позволяет неадминистраторским пользователям иметь доступ только для чтения или полный доступ к любому экземпляру. Администратор должен настроить этот доступ. Роли могут быть настроены с использованием команд GRANT или REVOKE, чтобы лучше соответствовать конкретным требованиям экземпляра, и любые изменения, внесенные в эти роли, будут сохранены.

Гранулярный контроль доступа

Эта функциональность контроля доступа также может быть настроена вручную для гранулярного контроля на уровне пользователей. Прежде чем назначать новые роли sql_console_* пользователям, должны быть созданы пользовательские роли баз данных, соответствующие пространству имен sql-console-role:<email>. Например:

CREATE ROLE OR REPLACE sql-console-role:<email>;
GRANT <some grants> TO sql-console-role:<email>;

Когда будет обнаружена соответствующая роль, она будет назначена пользователю вместо стандартных ролей. Это вводит более сложные конфигурации контроля доступа, такие как создание ролей вроде sql_console_sa_role и sql_console_pm_role, и назначение их конкретным пользователям. Например:

CREATE ROLE OR REPLACE sql_console_sa_role;
GRANT <whatever level of access> TO sql_console_sa_role;
CREATE ROLE OR REPLACE sql_console_pm_role;
GRANT <whatever level of access> TO sql_console_pm_role;
CREATE ROLE OR REPLACE `sql-console-role:christoph@clickhouse.com`;
CREATE ROLE OR REPLACE `sql-console-role:jake@clickhouse.com`;
CREATE ROLE OR REPLACE `sql-console-role:zach@clickhouse.com`;
GRANT sql_console_sa_role to `sql-console-role:christoph@clickhouse.com`;
GRANT sql_console_sa_role to `sql-console-role:jake@clickhouse.com`;
GRANT sql_console_pm_role to `sql-console-role:zach@clickhouse.com`;

Тестирование прав администратора

Выйдите из системы как пользователь default и войдите снова как пользователь clickhouse_admin.

Все эти команды должны выполниться успешно:

SHOW GRANTS FOR clickhouse_admin;
CREATE DATABASE db1
CREATE TABLE db1.table1 (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id;
INSERT INTO db1.table1 (id, column1) VALUES (1, 'abc');
SELECT * FROM db1.table1;
DROP TABLE db1.table1;
DROP DATABASE db1;

Неадминистративные пользователи

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

Подготовка

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

Создание тестовой базы данных, таблицы и строк

Создание тестовой базы данных
CREATE DATABASE db1;
Создание таблицы
CREATE TABLE db1.table1 (
   id UInt64,
   column1 String,
   column2 String
)
ENGINE MergeTree
ORDER BY id;
Заполнение таблицы тестовыми строками
INSERT INTO db1.table1
   (id, column1, column2)
VALUES
   (1, 'A', 'abc'),
   (2, 'A', 'def'),
   (3, 'B', 'abc'),
   (4, 'B', 'def');
Проверка таблицы
SELECT *
FROM db1.table1
Query id: 475015cc-6f51-4b20-bda2-3c9c41404e49

┌─id─┬─column1─┬─column2─┐
│  1 │ A       │ abc     │
│  2 │ A       │ def     │
│  3 │ B       │ abc     │
│  4 │ B       │ def     │
└────┴─────────┴─────────┘
Создание column_user

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

CREATE USER column_user IDENTIFIED BY 'password';
Создание row_user

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

CREATE USER row_user IDENTIFIED BY 'password';

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

В этом наборе примеров:

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

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

  1. Создайте роль, чтобы ограничить пользователей этой роли только доступом к column1 в базе данных db1 и таблице table1:
CREATE ROLE column1_users;
  1. Установите привилегии для просмотра column1
GRANT SELECT(id, column1) ON db1.table1 TO column1_users;
  1. Добавьте пользователя column_user в роль column1_users
GRANT column1_users TO column_user;
  1. Создайте роль, чтобы ограничить пользователей этой роли только доступом к выбранным строкам, в данном случае, только к строкам, содержащим A в column1
CREATE ROLE A_rows_users;
  1. Добавьте пользователя row_user в роль A_rows_users
GRANT A_rows_users TO row_user;
  1. Создайте политику, чтобы разрешить доступ только к тем строкам, где column1 имеет значение A
CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users;
  1. Установите привилегии для базы данных и таблицы
GRANT SELECT(id, column1, column2) ON db1.table1 TO A_rows_users;
  1. предоставьте явные разрешения для других ролей, чтобы они все еще имели доступ ко всем строкам
CREATE ROW POLICY allow_other_users_filter 
ON db1.table1 FOR SELECT USING 1 TO clickhouse_admin, column1_users;
примечание

При присоединении политики к таблице система применит эту политику, и только те пользователи и роли, которые определены, смогут выполнять операции с таблицей, все остальные будут лишены каких-либо операций. Чтобы не применять ограничивающую политику строк к другим пользователям, необходимо определить другую политику, позволяющую другим пользователям и ролям иметь обычный или другие типы доступа.

Проверка

Тестирование прав роли с ограниченным доступом к колонкам

  1. Войдите в клиент clickhouse, используя пользователя clickhouse_admin
clickhouse-client --user clickhouse_admin --password password
  1. Проверьте доступ к базе данных, таблице и всем строкам с административным пользователем.
SELECT *
FROM db1.table1
Query id: f5e906ea-10c6-45b0-b649-36334902d31d

┌─id─┬─column1─┬─column2─┐
│  1 │ A       │ abc     │
│  2 │ A       │ def     │
│  3 │ B       │ abc     │
│  4 │ B       │ def     │
└────┴─────────┴─────────┘
  1. Войдите в клиент ClickHouse, используя пользователя column_user
clickhouse-client --user column_user --password password
  1. Протестируйте SELECT, используя все колонки
SELECT *
FROM db1.table1
Query id: 5576f4eb-7450-435c-a2d6-d6b49b7c4a23

0 rows in set. Elapsed: 0.006 sec.

Received exception from server (version 22.3.2):
Code: 497. DB::Exception: Received from localhost:9000. 
DB::Exception: column_user: Not enough privileges. 
To execute this query it's necessary to have grant 
SELECT(id, column1, column2) ON db1.table1. (ACCESS_DENIED)
примечание

Доступ запрещен, так как указаны все колонки, а пользователь имеет доступ только к id и column1

  1. Проверьте запрос SELECT, указав только разрешенные колонки:
SELECT
    id,
    column1
FROM db1.table1
Query id: cef9a083-d5ce-42ff-9678-f08dc60d4bb9

┌─id─┬─column1─┐
│  1 │ A       │
│  2 │ A       │
│  3 │ B       │
│  4 │ B       │
└────┴─────────┘

Тестирование прав роли с ограниченным доступом к строкам

  1. Войдите в клиент ClickHouse, используя row_user
clickhouse-client --user row_user --password password
  1. Просмотрите доступные строки
SELECT *
FROM db1.table1
Query id: a79a113c-1eca-4c3f-be6e-d034f9a220fb

┌─id─┬─column1─┬─column2─┐
│  1 │ A       │ abc     │
│  2 │ A       │ def     │
└────┴─────────┴─────────┘
примечание

Убедитесь, что возвращаются только вышеуказанные две строки, строки со значением B в column1 должны быть исключены.

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

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

Например, если одна role1 разрешает только выбор column1, а role2 разрешает выбор column1 и column2, тогда пользователь будет иметь доступ к обеим колонкам.

  1. Используя учетную запись администратора, создайте нового пользователя, ограниченного как по строкам, так и по колонкам с ролью по умолчанию
CREATE USER row_and_column_user IDENTIFIED BY 'password' DEFAULT ROLE A_rows_users;
  1. Удалите предыдущие привилегии для роли A_rows_users
REVOKE SELECT(id, column1, column2) ON db1.table1 FROM A_rows_users;
  1. Разрешите роли A_row_users только выбор из column1
GRANT SELECT(id, column1) ON db1.table1 TO A_rows_users;
  1. Войдите в клиент ClickHouse, используя row_and_column_user
clickhouse-client --user row_and_column_user --password password;
  1. Протестируйте со всеми колонками:
SELECT *
FROM db1.table1
Query id: 8cdf0ff5-e711-4cbe-bd28-3c02e52e8bc4

0 rows in set. Elapsed: 0.005 sec.

Received exception from server (version 22.3.2):
Code: 497. DB::Exception: Received from localhost:9000. 
DB::Exception: row_and_column_user: Not enough privileges. 
To execute this query it's necessary to have grant 
SELECT(id, column1, column2) ON db1.table1. (ACCESS_DENIED)
  1. Протестируйте с ограниченным набором разрешенных колонок:
SELECT
    id,
    column1
FROM db1.table1
Query id: 5e30b490-507a-49e9-9778-8159799a6ed0

┌─id─┬─column1─┐
│  1 │ A       │
│  2 │ A       │
└────┴─────────┘

Устранение неполадок

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

Перечисление предоставлений и ролей для пользователя

SHOW GRANTS FOR row_and_column_user
Query id: 6a73a3fe-2659-4aca-95c5-d012c138097b

┌─GRANTS FOR row_and_column_user───────────────────────────┐
│ GRANT A_rows_users, column1_users TO row_and_column_user │
└──────────────────────────────────────────────────────────┘

Список ролей в ClickHouse

SHOW ROLES
Query id: 1e21440a-18d9-4e75-8f0e-66ec9b36470a

┌─name────────────┐
│ A_rows_users    │
│ column1_users   │
└─────────────────┘

Отображение политик

SHOW ROW POLICIES
Query id: f2c636e9-f955-4d79-8e80-af40ea227ebc

┌─name───────────────────────────────────┐
│ A_row_filter ON db1.table1             │
│ allow_other_users_filter ON db1.table1 │
└────────────────────────────────────────┘

Просмотр того, как была определена политика и текущие привилегии

SHOW CREATE ROW POLICY A_row_filter ON db1.table1
Query id: 0d3b5846-95c7-4e62-9cdd-91d82b14b80b

┌─CREATE ROW POLICY A_row_filter ON db1.table1────────────────────────────────────────────────┐
│ CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users │
└─────────────────────────────────────────────────────────────────────────────────────────────┘

Пример команд для управления ролями, политиками и пользователями

Следующие команды можно использовать для:

  • удаления привилегий
  • удаления политик
  • исключения пользователей из ролей
  • удаления пользователей и ролей
подсказка

Запускайте эти команды как пользователь-администратор или пользователь default

Удаление привилегии из роли

REVOKE SELECT(column1, id) ON db1.table1 FROM A_rows_users;

Удаление политики

DROP ROW POLICY A_row_filter ON db1.table1;

Исключение пользователя из роли

REVOKE A_rows_users FROM row_user;

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

DROP ROLE A_rows_users;

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

DROP USER row_user;

Резюме

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