[Документация Yandex Cloud](../../index.md) > [Yandex Managed Service for MySQL®](../index.md) > [Пошаговые инструкции](index.md) > Пользователи MySQL® > Управление правами пользователей

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

Вы можете управлять [правами пользователей](../concepts/user-rights.md) на уровне всего кластера или отдельной базы данных, [изменяя их привилегии](#grant-privilege). При этом [административные привилегии](../concepts/settings-list.md#setting-administrative-privileges) задаются на уровне кластера.

{% note warning %}

Чтобы изменить права пользователей на уровне [всего кластера](../concepts/settings-list.md#setting-administrative-priveleges) или [отдельной базы данных](grant.md#grant-privilege), используйте интерфейсы Yandex Cloud. Изменения, внесенные командами SQL, не сохраняются.

Подробнее в разделе [Права пользователей в Managed Service for MySQL®](../concepts/user-rights.md).

{% endnote %}

## Изменить привилегии пользователя {#grant-privilege}

{% list tabs group=instructions %}

- Консоль управления {#console}

  1. Перейдите в сервис **Managed Service for&nbsp;MySQL**.

  1. Нажмите на имя нужного кластера и выберите вкладку ![image-users](../../_assets/console-icons/persons.svg) **Пользователи**.

  1. Нажмите значок ![image](../../_assets/console-icons/ellipsis.svg) и выберите пункт **Настроить**.

  1. При необходимости добавьте пользователю нужные базы данных:

     1. Нажмите кнопку **Добавить базу данных**.
     1. Выберите базу данных из выпадающего списка.
     1. Повторите два предыдущих шага, пока не будут выбраны все требуемые базы данных.
     1. Чтобы отозвать доступ к определенной базе, удалите ее из перечня, нажав значок ![image](../../_assets/console-icons/xmark.svg) справа от имени базы данных.

  1. Задайте нужные привилегии пользователя отдельно для каждой базы данных:

     1. Нажмите значок ![image](../../_assets/console-icons/plus.svg) в столбце **Роли**.
     1. Выберите привилегию, которую вы хотите добавить пользователю из выпадающего списка.
     1. Повторите два предыдущих шага, пока не будут добавлены все требуемые привилегии.

  1. Чтобы отозвать привилегию, нажмите значок ![image](../../_assets/console-icons/xmark.svg) справа от ее имени.
  1. (Опционально) В блоке **Дополнительные настройки** в поле **Global permissions** задайте [административные привилегии пользователя](../concepts/settings-list.md#setting-administrative-privileges) на уровне кластера.
  1. Нажмите кнопку **Сохранить**.

- CLI {#cli}

  Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../cli/quickstart.md#install).

  По умолчанию используется каталог, указанный при [создании](../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

  * Добавить привилегии пользователю:

      ```bash
      yc managed-mysql user grant-permission <имя_пользователя> \
        --cluster-name <имя_кластера> \
        --database <имя_БД> \
        --permissions <набор_привилегий_через_запятую>
      ```

      Имя кластера можно запросить со [списком кластеров в каталоге](cluster-list.md), имя базы данных — со [списком баз данных в кластере](databases.md#list-db), имя пользователя — со [списком пользователей в кластере](cluster-users.md#list-users).

  * Отозвать привилегии у пользователя:

      ```bash
      yc managed-mysql user revoke-permission <имя_пользователя> \
        --cluster-name <имя_кластера> \
        --database <имя_БД> \
        --permissions <набор_привилегий_через_запятую>
      ```

      Чтобы добавить или отозвать привилегию `ALL_PRIVILEGES`, передайте в качестве названия синоним `ALL`.

- Terraform {#tf}

  1. Откройте актуальный конфигурационный файл Terraform с планом инфраструктуры.

      Как создать такой файл описано в разделе [Создание кластера](cluster-create.md).

  1. Найдите ресурс `yandex_mdb_mysql_user` нужного пользователя и измените список его привилегий для требуемой БД в параметре `roles`:

      ```hcl
      resource "yandex_mdb_mysql_user" "<имя_пользователя>" {
        cluster_id = "<идентификатор_кластера>"
        name       = "<имя_пользователя>"
        permission {
          database_name = "<имя_БД>"
          roles         = [<список_привилегий>]
        }
        ...
      }
      ```

      Где:

      * `database_name` — имя БД, к которой пользователь должен иметь доступ.
      * `roles` — список привилегий пользователя по отношению к БД.

  1. Проверьте корректность настроек.

      1. В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
      1. Выполните команду:
      
         ```bash
         terraform validate
         ```
      
         Если в файлах конфигурации есть ошибки, Terraform на них укажет.

  1. Подтвердите изменение ресурсов.

      1. Выполните команду для просмотра планируемых изменений:
      
         ```bash
         terraform plan
         ```
      
         Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
      
      1. Если вас устраивают планируемые изменения, внесите их:
         1. Выполните команду:
      
            ```bash
            terraform apply
            ```
      
         1. Подтвердите изменение ресурсов.
         1. Дождитесь завершения операции.

  Подробнее о параметрах ресурса `yandex_mdb_mysql_user` смотрите в [документации провайдера](../../terraform/resources/mdb_mysql_user.md).

- REST API {#api}

  1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

      ```bash
      export IAM_TOKEN="<IAM-токен>"
      ```

  1. Воспользуйтесь методом [User.update](../api-ref/User/update.md) и выполните запрос, например, с помощью [cURL](https://curl.se/):

      {% note warning %}
      
      Метод API переопределит все параметры изменяемого объекта, которые не были явно переданы в запросе, на значения по умолчанию. Чтобы избежать этого, перечислите настройки, которые вы хотите изменить, в параметре `updateMask` (одной строкой через запятую).
      
      {% endnote %}

      ```bash
      curl \
          --request PATCH \
          --header "Authorization: Bearer $IAM_TOKEN" \
          --header "Content-Type: application/json" \
          --url 'https://mdb.api.yandexcloud.kz/managed-mysql/v1/clusters/<идентификатор_кластера>/users/<имя_пользователя>' \
          --data '{
                    "updateMask": "permissions",
                    "permissions": [
                      {
                        "databaseName": "<имя_БД>",
                        "roles": [
                          "<привилегия_1>", "<привилегия_2>", ..., "<привилегия_N>"
                        ]
                      }
                    ]
                  }'
      ```

      Где:

      * `updateMask` — перечень изменяемых параметров в одну строку через запятую.

          В данном случае передается только один параметр.

      * `permissions` — настройки разрешений пользователя:

          * `databaseName` — имя базы данных, к которой пользователь получает доступ.
          * `roles` — массив привилегий пользователя. Каждая привилегия представлена в виде отдельной строки в массиве. Список доступных значений приведен в разделе [Привилегии пользователей в кластере](../concepts/user-rights.md#db-privileges).

          Для каждой базы данных добавьте отдельный элемент с настройками разрешений в массив `permissions`.

      Идентификатор кластера можно запросить со [списком кластеров в каталоге](cluster-list.md#list-clusters), а имя пользователя — со [списком пользователей в кластере](#list-users).

  1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/User/update.md#yandex.cloud.operation.Operation).

- gRPC API {#grpc-api}

  1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

      ```bash
      export IAM_TOKEN="<IAM-токен>"
      ```

  1. Клонируйте репозиторий [cloudapi](https://github.com/yandex-cloud/cloudapi):
     
     ```bash
     cd ~/ && git clone --depth=1 https://github.com/yandex-cloud/cloudapi
     ```
     
     Далее предполагается, что содержимое репозитория находится в директории `~/cloudapi/`.
  1. Воспользуйтесь вызовом [UserService/Update](../api-ref/grpc/User/update.md) и выполните запрос, например, с помощью [gRPCurl](https://github.com/fullstorydev/grpcurl):

      {% note warning %}
      
      Метод API переопределит все параметры изменяемого объекта, которые не были явно переданы в запросе, на значения по умолчанию. Чтобы избежать этого, перечислите настройки, которые вы хотите изменить, в параметре `update_mask` (в виде массива строк `paths[]`).
      
      {% cut "Формат перечисления настроек" %}
      
      ```yaml
      "update_mask": {
          "paths": [
              "<настройка_1>",
              "<настройка_2>",
              ...
              "<настройка_N>"
          ]
      }
      ```
      
      {% endcut %}
      
      {% endnote %}

      ```bash
      grpcurl \
          -format json \
          -import-path ~/cloudapi/ \
          -import-path ~/cloudapi/third_party/googleapis/ \
          -proto ~/cloudapi/yandex/cloud/mdb/mysql/v1/user_service.proto \
          -rpc-header "Authorization: Bearer $IAM_TOKEN" \
          -d '{
                "cluster_id": "<идентификатор_кластера>",
                "user_name": "<имя_пользователя>",
                "update_mask": {
                  "paths": [
                    "permissions"
                  ]
                },
                "permissions": [
                  {
                    "database_name": "<имя_БД>",
                    "roles": [
                      "<привилегия_1>", "<привилегия_2>", ..., "<привилегия_N>"
                    ]
                  }
                ]
              }' \
          mdb.api.yandexcloud.kz:443 \
          yandex.cloud.mdb.mysql.v1.UserService.Update
      ```

      Где:

      * `update_mask` — перечень изменяемых параметров в виде массива строк `paths[]`.

          В данном случае передается только один параметр.

      * `permissions` — настройки разрешений пользователя:

          * `database_name` — имя базы данных, к которой пользователь получает доступ.
          * `roles` — массив привилегий пользователя. Каждая привилегия представлена в виде отдельной строки в массиве. Список доступных значений приведен в разделе [Привилегии пользователей в кластере](../concepts/user-rights.md#db-privileges).

          Для каждой базы данных добавьте отдельный элемент с настройками разрешений в массив `permissions`.

      Идентификатор кластера можно запросить со [списком кластеров в каталоге](cluster-list.md#list-clusters), а имя пользователя — со [списком пользователей в кластере](#list-users).

  1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/grpc/User/create.md#yandex.cloud.operation.Operation).

{% endlist %}

## Примеры {#examples}

### Создать пользователя с правами только на чтение {#user-read-only}

Чтобы в существующем кластере `cluster1` создать нового пользователя `user2` с паролем `SecretPassword` и доступом к базе данных `db1` только для чтения:

{% list tabs group=instructions %}

- Консоль управления {#console}

  [Создайте пользователя](cluster-users.md#adduser) с именем `user2`. При создании пользователя:

  1. Добавьте базу `db1` в список баз данных.
  1. Добавьте роль `SELECT` для базы `db1`.

- CLI {#cli}

  1. Создайте пользователя `user2`:

      ```bash
      yc managed-mysql user create "user2" \
        --cluster-name "cluster1" \
        --password "SecretPassword"
      ```

  1. Добавьте роль `SELECT` для базы `db1`:

      ```bash
      yc managed-mysql users grant-permission "user2" \
        --cluster-name "cluster1" \
        --database "db1" \
        --permissions "SELECT"
      ```

- Terraform {#tf}

  1. Откройте актуальный конфигурационный файл Terraform с планом инфраструктуры.

      Как создать такой файл, описано в разделе [Создание кластера MySQL®](cluster-create.md).

  1. Добавьте ресурс `yandex_mdb_mysql_user`:

      ```hcl
      resource "yandex_mdb_mysql_user" "user2" {
        cluster_id = yandex_mdb_mysql_cluster.cluster1.id
        name       = "user2"
        password   = "SecretPassword"
        permission {
          database_name = "db1"
          roles         = ["SELECT"]
        ...
        }
      }
      ```

  1. Проверьте корректность настроек.

      1. В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
      1. Выполните команду:
      
         ```bash
         terraform validate
         ```
      
         Если в файлах конфигурации есть ошибки, Terraform на них укажет.

  1. Подтвердите изменение ресурсов.

      1. Выполните команду для просмотра планируемых изменений:
      
         ```bash
         terraform plan
         ```
      
         Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
      
      1. Если вас устраивают планируемые изменения, внесите их:
         1. Выполните команду:
      
            ```bash
            terraform apply
            ```
      
         1. Подтвердите изменение ресурсов.
         1. Дождитесь завершения операции.

  Подробнее в [документации провайдера Terraform](../../terraform/resources/mdb_mysql_user.md).

{% endlist %}