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

Распространённые вопросы по управлению доступом

Самостоятельное развертывание

Если вы работаете с самостоятельно управляемым (self-managed) 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 Console ваши SQL-запросы не будут выполняться от имени пользователя default. Вместо этого они будут выполняться от имени пользователя с именем sql-console:${cloud_login_email}, где cloud_login_email — это адрес электронной почты пользователя, который в данный момент выполняет запрос.

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

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

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

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

Тонкий контроль доступа

Эту функциональность контроля доступа также можно настроить вручную с точностью до отдельных пользователей. Перед назначением пользователям новых ролей sql_console_* необходимо создать роли баз данных для пользователей SQL-консоли, соответствующие пространству имен 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';

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

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

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

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

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

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

Проверка

Тестирование привилегий роли с пользователем, ограниченным по столбцам

Войдите в клиент ClickHouse, используя пользователя clickhouse_admin
clickhouse-client --user clickhouse_admin --password password
Проверьте доступ к базе данных, таблице и всем строкам от имени пользователя-администратора.
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     │
└────┴─────────┴─────────┘
Войдите в клиент ClickHouse, используя пользователя column_user
clickhouse-client --user column_user --password password
Проверьте выполнение запроса 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.

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

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

Тестирование привилегий роли с пользователем, ограниченным по строкам

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

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

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

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

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

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

Используя учетную запись администратора, создайте нового пользователя с ограничением и по строкам, и по столбцам, с ролями по умолчанию
CREATE USER row_and_column_user IDENTIFIED BY 'password' DEFAULT ROLE A_rows_users;
Удалите ранее выданные привилегии для роли A_rows_users
REVOKE SELECT(id, column1, column2) ON db1.table1 FROM A_rows_users;
Разрешите роли A_row_users выполнять выборку только из column1
GRANT SELECT(id, column1) ON db1.table1 TO A_rows_users;
Войдите в клиент ClickHouse, используя пользователя row_and_column_user
clickhouse-client --user row_and_column_user --password password;
Проверьте выборку всех столбцов:
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)
Проверьте с ограниченным набором разрешенных столбцов:
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
Идентификатор запроса: 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-пользователей и ролей, а также приведены шаги по назначению и изменению привилегий для пользователей и ролей. Для получения более подробной информации по каждой теме обратитесь к нашим руководствам для пользователей и справочной документации.