> ## 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.

# Управление сервисными учетными записями базы данных

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

Сервисные учетные записи базы данных могут представлять собой просто пользователя с отдельным паролем или сертификатом для authentication. Более опытные пользователи могут настроить учетные записи, в которых набор разрешений можно динамически изменять с помощью `SET ROLE`, чтобы быстро переключаться между профилями без выхода из системы и перезагрузки содержимого.

<div id="overview">
  ## Обзор
</div>

[SET ROLE](/docs/ru/reference/statements/set-role) можно использовать, чтобы динамически ограничивать разрешения сервисной учетной записи в рамках сеанса. Это работает так: фактические разрешения пользователя ограничиваются только теми, которые выданы активированной роли или ролям. У этого подхода есть несколько преимуществ:

* Сервисной учетной записи можно назначить несколько ролей, но активировать только ту, которая нужна для конкретного запроса.
* Если сервисная учетная запись скомпрометирована, злоумышленники смогут использовать только разрешения активной роли.
* Одна учетная запись может выполнять разные задачи, переключая роли, вместо того чтобы использовать отдельные учетные данные для каждой задачи.
* Разрешения можно обновить для целого класса сервисных учетных записей, изменив одну роль, а не обновляя отдельных пользователей.
* Журналы могут отслеживать, какая именно роль была активна во время запроса, что дает более ясный контекст для аудита безопасности.

На практике вы:

1. Проектируете роли, задающие допустимые границы (read\_only, maintenance и т. д.)
2. Выдаете их сервисной учетной записи
3. При установлении соединения выбираете активную роль или роли через `SET ROLE` (или параметр роли), тем самым ограничивая возможности этого сеанса

<div id="setup-service-roles">
  ## Настройте сервисную роль
</div>

<Steps>
  <Step title="Выдайте роли сервисной учетной записи" id="grant-roles-to-service-account">
    Сначала создайте роли с нужными привилегиями/настройками, затем выдайте их сервисной учетной записи.

    ```sql theme={null}
    CREATE ROLE read_only_role;
    GRANT SELECT ON db1.* TO read_only_role;

    CREATE ROLE maint_role;
    GRANT SELECT, INSERT, ALTER on db1.* TO maint_role;

    GRANT read_only_role, maint_role TO service_user;
    ```
  </Step>

  <Step title="Используйте SET ROLE, чтобы определить границы сеанса" id="define-permission-boundaries">
    В начале сеанса сервисная учетная запись выбирает, какие роли будут активны:

    ```sql theme={null}
    -- Только режим "только для чтения" для этого сеанса
    SET ROLE read_only_role;
    ```

    или:

    ```sql theme={null}
    -- Использовать все выданные роли (полные права)
    SET ROLE ALL;
    ```

    `SET ROLE` активирует роли для текущего пользователя; итоговые привилегии — это объединение всех активных ролей и привилегий, напрямую выданных пользователю.

    Вы также можете деактивировать все роли:

    ```sql theme={null}
    SET ROLE NONE;
    ```

    или активировать несколько ролей:

    ```sql theme={null}
    SET ROLE read_only_role, maint_role;
    ```

    Текущие активные роли можно посмотреть в `system.current_roles`.
  </Step>

  <Step title="Задайте роли по умолчанию для сервисной учетной записи" id="set-default-role">
    Чтобы сервисная учетная запись всегда запускалась в ограниченном режиме, настройте роли по умолчанию:

    ```sql theme={null}
    SET DEFAULT ROLE read_only_role TO service_user;
    ```

    или

    ```sql theme={null}
    SET DEFAULT ROLE ALL EXCEPT maint_role TO service_user;
    ```
  </Step>

  <Step title="Использование SET ROLE по HTTP / программно" id="use-set-role-programmatically">
    Если сервисная учетная запись подключается по HTTP, вы не можете отправить `SET ROLE; SELECT ...` как многооператорный запрос. Вместо этого передайте роль как query parameter:

    ```shell theme={null}
    curl "https://host:8123?user=service_user&password=...&role=read_only_role" \
     --data-binary "SELECT * FROM db1.table1"
    ```

    `?role=`... эквивалентно выполнению `SET ROLE read_only_role` перед оператором. Несколько параметров роли работают так же, как `SET ROLE role 1, role 2`.

    Некоторые драйверы (например, ClickHouse Connect for Python) также поддерживают настройку роли, которая отправляется с каждым запросом и используется сервером как роль сеанса.
  </Step>
</Steps>
