[Документация Yandex Cloud](../../index.md) > [Yandex Managed Service for Trino](../index.md) > [Пошаговые инструкции](index.md) > Правила доступа к объектам > Назначение правил для функций

# Назначение правил доступа к функциям в Managed Service for Trino

Правила доступа к функциям определяют, какие действия пользователи могут совершать над пользовательскими функциями в кластере Managed Service for Trino.

{% note info %}

Нельзя ограничить выполнение функций, размещённых в виртуальной схеме `system.builtin` (встроенных функций Trino).

{% endnote %}

Для каждой пары пользователь-функция правила применяются следующим образом:
* Правила проверяются в порядке их объявления. Применяется первое найденное правило, которое соответствует паре пользователь-функция.
* Если ни одно из заданных правил не соответствует паре пользователь-функция, пользователю запрещаются любые действия над функцией.
* Если не задано ни одно правило доступа к функциям, каждый пользователь может выполнять только встроенные функции.
* Правила доступа к функциям применяются совместно с общими [правилами доступа к объектам каталогов](access-control-catalogs.md).

## Назначить правила при создании кластера {#set-at-create}

Правила доступа к функциям можно назначить одновременно с созданием кластера Managed Service for Trino.

{% note warning %}
  
Указанные в правилах имена функций и схем не проверяются на валидность. Ошибка в имени функции или схемы приведет к некорректной работе правила.
  
{% endnote %}

{% list tabs group=instructions %}

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

  1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог, в котором нужно создать кластер Managed Service for Trino.
  1. Перейдите в сервис **Managed Service for&nbsp;Trino**.
  1. Нажмите кнопку **Создать кластер** и задайте параметры кластера.
  1. В блоке **Настройки доступа** нажмите на значок ![image](../../_assets/console-icons/chevron-down.svg).
  1. В поле **Функции** нажмите кнопку **Добавить правило**.
  1. В открывшемся окне задайте параметры правила:

     1. (Опционально) В поле **Комментарий** введите описание правила.

     1. (Опционально) В поле **Пользователи** выберите пользователей, на которых распространяется правило:
        1. Нажмите кнопку **Добавить**.
        1. В открывшемся списке выберите нужных пользователей. Чтобы найти пользователя, используйте строку поиска над списком.
        1. Чтобы удалить пользователя, выбранного по ошибке, повторно нажмите на него в списке.
        
        Если не выбран ни один пользователь, правило распространяется на всех пользователей.

     1. (Опционально) В поле **Группы** выберите группы пользователей, на которые распространяется правило:
        1. Нажмите кнопку **Добавить**.
        1. В открывшемся списке выберите нужные группы. Чтобы найти группу, используйте строку поиска над списком.
        1. Чтобы удалить группу, выбранную по ошибке, повторно нажмите на нее в списке.
        
        Если не выбрана ни одна группа, правило распространяется на все группы пользователей.

     1. (Опционально) В поле **Привилегии** выберите разрешенные действия над функциями:
        * `EXECUTE` — вызов функции.
        * `GRANT_EXECUTE` — вызов функции для создания `VIEW`.
        * `OWNERSHIP` — создание и удаление функции.

        Если не выбрано ни одно действие, правило запрещает выполнение любых действий над функциями.

        {% note info %}

        Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.

        {% endnote %}

     1. (Опционально) Задайте полные имена функций, к которым будет применяться правило, в формате `<имя_каталога>.<имя_схемы>.<имя_функции>`. Каждая часть имени задается с помощью отдельного поля.

        1. Выберите, в каком формате указать каталоги:
           * **Имя** — выберите имена каталогов. Можно выбрать только каталоги, добавленные в блоке **Каталоги**.
           * **Имя (регулярное выражение)** — введите регулярное выражение для имен каталогов.
           * **Не задано** — в поле `<имя_каталога>` может быть любое значение.

        1. Выберите, в каком формате указать схемы:
           * **Имя** — выберите имена схем.
           * **Имя (регулярное выражение)** — введите регулярное выражение для имен схем.
           * **Не задано** — в поле `<имя_схемы>` может быть любое значение.

        1. Выберите, в каком формате указать функции:
           * **Имя** — выберите имена функций.
           * **Имя (регулярное выражение)** — введите регулярное выражение для имен функций.
           * **Не задано** — в поле `<имя_функции>` может быть любое значение.

  1. При необходимости добавьте другие правила аналогичным образом.
  1. Чтобы удалить правило, добавленное по ошибке, в строке этого правила нажмите на значок ![trash-bin](../../_assets/console-icons/trash-bin.svg).
  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`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

  Чтобы задать правила доступа к функциям:

  1. Создайте файл `access_control.yaml` и добавьте в него следующее содержимое:

     ```yaml
     functions:
       # Правило 1
       - privileges: [<список_разрешений>]
         catalog:
           name_regexp: <регулярное_выражение>
         schema:
           names:
             any: [<список_имен_схем>]
           name_regexp: <регулярное_выражение>
         function:
           names:
             any: [<список_имен_функций>]
           name_regexp: <регулярное_выражение>
         groups: [<список_идентификаторов_групп>]
         users: [<список_идентификаторов_пользователей>]
         description: <описание_правила>
       # Правило 2
       - <Параметры_правила_2>
       ...
       # Правило N
       - <Параметры_правила_N>
     ```

     Где:

     * `functions` — список правил для функций. Все параметры правила являются опциональными: `privileges`, `catalog`, `schema`, `function`, `groups`, `users` и `description`.

     * `privileges` — список разрешенных действий над функциями:
       * `EXECUTE` — вызов функции.
       * `GRANT_EXECUTE` — вызов функции для создания `VIEW`.
       * `OWNERSHIP` — создание и удаление функции.

       ## Function-ownership {#function-ownership}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над функциями.
       
       {% note info %}
       
       Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.
       
       {% endnote %}
       
       ## Procedures-privileges {#procedures-privileges}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над процедурами.
       
       ## Queries-privileges {#queries-privileges}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
       
       {% note warning %}
       
       Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `query_owners`.
       
       {% endnote %}
       
       ## Queries-privileges-REST {#queries-privileges-rest}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
       
       {% note warning %}
       
       Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `queryOwners`.
       
       {% endnote %}
       
       ## Tables-privileges {#table-ownership}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над таблицами.
       
       {% note info %}
       
       Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.
       
       {% endnote %}

     * `catalog`, `schema` и `function` — совместно определяют функции, к которым будет применяться правило. Каждый из параметров является опциональным.

       * `catalog` — каталоги, задаваемые с помощью параметра `name_regexp` (регулярное выражение для имен каталогов).

         Если блок `catalog` не указан, это равносильно регулярному выражению `.*`.

       * `schema` — схемы, задаваемые одним из параметров:
         * `names` — список имен схем.
         * `name_regexp` — регулярное выражение для имен схем.

         Если блок `schema` не указан, это равносильно регулярному выражению `.*`.

       * `function` — функции, задаваемые одним из параметров:
         * `names` — список имен функций.
         * `name_regexp` — регулярное выражение для имен функций.

         Если блок `function` не указан, это равносильно регулярному выражению `.*`.

       {% note info %}

       В Managed Service for Trino полное имя функции формируется по шаблону `<имя_каталога>.<имя_схемы>.<имя_функции>`. Правило применяется к функции, только если ее полное имя соответствует всем заданным параметрам.

       {% endnote %}

     * Параметры `users` и `groups` определяют пользователей, к которым применяется правило:
     
       * `users` — список идентификаторов пользователей. Правило применяется только к перечисленным пользователям.
     
       * `groups` — список идентификаторов групп. Правило применяется только к пользователям, которые входят хотя бы в одну из перечисленных групп.
     
       Вы можете указать один из параметров или оба. Если указаны оба параметра, правило применяется к каждому пользователю из параметра `users`, входящему хотя бы в одну группу из параметра `groups`. Если оба параметра не указаны, правило применяется ко всем пользователям.
     
     * `description` — описание правила.

  1. Посмотрите описание команды CLI для создания кластера:

     ```bash
     yc managed-trino cluster create --help
     ```

  1. Выполните команду:

     ```bash
     yc managed-trino cluster create \
       ...
       --access-control-from-file access_control.yaml
     ```

     Доступные параметры кластера и их описания представлены в [инструкции](cluster-create.md#create-cluster).

- Terraform {#tf}

  1. Создайте конфигурационный файл Terraform с [планом инфраструктуры](cluster-create.md).
  
  1. Добавьте в конфигурационный файл ресурс `yandex_trino_access_control`, содержащий список правил `functions`.
 
     ```hcl
     resource "yandex_trino_cluster" "<имя_кластера>" {
       ...
     }

     resource "yandex_trino_catalog" "<имя_каталога_1>" {
       ...
     }

     resource "yandex_trino_catalog" "<имя_каталога_2>" {
       ...
     }

     ...

     resource "yandex_trino_catalog" "<имя_каталога_N>" {
       ...
     }

     resource "yandex_trino_access_control" "trino_access_control" {
       ...
       cluster_id  = yandex_trino_cluster.<имя_кластера>.id
       functions = [
         # Правило 1
         {
           privileges    = ["<список_разрешений>"]
           catalog       = {
             ids         = [
               yandex_trino_catalog.<имя_каталога_1>.id,
               yandex_trino_catalog.<имя_каталога_2>.id,
               ... 
               yandex_trino_catalog.<имя_каталога_N>.id
             ]
             name_regexp = "<регулярное_выражение>"
           }
           schema        = {
             names       = ["<список_имен_схем>"]
             name_regexp = "<регулярное_выражение>"
           }
           function      = {
             names       = ["<список_имен_функций>"]
             name_regexp = "<регулярное_выражение>"
           }
           users         = ["<список_идентификаторов_пользователей>"]
           groups        = ["<список_идентификаторов_групп>"]
           description   = "<описание_правила>"
         },
         # Правило 2
         {
           ... 
         },
         ...
         # Правило N
         {
           ... 
         }
       ]
       ...
     }
     ```

     Где:

     * `functions` — список блоков правил для функций. Все параметры правила являются опциональными: `privileges`, `catalog`, `schema`, `function`, `groups`, `users` и `description`.

     * `privileges` — список разрешенных действий над функциями:
       * `EXECUTE` — вызов функции.
       * `GRANT_EXECUTE` — вызов функции для создания `VIEW`.
       * `OWNERSHIP` — создание и удаление функции.

       ## Function-ownership {#function-ownership}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над функциями.
       
       {% note info %}
       
       Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.
       
       {% endnote %}
       
       ## Procedures-privileges {#procedures-privileges}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над процедурами.
       
       ## Queries-privileges {#queries-privileges}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
       
       {% note warning %}
       
       Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `query_owners`.
       
       {% endnote %}
       
       ## Queries-privileges-REST {#queries-privileges-rest}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
       
       {% note warning %}
       
       Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `queryOwners`.
       
       {% endnote %}
       
       ## Tables-privileges {#table-ownership}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над таблицами.
       
       {% note info %}
       
       Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.
       
       {% endnote %}

     * `catalog`, `schema` и `function` — совместно определяют функции, к которым будет применяться правило. Каждый из параметров является опциональным.

       * `catalog` — каталоги, задаваемые одним из параметров:
         * `ids` — список идентификаторов каталогов. Указанные каталоги должны создаваться в том же манифесте.
         * `name_regexp` — регулярное выражение для имен каталогов.

         Если блок `catalog` не указан, это равносильно регулярному выражению `.*`.

       * `schema` — схемы, задаваемые одним из параметров:
         * `names` — список имен схем.
         * `name_regexp` — регулярное выражение для имен схем.

         Если блок `schema` не указан, это равносильно регулярному выражению `.*`.

       * `function` — функции, задаваемые одним из параметров:
         * `names` — список имен функций.
         * `name_regexp` — регулярное выражение для имен функций.

         Если блок `function` не указан, это равносильно регулярному выражению `.*`.

       {% note info %}

       В Managed Service for Trino полное имя функции формируется по шаблону `<имя_каталога>.<имя_схемы>.<имя_функции>`. Правило применяется к функции, только если ее полное имя соответствует всем заданным параметрам.

       {% endnote %}

     * Параметры `users` и `groups` определяют пользователей, к которым применяется правило:
     
       * `users` — список идентификаторов пользователей. Правило применяется только к перечисленным пользователям.
     
       * `groups` — список идентификаторов групп. Правило применяется только к пользователям, которые входят хотя бы в одну из перечисленных групп.
     
       Вы можете указать один из параметров или оба. Если указаны оба параметра, правило применяется к каждому пользователю из параметра `users`, входящему хотя бы в одну группу из параметра `groups`. Если оба параметра не указаны, правило применяется ко всем пользователям.
     
     * `description` — описание правила.

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

- REST API {#api}

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

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

  1. Создайте файл `body.json` и добавьте в него следующее содержимое:

      ```json
      {
        <Параметры_кластера>
        ...
        "trino": {
          "catalogs": [
            {
              "name": "имя_каталога_1",
              ...
            },
            {
              "name": "имя_каталога_2",
              ...
            },
            ...
            {
              "name": "имя_каталога_N",
              ...
            }
          ]
          ...
          "accessControl": {
            "functions": [
              {
                "privileges": [
                  "<список_разрешений>"
                ],
                "catalog": {
                  "names": {
                    "any": [
                      "<имя_каталога_1>",
                      "<имя_каталога_2>",
                      ...
                      "<имя_каталога_N>"
                    ]
                  },
                  "nameRegexp": "<регулярное_выражение>"
                },
                "schema": {
                  "names": {
                    "any": [
                      "<список_имен_схем>"
                    ]
                  },
                  "nameRegexp": "<регулярное_выражение>"
                },
                "function": {
                  "names": {
                    "any": [
                      "<список_имен_функций>"
                    ]
                  },
                  "nameRegexp": "<регулярное_выражение>"
                },
                "users": [
                  "<список_идентификаторов_пользователей>"
                ],
                "groups": [
                  "<список_идентификаторов_групп>"
                ],
                "description": "<описание_правила>"
              },
              {
                <Блок_правила_2>
              },
              ...
              {
                <Блок_правила_N>
              }
            ]
          }
        }
      }
      ```

      Где:

      * `accessControl` — конфигурация прав доступа в рамках кластера.

      * `functions` — список блоков правил для функций. Все параметры правила являются опциональными: `privileges`, `catalog`, `schema`, `function`, `groups`, `users` и `description`.

      * `privileges` — список разрешенных действий над функциями:
        * `EXECUTE` — вызов функции.
        * `GRANT_EXECUTE` — вызов функции для создания `VIEW`.
        * `OWNERSHIP` — создание и удаление функции.

        ## Function-ownership {#function-ownership}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над функциями.
        
        {% note info %}
        
        Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.
        
        {% endnote %}
        
        ## Procedures-privileges {#procedures-privileges}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над процедурами.
        
        ## Queries-privileges {#queries-privileges}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
        
        {% note warning %}
        
        Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `query_owners`.
        
        {% endnote %}
        
        ## Queries-privileges-REST {#queries-privileges-rest}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
        
        {% note warning %}
        
        Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `queryOwners`.
        
        {% endnote %}
        
        ## Tables-privileges {#table-ownership}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над таблицами.
        
        {% note info %}
        
        Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.
        
        {% endnote %}

      * `catalog`, `schema` и `function` — совместно определяют функции, к которым будет применяться правило. Каждый из параметров является опциональным.

        * `catalog` — каталоги, задаваемые одним из параметров:
          * `names` — список имен каталогов. Каталоги должны создаваться в этом же вызове [Cluster.Create](../api-ref/Cluster/create.md).
          * `nameRegexp` — регулярное выражение для имен каталогов.

          Если блок `catalog` не указан, это равносильно регулярному выражению `.*`.

        * `schema` — схемы, задаваемые одним из параметров:
          * `names` — список имен схем.
          * `nameRegexp` — регулярное выражение для имен схем.

          Если блок `schema` не указан, это равносильно регулярному выражению `.*`.

        * `function` — функции, задаваемые одним из параметров:
          * `names` — список имен функций.
          * `nameRegexp` — регулярное выражение для имен функций.

          Если блок `function` не указан, это равносильно регулярному выражению `.*`.

        {% note info %}

        В Managed Service for Trino полное имя функции формируется по шаблону `<имя_каталога>.<имя_схемы>.<имя_функции>`. Правило применяется к функции, только если ее полное имя соответствует всем заданным параметрам.

        {% endnote %}

      * Параметры `users` и `groups` определяют пользователей, к которым применяется правило:
      
        * `users` — список идентификаторов пользователей. Правило применяется только к перечисленным пользователям.
      
        * `groups` — список идентификаторов групп. Правило применяется только к пользователям, которые входят хотя бы в одну из перечисленных групп.
      
        Вы можете указать один из параметров или оба. Если указаны оба параметра, правило применяется к каждому пользователю из параметра `users`, входящему хотя бы в одну группу из параметра `groups`. Если оба параметра не указаны, правило применяется ко всем пользователям.
      
      * `description` — описание правила.

      Доступные параметры кластера и их описания представлены в [инструкции](cluster-create.md#create-cluster).

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

      ```bash
      curl \
          --request POST \
          --header "Authorization: Bearer $IAM_TOKEN" \
          --url 'https://trino.api.cloud.yandex.net/managed-trino/v1/clusters'
          --data '@body.json'
      ```

  1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/create.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. Создайте файл `body.json` и добавьте в него следующее содержимое:

      ```json
      {
        <Параметры_кластера>
        ...
        "trino": {
          "catalogs": [
            {
              "name": "имя_каталога_1",
              ...
            },
            {
              "name": "имя_каталога_2",
              ...
            },
            ...
            {
              "name": "имя_каталога_N",
              ...
            }
          ]
          ...
          "access_control": {
            "functions": [
              {
                "privileges": [
                  "<список_разрешений>"
                ],
                "catalog": {
                  "names": {
                    "any": [
                      "<имя_каталога_1>",
                      "<имя_каталога_2>",
                      ...
                      "<имя_каталога_N>"
                    ]
                  },
                  "name_regexp": "<регулярное_выражение>"
                },
                "schema": {
                  "names": {
                    "any": [
                      "<список_имен_схем>"
                    ]
                  },
                  "name_regexp": "<регулярное_выражение>"
                },
                "function": {
                  "names": {
                    "any": [
                      "<список_имен_функций>"
                    ]
                  },
                  "name_regexp": "<регулярное_выражение>"
                },
                "users": [
                  "<список_идентификаторов_пользователей>"
                ],
                "groups": [
                  "<список_идентификаторов_групп>"
                ],
                "description": "<описание_правила>"
              },
              {
                <Блок_правила_2>
              },
              ...
              {
                <Блок_правила_N>
              }
            ]
          }
        }
      }
      ```

      Где:

      * `access_control` — конфигурация прав доступа в рамках кластера.

      * `functions` — список блоков правил для функций. Все параметры правила являются опциональными: `privileges`, `catalog`, `schema`, `function`, `groups`, `users` и `description`.

      * `privileges` — список разрешенных действий над функциями:
        * `EXECUTE` — вызов функции.
        * `GRANT_EXECUTE` — вызов функции для создания `VIEW`.
        * `OWNERSHIP` — создание и удаление функции.

        ## Function-ownership {#function-ownership}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над функциями.
        
        {% note info %}
        
        Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.
        
        {% endnote %}
        
        ## Procedures-privileges {#procedures-privileges}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над процедурами.
        
        ## Queries-privileges {#queries-privileges}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
        
        {% note warning %}
        
        Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `query_owners`.
        
        {% endnote %}
        
        ## Queries-privileges-REST {#queries-privileges-rest}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
        
        {% note warning %}
        
        Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `queryOwners`.
        
        {% endnote %}
        
        ## Tables-privileges {#table-ownership}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над таблицами.
        
        {% note info %}
        
        Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.
        
        {% endnote %}

      * `catalog`, `schema` и `function` — совместно определяют функции, к которым будет применяться правило. Каждый из параметров является опциональным.

        * `catalog` — каталоги, задаваемые одним из параметров:
          * `names` — список имен каталогов. Каталоги должны создаваться в этом же вызове [ClusterService/Create](../api-ref/grpc/Cluster/create.md).
          * `name_regexp` — регулярное выражение для имен каталогов.

          Если блок `catalog` не указан, это равносильно регулярному выражению `.*`.

        * `schema` — схемы, задаваемые одним из параметров:
          * `names` — список имен схем.
          * `name_regexp` — регулярное выражение для имен схем.

          Если блок `schema` не указан, это равносильно регулярному выражению `.*`.

        * `function` — функции, задаваемые одним из параметров:
          * `names` — список имен функций.
          * `name_regexp` — регулярное выражение для имен функций.

          Если блок `function` не указан, это равносильно регулярному выражению `.*`.

        {% note info %}

        В Managed Service for Trino полное имя функции формируется по шаблону `<имя_каталога>.<имя_схемы>.<имя_функции>`. Правило применяется к функции, только если ее полное имя соответствует всем заданным параметрам.

        {% endnote %}

      * Параметры `users` и `groups` определяют пользователей, к которым применяется правило:
      
        * `users` — список идентификаторов пользователей. Правило применяется только к перечисленным пользователям.
      
        * `groups` — список идентификаторов групп. Правило применяется только к пользователям, которые входят хотя бы в одну из перечисленных групп.
      
        Вы можете указать один из параметров или оба. Если указаны оба параметра, правило применяется к каждому пользователю из параметра `users`, входящему хотя бы в одну группу из параметра `groups`. Если оба параметра не указаны, правило применяется ко всем пользователям.
      
      * `description` — описание правила.

      Доступные параметры кластера и их описания представлены в [инструкции](cluster-create.md#create-cluster).

  1. Воспользуйтесь вызовом [ClusterService/Create](../api-ref/grpc/Cluster/create.md) и выполните запрос, например с помощью [gRPCurl](https://github.com/fullstorydev/grpcurl):

      ```bash
      grpcurl \
          -format json \
          -import-path ~/cloudapi/ \
          -import-path ~/cloudapi/third_party/googleapis/ \
          -proto ~/cloudapi/yandex/cloud/trino/v1/cluster_service.proto \
          -rpc-header "Authorization: Bearer $IAM_TOKEN" \
          -d @ \
          trino.api.cloud.yandex.net:443 \
          yandex.cloud.trino.v1.ClusterService.Create \
          < body.json
      ```

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

{% endlist %}

## Назначить правила для существующего кластера {#set-at-update}

Правила доступа к функциям можно назначить или обновить в уже существующем кластере Managed Service for Trino.

{% note warning %}
  
Указанные в правилах имена функций и схем не проверяются на валидность. Ошибка в имени функции или схемы приведет к некорректной работе правила.
  
{% endnote %}

{% list tabs group=instructions %}

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

  1. В [консоли управления](https://kz.console.yandex.cloud) перейдите в нужный каталог.
  1. Перейдите в сервис **Managed Service for&nbsp;Trino**.
  1. Нажмите на имя нужного кластера.
  1. Перейдите в блок **Настройки доступа** → **Функции**.
  1. Чтобы добавить правило, нажмите кнопку **Добавить правило** и в открывшемся окне задайте параметры правила:

     1. (Опционально) В поле **Комментарий** введите описание правила.

     1. (Опционально) В поле **Пользователи** выберите пользователей, на которых распространяется правило:
        1. Нажмите кнопку **Добавить**.
        1. В открывшемся списке выберите нужных пользователей. Чтобы найти пользователя, используйте строку поиска над списком.
        1. Чтобы удалить пользователя, выбранного по ошибке, повторно нажмите на него в списке.
        
        Если не выбран ни один пользователь, правило распространяется на всех пользователей.

     1. (Опционально) В поле **Группы** выберите группы пользователей, на которые распространяется правило:
        1. Нажмите кнопку **Добавить**.
        1. В открывшемся списке выберите нужные группы. Чтобы найти группу, используйте строку поиска над списком.
        1. Чтобы удалить группу, выбранную по ошибке, повторно нажмите на нее в списке.
        
        Если не выбрана ни одна группа, правило распространяется на все группы пользователей.

     1. (Опционально) В поле **Привилегии** выберите разрешенные действия над функциями:
        * `EXECUTE` — вызов функции.
        * `GRANT_EXECUTE` — вызов функции для создания `VIEW`.
        * `OWNERSHIP` — создание и удаление функции.

        Если не выбрано ни одно действие, правило запрещает выполнение любых действий над функциями.

        {% note info %}

        Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.

        {% endnote %}

     1. (Опционально) Задайте полные имена функций, к которым будет применяться правило, в формате `<имя_каталога>.<имя_схемы>.<имя_функции>`. Каждая часть имени задается с помощью отдельного поля.

        1. Выберите, в каком формате указать каталоги:
           * **ID** — выберите идентификаторы каталогов. Можно выбрать только те каталоги, которые есть в кластере.
           * **Имя** — выберите имена каталогов. Можно выбрать только те каталоги, которые есть в кластере.
           * **Имя (регулярное выражение)** — введите регулярное выражение для имен каталогов.
           * **Не задано** — в поле `<каталог>` может быть любое значение.

        1. Выберите, в каком формате указать схемы:
           * **Имя** — выберите имена схем.
           * **Имя (регулярное выражение)** — введите регулярное выражение для имен схем.
           * **Не задано** — в поле `<имя_схемы>` может быть любое значение.

        1. Выберите, в каком формате указать функции:
           * **Имя** — выберите имена функций.
           * **Имя (регулярное выражение)** — введите регулярное выражение для имен функций.
           * **Не задано** — в поле `<имя_функции>` может быть любое значение.

  1. При необходимости добавьте другие правила аналогичным образом.
  1. Чтобы отредактировать правило:
     1. В строке этого правила нажмите на значок ![trash-bin](../../_assets/console-icons/pencil.svg).
     1. Измените параметры правила и нажмите кнопку **Обновить**.
  1. Чтобы удалить ненужное правило, в строке этого правила нажмите на значок ![trash-bin](../../_assets/console-icons/trash-bin.svg).
  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`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

  Чтобы задать правила доступа к функциям:

  1. Если правила доступа еще не заданы, создайте файл `access_control.yaml` и добавьте в него следующее содержимое:

     ```yaml
     functions:
       # Правило 1
       - privileges: [<список_разрешений>]
         catalog:
           ids:
             any: [<список_идентификаторов_каталогов>]
           names:
             any: [<список_имен_каталогов>]
           name_regexp: <регулярное_выражение>
         schema:
           names:
             any: [<список_имен_схем>]
           name_regexp: <регулярное_выражение>
         function:
           names:
             any: [<список_имен_функций>]
           name_regexp: <регулярное_выражение>
         groups: [<список_идентификаторов_групп>]
         users: [<список_идентификаторов_пользователей>]
         description: <описание_правила>
       # Правило 2
       - <Параметры_правила_2>
       ...
       # Правило N
       - <Параметры_правила_N>
     ```

     Где:

     * `functions` — список правил для функций. Все параметры правила являются опциональными: `privileges`, `catalog`, `schema`, `function`, `groups`, `users` и `description`.

     * `privileges` — список разрешенных действий над функциями:
       * `EXECUTE` — вызов функции.
       * `GRANT_EXECUTE` — вызов функции для создания `VIEW`.
       * `OWNERSHIP` — создание и удаление функции.

       ## Function-ownership {#function-ownership}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над функциями.
       
       {% note info %}
       
       Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.
       
       {% endnote %}
       
       ## Procedures-privileges {#procedures-privileges}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над процедурами.
       
       ## Queries-privileges {#queries-privileges}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
       
       {% note warning %}
       
       Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `query_owners`.
       
       {% endnote %}
       
       ## Queries-privileges-REST {#queries-privileges-rest}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
       
       {% note warning %}
       
       Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `queryOwners`.
       
       {% endnote %}
       
       ## Tables-privileges {#table-ownership}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над таблицами.
       
       {% note info %}
       
       Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.
       
       {% endnote %}

     * `catalog`, `schema` и `function` — совместно определяют функции, к которым будет применяться правило. Каждый из параметров является опциональным.

       * `catalog` — каталоги, задаваемые одним из параметров:
         * `ids` — список идентификаторов каталогов. Указанные каталоги должны существовать.
         * `names` — список имен каталогов. Указанные каталоги должны существовать.
         * `name_regexp` — регулярное выражение для имен каталогов.

         Если блок `catalog` не указан, это равносильно регулярному выражению `.*`.

       * `schema` — схемы, задаваемые одним из параметров:
         * `names` — список имен схем.
         * `name_regexp` — регулярное выражение для имен схем.

         Если блок `schema` не указан, это равносильно регулярному выражению `.*`.

       * `function` — функции, задаваемые одним из параметров:
         * `names` — список имен функций.
         * `name_regexp` — регулярное выражение для имен функций.

         Если блок `function` не указан, это равносильно регулярному выражению `.*`.

       {% note info %}

       В Managed Service for Trino полное имя функции формируется по шаблону `<имя_каталога>.<имя_схемы>.<имя_функции>`. Правило применяется к функции, только если ее полное имя соответствует всем заданным параметрам.

       {% endnote %}

     * Параметры `users` и `groups` определяют пользователей, к которым применяется правило:
     
       * `users` — список идентификаторов пользователей. Правило применяется только к перечисленным пользователям.
     
       * `groups` — список идентификаторов групп. Правило применяется только к пользователям, которые входят хотя бы в одну из перечисленных групп.
     
       Вы можете указать один из параметров или оба. Если указаны оба параметра, правило применяется к каждому пользователю из параметра `users`, входящему хотя бы в одну группу из параметра `groups`. Если оба параметра не указаны, правило применяется ко всем пользователям.
     
     * `description` — описание правила.

  1. Если правила доступа уже заданы, откройте файл `access_control.yaml` и внесите в него изменения. Вы можете:

     * добавить новые правила;
     * изменить параметры существующих правил;
     * удалить ненужные правила.

  1. Выполните команду:

     ```bash
     yc managed-trino cluster set-access-control <имя_или_идентификатор_кластера> \
       --from-file access_control.yaml
     ```

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

- Terraform {#tf}

  1. Откройте актуальный конфигурационный файл Terraform с планом инфраструктуры.
  
      Инструкция по созданию файла описана в разделе [Создание кластера](cluster-create.md).
  
  1. Если правила доступа еще не заданы, добавьте ресурс `yandex_trino_access_control`, содержащий список правил `functions`.

     ```hcl
     resource "yandex_trino_cluster" "<имя_кластера>" {
       ...
     }

     resource "yandex_trino_catalog" "<имя_каталога_1>" {
       ...
     }

     resource "yandex_trino_catalog" "<имя_каталога_2>" {
       ...
     }

     ...

     resource "yandex_trino_catalog" "<имя_каталога_N>" {
       ...
     }

     resource "yandex_trino_access_control" "trino_access_control" {
       ...
       cluster_id  = yandex_trino_cluster.<имя_кластера>.id
       functions = [
         # Правило 1
         {
           privileges    = ["<список_разрешений>"]
           catalog       = {
             ids         = [
               yandex_trino_catalog.<имя_каталога_1>.id,
               yandex_trino_catalog.<имя_каталога_2>.id,
               ... 
               yandex_trino_catalog.<имя_каталога_N>.id
             ]
             name_regexp = "<регулярное_выражение>"
           }
           schema        = {
             names       = ["<список_имен_схем>"]
             name_regexp = "<регулярное_выражение>"
           }
           function     = {
             names       = ["<список_имен_функций>"]
             name_regexp = "<регулярное_выражение>"
           }
           users         = ["<список_идентификаторов_пользователей>"]
           groups        = ["<список_идентификаторов_групп>"]
           description   = "<описание_правила>"
         },
         # Правило 2
         {
           ... 
         },
         ...
         # Правило N
         {
           ... 
         }
       ]
       ...
     }
     ```

     Где:

     * `functions` — список блоков правил для функций. Все параметры правила являются опциональными: `privileges`, `catalog`, `schema`, `function`, `groups`, `users` и `description`.

     * `privileges` — список разрешенных действий над функциями:
       * `EXECUTE` — вызов функции.
       * `GRANT_EXECUTE` — вызов функции для создания `VIEW`.
       * `OWNERSHIP` — создание и удаление функции.

       ## Function-ownership {#function-ownership}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над функциями.
       
       {% note info %}
       
       Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.
       
       {% endnote %}
       
       ## Procedures-privileges {#procedures-privileges}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над процедурами.
       
       ## Queries-privileges {#queries-privileges}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
       
       {% note warning %}
       
       Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `query_owners`.
       
       {% endnote %}
       
       ## Queries-privileges-REST {#queries-privileges-rest}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
       
       {% note warning %}
       
       Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `queryOwners`.
       
       {% endnote %}
       
       ## Tables-privileges {#table-ownership}
       
       Если параметр `privileges` не указан, правило запрещает выполнение любых действий над таблицами.
       
       {% note info %}
       
       Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.
       
       {% endnote %}

     * `catalog`, `schema` и `function` — совместно определяют функции, к которым будет применяться правило. Каждый из параметров является опциональным.

       * `catalog` — каталоги, задаваемые одним из параметров:
         * `ids` — список идентификаторов каталогов. Указанные каталоги должны существовать или создаваться в том же манифесте.
         * `name_regexp` — регулярное выражение для имен каталогов.

         Если блок `catalog` не указан, это равносильно регулярному выражению `.*`.

       * `schema` — схемы, задаваемые одним из параметров:
         * `names` — список имен схем.
         * `name_regexp` — регулярное выражение для имен схем.

         Если блок `schema` не указан, это равносильно регулярному выражению `.*`.

       * `function` — функции, задаваемые одним из параметров:
         * `names` — список имен функций.
         * `name_regexp` — регулярное выражение для имен функций.

         Если блок `function` не указан, это равносильно регулярному выражению `.*`.

       {% note info %}

       В Managed Service for Trino полное имя функции формируется по шаблону `<имя_каталога>.<имя_схемы>.<имя_функции>`. Правило применяется к функции, только если ее полное имя соответствует всем заданным параметрам.

       {% endnote %}

     * Параметры `users` и `groups` определяют пользователей, к которым применяется правило:
     
       * `users` — список идентификаторов пользователей. Правило применяется только к перечисленным пользователям.
     
       * `groups` — список идентификаторов групп. Правило применяется только к пользователям, которые входят хотя бы в одну из перечисленных групп.
     
       Вы можете указать один из параметров или оба. Если указаны оба параметра, правило применяется к каждому пользователю из параметра `users`, входящему хотя бы в одну группу из параметра `groups`. Если оба параметра не указаны, правило применяется ко всем пользователям.
     
     * `description` — описание правила.

  1. Если правила доступа уже заданы, внесите правки в описание ресурса `yandex_trino_access_control`. Вы можете:

     * добавить новые правила;
     * изменить параметры существующих правил;
     * удалить ненужные правила.

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

- REST API {#api}

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

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

  1. Если правила доступа еще не заданы, создайте файл `body.json` и добавьте в него следующее содержимое:

      ```json
      {
        "updateMask": "trino.accessControl.functions",
        "trino": {
          "accessControl": {
            "functions": [
              {
                "privileges": [
                  "<список_разрешений>"
                ],
                "catalog": {
                  "ids": {
                    "any": [
                      "<список_идентификаторов_каталогов>"
                    ]
                  },
                  "names": {
                    "any": [
                      "<имя_каталога_1>",
                      "<имя_каталога_2>",
                      ...
                      "<имя_каталога_N>"
                    ]
                  },
                  "nameRegexp": "<регулярное_выражение>"
                },
                "schema": {
                  "names": {
                    "any": [
                      "<список_имен_схем>"
                    ]
                  },
                  "nameRegexp": "<регулярное_выражение>"
                },
                "function": {
                  "names": {
                    "any": [
                      "<список_имен_функций>"
                    ]
                  },
                  "nameRegexp": "<регулярное_выражение>"
                },
                "users": [
                  "<список_идентификаторов_пользователей>"
                ],
                "groups": [
                  "<список_идентификаторов_групп>"
                ],
                "description": "<описание_правила>"
              },
              {
                <Блок_правила_2>
              },
              ...
              {
                <Блок_правила_N>
              }
            ]
          }
        }
      }
      ```

      Где:

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

          {% note warning %}

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

          {% endnote %}

      * `accessControl` — конфигурация прав доступа в рамках кластера.

      * `functions` — список блоков правил для функций. Все параметры правила являются опциональными: `privileges`, `catalog`, `schema`, `function`, `groups`, `users` и `description`.

      * `privileges` — список разрешенных действий над функциями:
        * `EXECUTE` — вызов функции.
        * `GRANT_EXECUTE` — вызов функции для создания `VIEW`.
        * `OWNERSHIP` — создание и удаление функции.

        ## Function-ownership {#function-ownership}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над функциями.
        
        {% note info %}
        
        Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.
        
        {% endnote %}
        
        ## Procedures-privileges {#procedures-privileges}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над процедурами.
        
        ## Queries-privileges {#queries-privileges}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
        
        {% note warning %}
        
        Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `query_owners`.
        
        {% endnote %}
        
        ## Queries-privileges-REST {#queries-privileges-rest}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
        
        {% note warning %}
        
        Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `queryOwners`.
        
        {% endnote %}
        
        ## Tables-privileges {#table-ownership}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над таблицами.
        
        {% note info %}
        
        Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.
        
        {% endnote %}

      * `catalog`, `schema` и `function` — совместно определяют функции, к которым будет применяться правило. Каждый из параметров является опциональным.

        * `catalog` — каталоги, задаваемые одним из параметров:
          * `ids` — список идентификаторов каталогов. Указанные каталоги должны существовать.
          * `names` — список имен каталогов. Указанные каталоги должны существовать.
          * `nameRegexp` — регулярное выражение для имен каталогов.

          Если блок `catalog` не указан, это равносильно регулярному выражению `.*`.

        * `schema` — схемы, задаваемые одним из параметров:
          * `names` — список имен схем.
          * `nameRegexp` — регулярное выражение для имен схем.

          Если блок `schema` не указан, это равносильно регулярному выражению `.*`.

        * `function` — функции, задаваемые одним из параметров:
          * `names` — список имен функций.
          * `nameRegexp` — регулярное выражение для имен функций.

          Если блок `function` не указан, это равносильно регулярному выражению `.*`.

        {% note info %}

        В Managed Service for Trino полное имя функции формируется по шаблону `<имя_каталога>.<имя_схемы>.<имя_функции>`. Правило применяется к функции, только если ее полное имя соответствует всем заданным параметрам.

        {% endnote %}

      * Параметры `users` и `groups` определяют пользователей, к которым применяется правило:
      
        * `users` — список идентификаторов пользователей. Правило применяется только к перечисленным пользователям.
      
        * `groups` — список идентификаторов групп. Правило применяется только к пользователям, которые входят хотя бы в одну из перечисленных групп.
      
        Вы можете указать один из параметров или оба. Если указаны оба параметра, правило применяется к каждому пользователю из параметра `users`, входящему хотя бы в одну группу из параметра `groups`. Если оба параметра не указаны, правило применяется ко всем пользователям.
      
      * `description` — описание правила.

  1. Если правила уже заданы, откройте существующий файл `body.json` с правилами и внесите в него правки. Вы можете:

     * добавить новые правила;
     * изменить параметры существующих правил;
     * удалить ненужные правила.

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

      ```bash
      curl \
        --request PATCH \
        --header "Authorization: Bearer $IAM_TOKEN" \
        --url 'https://trino.api.cloud.yandex.net/managed-trino/v1/clusters/<идентификатор_кластера>'
        --data '@body.json'
      ```

      Идентификатор кластера можно получить со [списком кластеров](cluster-list.md#list-clusters) в каталоге.

  1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/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. Если правила доступа еще не заданы, создайте файл `body.json` и добавьте в него следующее содержимое:

      ```json
      {
        "cluster_id": "<идентификатор_кластера>",
        "update_mask": {
          "paths": [
            "trino.access_control.functions"
          ]
        },
        "trino": {
          "access_control": {
            "functions": [
              {
                "privileges": [
                  "<список_разрешений>"
                ],
                "catalog": {
                  "ids": {
                    "any": [
                      "<список_идентификаторов_каталогов>"
                    ]
                  },
                  "names": {
                    "any": [
                      "<имя_каталога_1>",
                      "<имя_каталога_2>",
                      ...
                      "<имя_каталога_N>"
                    ]
                  },
                  "name_regexp": "<регулярное_выражение>"
                },
                "schema": {
                  "names": {
                    "any": [
                      "<список_имен_схем>"
                    ]
                  },
                  "name_regexp": "<регулярное_выражение>"
                },
                "function": {
                  "names": {
                    "any": [
                      "<список_имен_функций>"
                    ]
                  },
                  "name_regexp": "<регулярное_выражение>"
                },
                "users": [
                  "<список_идентификаторов_пользователей>"
                ],
                "groups": [
                  "<список_идентификаторов_групп>"
                ],
                "description": "<описание_правила>"
              },
              {
                <Блок_правила_2>
              },
              ...
              {
                <Блок_правила_N>
              }
            ]
          }
        }
      }
      ```

      Где:

      * `cluster_id` — идентификатор кластера.
          
          Идентификатор кластера можно получить со [списком кластеров](cluster-list.md#list-clusters) в каталоге.

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

          {% cut "Формат перечисления настроек" %}

          ```yaml
          "update_mask": {
            "paths": [
              "<настройка_1>",
              "<настройка_2>",
              ...
              "<настройка_N>"
            ]
          }
          ```

          {% endcut %}

          {% note warning %}

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

          {% endnote %}

      * `access_control` — конфигурация прав доступа в рамках кластера.

      * `functions` — список блоков правил для функций. Все параметры правила являются опциональными: `privileges`, `catalog`, `schema`, `function`, `groups`, `users` и `description`.

      * `privileges` — список разрешенных действий над функциями:
        * `EXECUTE` — вызов функции.
        * `GRANT_EXECUTE` — вызов функции для создания `VIEW`.
        * `OWNERSHIP` — создание и удаление функции.

        ## Function-ownership {#function-ownership}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над функциями.
        
        {% note info %}
        
        Чтобы воспользоваться правом `OWNERSHIP` на функцию, требуется уровень доступа `ALL` к каталогу, в котором находится функция.
        
        {% endnote %}
        
        ## Procedures-privileges {#procedures-privileges}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над процедурами.
        
        ## Queries-privileges {#queries-privileges}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
        
        {% note warning %}
        
        Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `query_owners`.
        
        {% endnote %}
        
        ## Queries-privileges-REST {#queries-privileges-rest}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над запросами.
        
        {% note warning %}
        
        Нельзя указать разрешение `EXECUTE`, если в этом же правиле используется параметр `queryOwners`.
        
        {% endnote %}
        
        ## Tables-privileges {#table-ownership}
        
        Если параметр `privileges` не указан, правило запрещает выполнение любых действий над таблицами.
        
        {% note info %}
        
        Чтобы воспользоваться правом `OWNERSHIP` на таблицу, требуется уровень доступа `ALL` к каталогу, в котором находится таблица.
        
        {% endnote %}

      * `catalog`, `schema` и `function` — совместно определяют функции, к которым будет применяться правило. Каждый из параметров является опциональным.

        * `catalog` — каталоги, задаваемые одним из параметров:
          * `ids` — список идентификаторов каталогов. Указанные каталоги должны существовать.
          * `names` — список имен каталогов. Указанные каталоги должны существовать.
          * `name_regexp` — регулярное выражение для имен каталогов.

          Если блок `catalog` не указан, это равносильно регулярному выражению `.*`.

        * `schema` — схемы, задаваемые одним из параметров:
          * `names` — список имен схем.
          * `name_regexp` — регулярное выражение для имен схем.

          Если блок `schema` не указан, это равносильно регулярному выражению `.*`.

        * `function` — функции, задаваемые одним из параметров:
          * `names` — список имен функций.
          * `name_regexp` — регулярное выражение для имен функций.

          Если блок `function` не указан, это равносильно регулярному выражению `.*`.

        {% note info %}

        В Managed Service for Trino полное имя функции формируется по шаблону `<имя_каталога>.<имя_схемы>.<имя_функции>`. Правило применяется к функции, только если ее полное имя соответствует всем заданным параметрам.

        {% endnote %}

      * Параметры `users` и `groups` определяют пользователей, к которым применяется правило:
      
        * `users` — список идентификаторов пользователей. Правило применяется только к перечисленным пользователям.
      
        * `groups` — список идентификаторов групп. Правило применяется только к пользователям, которые входят хотя бы в одну из перечисленных групп.
      
        Вы можете указать один из параметров или оба. Если указаны оба параметра, правило применяется к каждому пользователю из параметра `users`, входящему хотя бы в одну группу из параметра `groups`. Если оба параметра не указаны, правило применяется ко всем пользователям.
      
      * `description` — описание правила.

  1. Если правила уже заданы, откройте существующий файл `body.json` с правилами и внесите в него правки. Вы можете:

     * добавить новые правила;
     * изменить параметры существующих правил;
     * удалить ненужные правила.

  1. Воспользуйтесь вызовом [ClusterService.Update](../api-ref/grpc/Cluster/update.md) и выполните запрос, например с помощью [gRPCurl](https://github.com/fullstorydev/grpcurl):

      ```bash
      grpcurl \
        -format json \
        -import-path ~/cloudapi/ \
        -import-path ~/cloudapi/third_party/googleapis/ \
        -proto ~/cloudapi/yandex/cloud/trino/v1/cluster_service.proto \
        -rpc-header "Authorization: Bearer $IAM_TOKEN" \
        -d @ \
        trino.api.cloud.yandex.net:443 \
        yandex.cloud.trino.v1.ClusterService.Update \
        < body.json
      ```

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

{% endlist %}

## Пример назначения правил доступа к функциям {#example}

Допустим, вам нужно настроить правила доступа к пользовательским функциям в кластере Trino:
1. Запретить любые действия над функциями пользователю с идентификатором `banned_user_id`.
1. Разрешить пользователям из группы с идентификатором `admins_group_id` создавать и удалять любые функции, а также вызывать их для создания `VIEW`.
1. Разрешить всем остальным пользователям вызывать функции с именами вида `.*_public`.

{% list tabs group=instructions %}

- CLI {#cli}

  Файл `access_control.yaml` для такого набора правил выглядит так:

  ```yaml
  functions:
    - users:
        - banned_user_id

    - groups:
        - admins_group_id
      privileges:
        - GRANT_EXECUTE
        - OWNERSHIP

    - function:
        name_regexp: ".*_public"
      privileges:
        - EXECUTE
  ```

- Terraform {#tf}

  Конфигурационный файл для такого набора правил выглядит так:

  ```hcl
  resource "yandex_trino_access_control" "trino_access_control" {
    ...
    cluster_id  = <идентификатор_кластера>
    functions = [
      {
        users         = ["banned_user_id"]
      },
      {
        groups        = ["admins_group_id"]
        privileges    = ["GRANT_EXECUTE", "OWNERSHIP"]
      },
      {
        function      = {
          name_regexp = ".*_public"
        }
        privileges    = ["EXECUTE"]
      }
    ]
    ...
  }
  ```

- REST API {#api}

  Файл `body.json` для такого набора правил выглядит так:

  ```json
  {
    "updateMask": "trino.accessControl.functions",
    "trino": {
      "accessControl": {
        "functions": [
          {
            "users": [
              "banned_user_id"
            ]
          },
          {
            "groups": [
              "admins_group_id"
            ],
            "privileges": [
              "GRANT_EXECUTE",
              "OWNERSHIP"
            ]
          },
          {
            "function": {
              "nameRegexp": ".*_public"
            },
            "privileges": [
              "EXECUTE"
            ]
          }
        ]
      }
    }
  }
  ```

- gRPC API {#grpc-api}

  Файл `body.json` для такого набора правил выглядит так:

  ```json
  {
    "cluster_id": "<идентификатор_кластера>",
    "update_mask": {
      "paths": [
        "trino.access_control.functions"
      ]
    },
    "trino": {
      "access_control": {
        "functions": [
          {
            "users": [
              "banned_user_id"
            ]
          },
          {
            "groups": [
              "admins_group_id"
            ],
            "privileges": [
              "GRANT_EXECUTE",
              "OWNERSHIP"
            ]
          },
          {
            "function": {
              "name_regexp": ".*_public"
            },
            "privileges": [
              "EXECUTE"
            ]
          }
        ]
      }
    }
  }
  ```

{% endlist %}