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

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

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

Управлять ролями ClickHouse можно с помощью SQL-запросов. С полным списком SQL-операторов ClickHouse вы можете ознакомиться в официальной документации ClickHouse.

Запросите список ролей из системной таблицы system.roles, которая содержит метаданные обо всех ролях. Для этого используйте оператор SELECT и виртуальный движок clusterAllReplicas, который выполняет запрос к указанной таблице на всех узлах всех шардов заданного кластера.

  1. Подключитесь к кластеру.

  2. Выполните запрос:

    sql
    SELECT hostName(), name
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

    Будет выведен список ролей на каждом узле. Если списки ролей на каждом узле одинаковые, значит роли синхронизированы.

Запросите из системной таблицы system.roles данные о роли по ее имени. Для просмотра используйте оператор SELECT.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли:

    sql
    SELECT hostName(), name
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Выполните запрос:

    sql
    SELECT *
    FROM clusterAllReplicas('{cluster}', system.roles)
    WHERE name = '<имя роли>'
    LIMIT 1;

    Здесь условие LIMITсо значением 1 возвращает первую найденную запись из таблицы system.roles.

Для создания роли используйте оператор CREATE.

  1. Подключитесь к кластеру.

  2. Выполните запрос:

    sql
    CREATE ROLE [IF NOT EXISTS] <имя роли> ON CLUSTER '<имя кластера>';

    Условия в запросе:

    • IF NOT EXISTS — предотвращает ошибку, если роль с таким именем уже существует.
    • ON CLUSTER — создает роль на всех узлах заданного кластера.

Для операции используйте оператор GRANT.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли:

    sql
    SELECT hostName(), name
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Выполните запрос:

    sql
    GRANT <привилегия> ON <объект> TO <имя роли> ON CLUSTER '<имя кластера>';

Для просмотра используйте оператор SHOW.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли:

    sql
    SELECT hostName(), name
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Выполните запрос:

    sql
    SHOW GRANTS FOR <имя роли>;

Для операции используйте оператор REVOKE.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли:

    sql
    SELECT hostName(), name
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Выполните запрос:

    sql
    REVOKE <привилегия> ON <объект> FROM <имя роли> ON CLUSTER '<имя кластера>';
Важно

Назначайте профиль настроек или напрямую пользователю, или только одной из его ролей. Если для пользователя действуют сразу несколько профилей, ClickHouse произвольно применит только один из них.

Для операции используйте оператор ALTER ROLE.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли:

    sql
    SELECT hostName(), name
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Узнайте имя профиля:

    sql
    SELECT hostName(), name
    FROM clusterAllReplicas('{cluster}', system.settings_profiles);
  4. Выполните запрос:

    sql
    ALTER ROLE <имя роли>
    ON CLUSTER '<имя кластера>'
    SETTINGS PROFILE = '<имя профиля>';

    Все пользователи с этой ролью будут использовать указанный профиль.

    Также вы можете названить роли профиль настроек при создании профиля.

Запросите информацию о профиле, назначенном роли, из системной таблицы system.roles. Для просмотра используйте оператор SELECT.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли:

    sql
    SELECT hostName(), name
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Выполните запрос:

    sql
    SELECT name, settings_profile
    FROM clusterAllReplicas('{cluster}', system.roles)
    WHERE name = '<имя роли>';

    В поле settings_profile будет указано имя профиля, назначенного роли. Если профиль не назначен, поле будет пустым.

Важно

После отзыва к роли будет применен профиль настроек default. Убедитесь, что его достаточно для выполнения задач.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли:

    sql
    SELECT hostName(), name
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Выполните запрос:

    sql
    ALTER ROLE <имя роли>
    ON CLUSTER '<имя кластера>'
    SETTINGS PROFILE = NONE;

Для операции используйте оператор GRANT.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли-источника:

    sql
    SELECT hostName(), name
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Узнайте имя роли-наследника:

    sql
    SELECT hostName(), name
    FROM clusterAllReplicas('{cluster}', system.roles);
  4. Выполните запрос:

    sql
    GRANT <роль-источник> TO <роль-наследник> ON CLUSTER '<имя кластера>';

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

Для операции используйте оператор REVOKE.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли-источника:

    sql
    SELECT hostName(), name
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Узнайте имя роли-наследника:

    sql
    SELECT hostName(), name
    FROM clusterAllReplicas('{cluster}', system.roles);
  4. Выполните запрос:

    sql
    REVOKE <роль-источник> FROM <роль-наследник> ON CLUSTER '<имя кластера>';

    Роль-наследник перестанет наследовать привилегии роли-источника.

Для удаления роли используйте оператор DROP.

  1. Подключитесь к кластеру.

  2. Узнайте имя роли:

    sql
    SELECT hostName(), name
    FROM clusterAllReplicas('{cluster}', system.roles);

    Имя кластера автоматически определяется макросом {cluster}, заданным в конфигурации.

  3. Выполните запрос:

    sql
    DROP ROLE [IF EXISTS] <имя роли> ON CLUSTER '<имя кластера>' SYNC;

    Условия в запросе:

    • IF EXISTS — предотвращает ошибку, если роли с таким именем не существует.
    • ON CLUSTER — удаляет роль на всех узлах заданного кластера.
    • SYNC — гарантирует, что команда завершится только после применения изменений на всех узлах.

    Роль удалится, а пользователи потеряют привилегии, полученные с этой ролью.