> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Типовые запросы для управления доступом

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

<Tip>
  **Самоуправляемый**

  Если вы работаете с самоуправляемым ClickHouse, см. [пользователи и роли SQL](/docs/ru/concepts/features/security/access-rights).
</Tip>

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

<div id="admin-user">
  ## Пользователь с ролью Admin
</div>

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

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

```sql theme={null}
CREATE USER IF NOT EXISTS clickhouse_admin
IDENTIFIED WITH sha256_password BY 'P!@ssword42!';
```

```sql theme={null}
GRANT default_role TO clickhouse_admin;
```

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

  Эти автоматически созданные пользователи SQL Console имеют роль `default`.
</Note>

<div id="passwordless-authentication">
  ## Аутентификация без пароля
</div>

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

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

<div id="granular-access-control">
  ### Тонкая настройка управления доступом
</div>

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

```sql theme={null}
CREATE ROLE OR REPLACE sql-console-role:<email>;
GRANT <some grants> TO sql-console-role:<email>;
```

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

```sql theme={null}
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`;
```

<div id="test-admin-privileges">
  ## Проверьте права администратора
</div>

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

Все перечисленные ниже действия должны выполниться успешно:

```sql theme={null}
SHOW GRANTS FOR clickhouse_admin;
```

```sql theme={null}
CREATE DATABASE db1
```

```sql theme={null}
CREATE TABLE db1.table1 (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id;
```

```sql theme={null}
INSERT INTO db1.table1 (id, column1) VALUES (1, 'abc');
```

```sql theme={null}
SELECT * FROM db1.table1;
```

```sql theme={null}
DROP TABLE db1.table1;
```

```sql theme={null}
DROP DATABASE db1;
```

<div id="non-admin-users">
  ## Пользователи без прав администратора
</div>

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

<div id="preparation">
  ### Подготовка
</div>

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

<div id="creating-a-sample-database-table-and-rows">
  #### Создание тестовой базы данных, таблицы и строк
</div>

<Steps>
  <Step title="Создайте тестовую базу данных" id="create-a-test-database">
    ```sql theme={null}
    CREATE DATABASE db1;
    ```
  </Step>

  <Step title="Создайте таблицу" id="create-a-table">
    ```sql theme={null}
    CREATE TABLE db1.table1 (
       id UInt64,
       column1 String,
       column2 String
    )
    ENGINE MergeTree
    ORDER BY id;
    ```
  </Step>

  <Step title="Заполните таблицу примерными строками" id="populate">
    ```sql theme={null}
    INSERT INTO db1.table1
       (id, column1, column2)
    VALUES
       (1, 'A', 'abc'),
       (2, 'A', 'def'),
       (3, 'B', 'abc'),
       (4, 'B', 'def');
    ```
  </Step>

  <Step title="Проверьте таблицу" id="verify">
    ```sql title="Запрос" theme={null}
    SELECT *
    FROM db1.table1
    ```

    ```response title="Ответ" theme={null}
    Query id: 475015cc-6f51-4b20-bda2-3c9c41404e49

    ┌─id─┬─column1─┬─column2─┐
    │  1 │ A       │ abc     │
    │  2 │ A       │ def     │
    │  3 │ B       │ abc     │
    │  4 │ B       │ def     │
    └────┴─────────┴─────────┘
    ```
  </Step>

  <Step title={<>Создайте <code>column_user</code></>} id="create-a-user-with-restricted-access-to-columns">
    Создайте обычного пользователя для демонстрации ограничения доступа к определённым столбцам:

    ```sql theme={null}
    CREATE USER column_user IDENTIFIED BY 'password';
    ```
  </Step>

  <Step title={<>Создайте <code>row_user</code></>} id="create-a-user-with-restricted-access-to-rows-with-certain-values">
    Создайте обычного пользователя для демонстрации ограничения доступа к строкам с определёнными значениями:

    ```sql theme={null}
    CREATE USER row_user IDENTIFIED BY 'password';
    ```
  </Step>
</Steps>

<div id="creating-roles">
  #### Создание ролей
</div>

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

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

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

<Steps>
  <Step title={<>Создайте роль, чтобы ограничить пользователей этой роли просмотром только <code>column1</code> в базе данных <code>db1</code> и таблице <code>table1</code>:</>} id="create-column-role">
    ```sql theme={null}
    CREATE ROLE column1_users;
    ```
  </Step>

  <Step title={<>Задайте привилегии, разрешающие просмотр <code>column1</code></>} id="set-column-privileges">
    ```sql theme={null}
    GRANT SELECT(id, column1) ON db1.table1 TO column1_users;
    ```
  </Step>

  <Step title={<>Добавьте пользователя <code>column_user</code> в роль <code>column1_users</code></>} id="add-column-user-to-role">
    ```sql theme={null}
    GRANT column1_users TO column_user;
    ```
  </Step>

  <Step title={<>Создайте роль, чтобы ограничить пользователей этой роли просмотром только выбранных строк — в данном случае только строк, где <code>column1</code> содержит <code>A</code></>} id="create-row-role">
    ```sql theme={null}
    CREATE ROLE A_rows_users;
    ```
  </Step>

  <Step title={<>Добавьте <code>row_user</code> в роль <code>A_rows_users</code></>} id="add-row-user-to-role">
    ```sql theme={null}
    GRANT A_rows_users TO row_user;
    ```
  </Step>

  <Step title={<>Создайте политику, разрешающую просмотр только строк, где <code>column1</code> имеет значение <code>A</code></>} id="create-row-policy">
    ```sql theme={null}
    CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users;
    ```
  </Step>

  <Step title="Задайте привилегии для базы данных и таблицы" id="set-db-table-privileges">
    ```sql theme={null}
    GRANT SELECT(id, column1, column2) ON db1.table1 TO A_rows_users;
    ```
  </Step>

  <Step title="Выдайте явные разрешения другим ролям, чтобы у них по-прежнему был доступ ко всем строкам" id="grant-other-roles-access">
    ```sql theme={null}
    CREATE ROW POLICY allow_other_users_filter 
    ON db1.table1 FOR SELECT USING 1 TO clickhouse_admin, column1_users;
    ```

    <Note>
      При привязке политики к таблице система применяет эту политику, и только указанные в ней пользователи и роли смогут выполнять операции с таблицей; всем остальным любые операции будут запрещены. Чтобы ограничивающая политика строк не применялась к другим пользователям, необходимо определить другую политику, которая предоставит другим пользователям и ролям обычный или иной тип доступа.
    </Note>
  </Step>
</Steps>

<div id="verification">
  ## Проверка
</div>

<div id="testing-role-privileges-with-column-restricted-user">
  ### Проверка привилегий роли для пользователя с ограничением доступа к столбцам
</div>

<Steps>
  <Step title={<>Войдите в клиент ClickHouse под пользователем <code>clickhouse_admin</code></>} id="login-admin-user">
    ```bash theme={null}
    clickhouse-client --user clickhouse_admin --password password
    ```
  </Step>

  <Step title="Проверьте доступ к базе данных, таблице и всем строкам под пользователем admin." id="verify-admin-access">
    ```sql theme={null}
    SELECT *
    FROM db1.table1
    ```

    ```response theme={null}
    Query id: f5e906ea-10c6-45b0-b649-36334902d31d

    ┌─id─┬─column1─┬─column2─┐
    │  1 │ A       │ abc     │
    │  2 │ A       │ def     │
    │  3 │ B       │ abc     │
    │  4 │ B       │ def     │
    └────┴─────────┴─────────┘
    ```
  </Step>

  <Step title={<>Войдите в клиент ClickHouse под пользователем <code>column_user</code></>} id="login-column-user">
    ```bash theme={null}
    clickhouse-client --user column_user --password password
    ```
  </Step>

  <Step title={<>Проверьте <code>SELECT</code> со всеми столбцами</>} id="test-select-all-columns">
    ```sql theme={null}
    SELECT *
    FROM db1.table1
    ```

    ```response theme={null}
    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)
    ```

    <Note>
      Доступ запрещён, так как указаны все столбцы, а у пользователя есть доступ только к `id` и `column1`
    </Note>
  </Step>

  <Step title={<>Проверьте запрос <code>SELECT</code>, указав только разрешённые столбцы:</>} id="verify-allowed-columns">
    ```sql theme={null}
    SELECT
        id,
        column1
    FROM db1.table1
    ```

    ```response theme={null}
    Query id: cef9a083-d5ce-42ff-9678-f08dc60d4bb9

    ┌─id─┬─column1─┐
    │  1 │ A       │
    │  2 │ A       │
    │  3 │ B       │
    │  4 │ B       │
    └────┴─────────┘
    ```
  </Step>
</Steps>

<div id="testing-role-privileges-with-row-restricted-user">
  ### Проверка привилегий роли с пользователем с ограничением по строкам
</div>

<Steps>
  <Step title={<>Войдите в клиент ClickHouse под пользователем <code>row_user</code></>} id="login-row-user">
    ```bash theme={null}
    clickhouse-client --user row_user --password password
    ```
  </Step>

  <Step title="Просмотрите доступные строки" id="view-available-rows">
    ```sql theme={null}
    SELECT *
    FROM db1.table1
    ```

    ```response theme={null}
    Query id: a79a113c-1eca-4c3f-be6e-d034f9a220fb

    ┌─id─┬─column1─┬─column2─┐
    │  1 │ A       │ abc     │
    │  2 │ A       │ def     │
    └────┴─────────┴─────────┘
    ```

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

<div id="modifying-users-and-roles">
  ## Изменение пользователей и ролей
</div>

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

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

<Steps>
  <Step title="Используя учетную запись администратора, создайте нового пользователя с ограничением доступа и по строкам, и по столбцам, а также с ролями по умолчанию" id="create-restricted-user">
    ```sql theme={null}
    CREATE USER row_and_column_user IDENTIFIED BY 'password' DEFAULT ROLE A_rows_users;
    ```
  </Step>

  <Step title={<>Удалите ранее выданные привилегии у роли <code>A_rows_users</code></>} id="remove-prior-privileges">
    ```sql theme={null}
    REVOKE SELECT(id, column1, column2) ON db1.table1 FROM A_rows_users;
    ```
  </Step>

  <Step title={<>Разрешите роли <code>A_row_users</code> выполнять SELECT только по <code>column1</code></>} id="allow-column1-select">
    ```sql theme={null}
    GRANT SELECT(id, column1) ON db1.table1 TO A_rows_users;
    ```
  </Step>

  <Step title={<>Войдите в клиент ClickHouse под пользователем <code>row_and_column_user</code></>} id="login-restricted-user">
    ```bash theme={null}
    clickhouse-client --user row_and_column_user --password password;
    ```
  </Step>

  <Step title="Проверка со всеми столбцами:" id="test-all-columns-restricted">
    ```sql theme={null}
    SELECT *
    FROM db1.table1
    ```

    ```response theme={null}
    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)
    ```
  </Step>

  <Step title="Проверка с ограниченным набором разрешенных столбцов:" id="test-limited-columns">
    ```sql theme={null}
    SELECT
        id,
        column1
    FROM db1.table1
    ```

    ```response theme={null}
    Query id: 5e30b490-507a-49e9-9778-8159799a6ed0

    ┌─id─┬─column1─┐
    │  1 │ A       │
    │  2 │ A       │
    └────┴─────────┘
    ```
  </Step>
</Steps>

<div id="troubleshooting">
  ## Устранение неполадок
</div>

Иногда пересечение или сочетание привилегий приводит к неожиданным результатам; чтобы сузить область поиска проблемы, можно использовать следующие команды, выполнив вход под учетной записью администратора

<div id="listing-the-grants-and-roles-for-a-user">
  ### Просмотр привилегий и ролей пользователя
</div>

```sql theme={null}
SHOW GRANTS FOR row_and_column_user
```

```response theme={null}
Query id: 6a73a3fe-2659-4aca-95c5-d012c138097b

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

<div id="list-roles-in-clickhouse">
  ### Просмотр ролей в ClickHouse
</div>

```sql theme={null}
SHOW ROLES
```

```response theme={null}
Query id: 1e21440a-18d9-4e75-8f0e-66ec9b36470a

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

<div id="display-the-policies">
  ### Просмотреть политики
</div>

```sql theme={null}
SHOW ROW POLICIES
```

```response theme={null}
Query id: f2c636e9-f955-4d79-8e80-af40ea227ebc

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

<div id="view-how-a-policy-was-defined-and-current-privileges">
  ### Просмотрите, как задана политика и какие привилегии действуют сейчас
</div>

```sql theme={null}
SHOW CREATE ROW POLICY A_row_filter ON db1.table1
```

```response theme={null}
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 │
└─────────────────────────────────────────────────────────────────────────────────────────────┘
```

<div id="example-commands-to-manage-roles-policies-and-users">
  ## Пример команд для управления ролями, политиками и пользователями
</div>

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

* удалить привилегии
* удалить политики
* отвязать пользователей от ролей
* удалить пользователей и роли
  <br />

<Tip>
  Выполняйте эти команды от имени пользователя с правами администратора или пользователя `default`
</Tip>

<div id="remove-privilege-from-a-role">
  ### Отозвать привилегию у роли
</div>

```sql theme={null}
REVOKE SELECT(column1, id) ON db1.table1 FROM A_rows_users;
```

<div id="delete-a-policy">
  ### Удалить политику
</div>

```sql theme={null}
DROP ROW POLICY A_row_filter ON db1.table1;
```

<div id="unassign-a-user-from-a-role">
  ### Удалить пользователя из роли
</div>

```sql theme={null}
REVOKE A_rows_users FROM row_user;
```

<div id="delete-a-role">
  ### Удалить роль
</div>

```sql theme={null}
DROP ROLE A_rows_users;
```

<div id="delete-a-user">
  ### Удаление пользователя
</div>

```sql theme={null}
DROP USER row_user;
```

<div id="summary">
  ## Краткие итоги
</div>

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