Managing procedure access in Managed Service for Trino
Procedure access rules define the actions users can perform with custom procedures in a Managed Service for Trino cluster.
Note
You cannot set restrictions on running procedures invoked via the system schema, i.e., Trino system procedures.
For each user-procedure pair, the rules apply as follows:
- Rules are checked for matches in the order they are specified in the configuration file. The first rule matching the user-procedure pair applies.
- If none of the rules match the user-procedure pair, no actions with the procedure are allowed to the user.
- If no procedure access rules are set, each user can run only system procedures.
- Procedure access rules apply together with the top-level rules for objects in catalogs.
Setting rules when creating a cluster
You can set procedure access rules when creating a Managed Service for Trino cluster.
Warning
Procedure and schema names specified in the rules are not validated. If a procedure name or a schema name contains an error, the rule will not apply correctly.
If you do not have the Yandex Cloud CLI installed yet, install and initialize it.
By default, the CLI uses the folder specified when creating the profile. To change the default folder, use the yc config set folder-id <folder_ID> command. You can also set a different folder for any specific command using the --folder-name or --folder-id parameter.
To set procedure access rules:
-
Create a file named
access_control.yamland paste the following code into it:procedures: # Rule 1 - privileges: [<list_of_privileges>] procedure: names: any: [<list_of_procedure_names>] name_regexp: <regular_expression> schema: names: any: [<list_of_schema_names>] name_regexp: <regular_expression> catalog: name_regexp: <regular_expression> groups: [<list_of_group_IDs>] users: [<list_of_user_IDs>] description: <rule_description> # Rule 2 - <Rule_2_parameters> ... # Rule N - <Rule_N_parameters>Where:
-
procedures: List of procedure rules. All the rule parameters are optional:privileges,procedure,schema,catalog,groups,users, anddescription. -
privileges: Permitted actions with procedures:EXECUTE: Allows calling the procedure.
If you do not specify the
privilegesparameter, the rule will prohibit any actions with the procedures. -
procedure: Procedures the rule applies to. If you do not specifyprocedure, the rule applies to all procedures.names: List of procedure names.name_regexp: Regular expression. The rule applies to the procedures whose names match the regular expression.
You can specify either
namesorname_regexpbut not both. -
schema: Schemas the rule applies to. If you do not specifyschema, the rule applies to all schemas.names: List of schema names.name_regexp: Regular expression. The rule applies to the schemas whose names match the regular expression.
You can specify either
namesorname_regexpbut not both. -
catalog: Cluster catalogs the rule applies to. If you do not specifycatalog, the rule applies to all cluster catalogs.name_regexp: Regular expression. The rule applies to the catalogs whose names match the regular expression.
-
groups: List of group IDs the rule applies to. If you do not specifygroups, the rule applies to all user groups. -
users: List of user IDs the rule applies to. If you do not specifyusers, the rule applies to all users. -
description: Rule description.
-
-
View the description of the CLI command for creating a cluster:
yc managed-trino cluster create --help -
Run this command:
yc managed-trino cluster create \ ... --access-control-from-file access_control.yamlFor available cluster parameters and their descriptions, see this guide.
-
Create a Terraform configuration file describing your infrastructure.
-
Add the
yandex_trino_access_controlresource with theproceduresrule list to the configuration file.resource "yandex_trino_cluster" "<cluster_name>" { ... } resource "yandex_trino_catalog" "<catalog_1_name>" { ... } resource "yandex_trino_catalog" "<catalog_2_name>" { ... } ... resource "yandex_trino_catalog" "<catalog_N_name>" { ... } resource "yandex_trino_access_control" "trino_access_control" { ... cluster_id = yandex_trino_cluster.<cluster_name>.id procedures = [ # Rule 1 { privileges = ["<list_of_privileges>"] procedure = { names = ["<list_of_procedure_names>"] name_regexp = "<regular_expression>" } schema = { names = ["<list_of_schema_names>"] name_regexp = "<regular_expression>" } catalog = { ids = [ yandex_trino_catalog.<catalog_1_name>.id, yandex_trino_catalog.<catalog_2_name>.id, ... yandex_trino_catalog.<catalog_N_name>.id ] name_regexp = "<regular_expression>" } users = ["<list_of_user_IDs>"] groups = ["<list_of_group_IDs>"] description = "<rule_description>" }, # Rule 2 { ... }, ... # Rule N { ... } ] ... }Where:
-
procedures: List of rule sections for procedures. All the rule parameters are optional:privileges,procedure,schema,catalog,groups,users, anddescription. -
privileges: Permitted actions with procedures:EXECUTE: Allows calling the procedure.
If you do not specify the
privilegesparameter, the rule will prohibit any actions with the procedures. -
procedure: Procedures the rule applies to. If theproceduresection is not specified, the rule applies to all procedures.names: List of procedure names.name_regexp: Regular expression. The rule applies to the procedures whose names match the regular expression.
You can specify either
namesorname_regexpbut not both. -
schema: Schemas the rule applies to. If theschemasection is not specified, the rule applies to all schemas.names: List of schema names.name_regexp: Regular expression. The rule applies to the schemas whose names match the regular expression.
You can specify either
namesorname_regexpbut not both. -
catalog: Cluster catalogs the rule applies to. If thecatalogsection is not specified, the rule applies to all cluster catalogs.ids: List of catalog IDs. These catalogs must be created in the same manifest.name_regexp: Regular expression. The rule applies to the catalogs whose names match the regular expression.
You can specify either
idsorname_regexpbut not both.
-
groups: List of group IDs the rule applies to. If you do not specifygroups, the rule applies to all user groups. -
users: List of user IDs the rule applies to. If you do not specifyusers, the rule applies to all users. -
description: Rule description.
-
-
Make sure the settings are correct.
-
In the command line, navigate to the directory that contains the current Terraform configuration files defining the infrastructure.
-
Run this command:
terraform validateTerraform will show any errors found in your configuration files.
-
-
Confirm updating the resources.
-
Run this command to view the planned changes:
terraform planIf you described the configuration correctly, the terminal will display a list of the resources to update and their parameters. This is a verification step that does not apply changes to your resources.
-
If everything looks correct, apply the changes:
-
Run this command:
terraform apply -
Confirm updating the resources.
-
Wait for the operation to complete.
-
-
For more information, see this Terraform provider guide.
-
Get an IAM token for API authentication and put it in an environment variable:
export IAM_TOKEN="<IAM_token>" -
Clone the cloudapi
repository:cd ~/ && git clone --depth=1 https://github.com/yandex-cloud/cloudapiBelow, we assume that the repository contents reside in the
~/cloudapi/directory. -
Create a file named
body.jsonand paste the following code into it:{ <cluster_parameters> ... "trino": { "catalogs": [ { "name": "catalog_1_name", ... }, { "name": "catalog_2_name", ... }, ... { "name": "catalog_N_name", ... } ] ... "access_control": { "procedures": [ { "privileges": [ "<list_of_privileges>" ], "procedure": { "names": { "any": [ "<list_of_procedure_names>" ] }, "name_regexp": "<regular_expression>" }, "schema": { "names": { "any": [ "<list_of_schema_names>" ] }, "name_regexp": "<regular_expression>" }, "catalog": { "names": { "any": [ "<catalog_1_name>", "<catalog_2_name>", ... "<catalog_N_name>" ] }, "name_regexp": "<regular_expression>" }, "users": [ "<list_of_user_IDs>" ], "groups": [ "<list_of_group_IDs>" ], "description": "<rule_description>" }, { <Rule_2_section> }, ... { <Rule_N_section> } ] } } }Where:
-
access_control: Access rule configuration in the cluster. -
procedures: List of rule sections for procedures. All the rule parameters are optional:privileges,procedure,schema,catalog,groups,users, anddescription. -
privileges: Permitted actions with procedures:EXECUTE: Allows calling the procedure.
If you do not specify the
privilegesparameter, the rule will prohibit any actions with the procedures. -
procedure: Procedures the rule applies to. If theproceduresection is not specified, the rule applies to all procedures.names: List of procedure names.name_regexp: Regular expression. The rule applies to the procedures whose names match the regular expression.
The
proceduresection must contain either the nestednamessection or thename_regexpparameter. -
schema: Schemas the rule applies to. If theschemasection is not specified, the rule applies to all schemas.names: List of schema names.name_regexp: Regular expression. The rule applies to the schemas whose names match the regular expression.
The
schemasection must contain either the nestednamessection or thename_regexpparameter. -
catalog: Catalogs the rule applies to. If thecatalogsection is not specified, the rule applies to all cluster catalogs.names: List of catalog names. You must create catalogs within the same ClusterService/Create call.name_regexp: Regular expression. The rule applies to the catalogs whose names match the regular expression.
The
catalogsection must contain either the nestednamessection or thename_regexpparameter.
-
groups: List of group IDs the rule applies to. If you do not specifygroups, the rule applies to all user groups. -
users: List of user IDs the rule applies to. If you do not specifyusers, the rule applies to all users. -
description: Rule description.
For available cluster parameters and their descriptions, see this guide.
-
-
Call the ClusterService/Create method, e.g., via the following gRPCurl
request: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 -
Check the server response to make sure your request was successful.
Setting rules for an existing cluster
You can set or update procedure access rules for an existing Managed Service for Trino cluster.
Warning
Procedure and schema names specified in the rules are not validated. If a procedure name or a schema name contains an error, the rule will not apply correctly.
If you do not have the Yandex Cloud CLI installed yet, install and initialize it.
By default, the CLI uses the folder specified when creating the profile. To change the default folder, use the yc config set folder-id <folder_ID> command. You can also set a different folder for any specific command using the --folder-name or --folder-id parameter.
To set procedure access rules:
-
If you have not set any access rules yet, create a file named
access_control.yamland paste the following code into it:procedures: # Rule 1 - privileges: [<list_of_privileges>] procedure: names: any: [<list_of_procedure_names>] name_regexp: <regular_expression> schema: names: any: [<list_of_schema_names>] name_regexp: <regular_expression> catalog: ids: any: [<list_of_catalog_IDs>] names: any: [<list_of_catalog_names>] name_regexp: <regular_expression> groups: [<list_of_group_IDs>] users: [<list_of_user_IDs>] description: <rule_description> # Rule 2 - <Rule_2_parameters> ... # Rule N - <Rule_N_parameters>Where:
-
procedures: List of procedure rules. All the rule parameters are optional:privileges,procedure,schema,catalog,groups,users, anddescription. -
privileges: Permitted actions with procedures:EXECUTE: Allows calling the procedure.
If you do not specify the
privilegesparameter, the rule will prohibit any actions with the procedures. -
procedure: Procedures the rule applies to. If you do not specifyprocedure, the rule applies to all procedures.names: List of procedure names.name_regexp: Regular expression. The rule applies to the procedures whose names match the regular expression.
You can specify either
namesorname_regexpbut not both. -
schema: Schemas the rule applies to. If you do not specifyschema, the rule applies to all schemas.names: List of schema names.name_regexp: Regular expression. The rule applies to the schemas whose names match the regular expression.
You can specify either
namesorname_regexpbut not both. -
catalog: Catalogs the rule applies to. If you do not specifycatalog, the rule applies to all cluster catalogs.ids: List of catalog IDs. These must be the existing catalogs.names: List of catalog names. These must be the existing catalogs.name_regexp: Regular expression. The rule applies to the catalogs whose names match the regular expression.
Specify only one of these parameters:
ids,names, orname_regexp.
-
groups: List of group IDs the rule applies to. If you do not specifygroups, the rule applies to all user groups. -
users: List of user IDs the rule applies to. If you do not specifyusers, the rule applies to all users. -
description: Rule description.
-
-
If you have already set the access rules, open
access_control.yamland edit it as needed. You can:- Add new rules.
- Update the existing ones.
- Delete the rules you no longer need.
-
Run this command:
yc managed-trino cluster set-access-control <cluster_name_or_ID> \ --from-file access_control.yamlYou can get the cluster ID and name with the list of clusters in the folder.
-
Open the current Terraform configuration file describing your infrastructure.
To learn how to create this file, see Creating a cluster.
-
If you have not set any access rules yet, add the
yandex_trino_access_controlresource containing theproceduresrule list.resource "yandex_trino_cluster" "<cluster_name>" { ... } resource "yandex_trino_catalog" "<catalog_1_name>" { ... } resource "yandex_trino_catalog" "<catalog_2_name>" { ... } ... resource "yandex_trino_catalog" "<catalog_N_name>" { ... } resource "yandex_trino_access_control" "trino_access_control" { ... cluster_id = yandex_trino_cluster.<cluster_name>.id procedures = [ # Rule 1 { privileges = ["<list_of_privileges>"] procedure = { names = ["<list_of_procedure_names>"] name_regexp = "<regular_expression>" } schema = { names = ["<list_of_schema_names>"] name_regexp = "<regular_expression>" } catalog = { ids = [ yandex_trino_catalog.<catalog_1_name>.id, yandex_trino_catalog.<catalog_2_name>.id, ... yandex_trino_catalog.<catalog_N_name>.id ] name_regexp = "<regular_expression>" } users = ["<list_of_user_IDs>"] groups = ["<list_of_group_IDs>"] description = "<rule_description>" }, # Rule 2 { ... }, ... # Rule N { ... } ] ... }Where:
-
procedures: List of rule sections for procedures. All the rule parameters are optional:privileges,procedure,schema,catalog,groups,users, anddescription. -
privileges: Permitted actions with procedures:EXECUTE: Allows calling the procedure.
If you do not specify the
privilegesparameter, the rule will prohibit any actions with the procedures. -
procedure: Procedures the rule applies to. If theproceduresection is not specified, the rule applies to all procedures.names: List of procedure names.name_regexp: Regular expression. The rule applies to the procedures whose names match the regular expression.
You can specify either
namesorname_regexpbut not both. -
schema: Schemas the rule applies to. If theschemasection is not specified, the rule applies to all schemas.names: List of schema names.name_regexp: Regular expression. The rule applies to the schemas whose names match the regular expression.
You can specify either
namesorname_regexpbut not both. -
catalog: Cluster catalogs the rule applies to. If thecatalogsection is not specified, the rule applies to all cluster catalogs.ids: List of catalog IDs. These must exist or be created in the same manifest.name_regexp: Regular expression. The rule applies to the catalogs whose names match the regular expression.
You can specify either
idsorname_regexpbut not both.
-
groups: List of group IDs the rule applies to. If you do not specifygroups, the rule applies to all user groups. -
users: List of user IDs the rule applies to. If you do not specifyusers, the rule applies to all users. -
description: Rule description.
-
-
If you have already set the access rules, edit the
yandex_trino_access_controlresource description. You can:- Add new rules.
- Update the existing ones.
- Delete the rules you no longer need.
-
Make sure the settings are correct.
-
In the command line, navigate to the directory that contains the current Terraform configuration files defining the infrastructure.
-
Run this command:
terraform validateTerraform will show any errors found in your configuration files.
-
-
Confirm updating the resources.
-
Run this command to view the planned changes:
terraform planIf you described the configuration correctly, the terminal will display a list of the resources to update and their parameters. This is a verification step that does not apply changes to your resources.
-
If everything looks correct, apply the changes:
-
Run this command:
terraform apply -
Confirm updating the resources.
-
Wait for the operation to complete.
-
-
For more information, see this Terraform provider guide.
-
Get an IAM token for API authentication and put it in an environment variable:
export IAM_TOKEN="<IAM_token>" -
Clone the cloudapi
repository:cd ~/ && git clone --depth=1 https://github.com/yandex-cloud/cloudapiBelow, we assume that the repository contents reside in the
~/cloudapi/directory. -
If you have not set any access rules yet, create a file named
body.jsonand paste the following code into it:{ "cluster_id": "<cluster_ID>", "update_mask": { "paths": [ "trino.access_control.procedures" ] }, "trino": { "access_control": { "procedures": [ { "privileges": [ "<list_of_privileges>" ], "procedure": { "names": { "any": [ "<list_of_procedure_names>" ] }, "name_regexp": "<regular_expression>" }, "schema": { "names": { "any": [ "<list_of_schema_names>" ] }, "name_regexp": "<regular_expression>" }, "catalog": { "ids": { "any": [ "<list_of_catalog_IDs>" ] }, "names": { "any": [ "<list_of_catalog_names>" ] }, "name_regexp": "<regular_expression>" }, "users": [ "<list_of_user_IDs>" ], "groups": [ "<list_of_group_IDs>" ], "description": "<rule_description>" }, { <Rule_2_section> }, ... { <Rule_N_section> } ] } } }Where:
-
cluster_id: Cluster ID.You can get the cluster ID with the list of clusters in the folder.
-
update_mask: List of parameters to update as an array of strings (paths[]).Format for listing settings
"update_mask": { "paths": [ "<setting_1>", "<setting_2>", ... "<setting_N>" ] }Warning
When you update a cluster, all parameters of the object you are modifying will take their defaults unless explicitly provided in the request. To avoid this, list the settings you want to change in the
update_maskparameter. -
access_control: Access rule configuration in the cluster. -
procedures: List of rule sections for procedures. All the rule parameters are optional:privileges,procedure,schema,catalog,groups,users, anddescription. -
privileges: Permitted actions with procedures:EXECUTE: Allows calling the procedure.
If you do not specify the
privilegesparameter, the rule will prohibit any actions with the procedures. -
procedure: Procedures the rule applies to. If theproceduresection is not specified, the rule applies to all procedures.names: List of procedure names.name_regexp: Regular expression. The rule applies to the procedures whose names match the regular expression.
The
proceduresection must contain either the nestednamessection or thename_regexpparameter. -
schema: Schemas the rule applies to. If theschemasection is not specified, the rule applies to all schemas.names: List of schema names.name_regexp: Regular expression. The rule applies to the schemas whose names match the regular expression.
The
schemasection must contain either the nestednamessection or thename_regexpparameter. -
catalog: Catalogs the rule applies to. If thecatalogsection is not specified, the rule applies to all cluster catalogs.ids: List of catalog IDs. These must be the existing catalogs.names: List of catalog names. These must be the existing catalogs.name_regexp: Regular expression. The rule applies to the catalogs whose names match the regular expression.
The
catalogsection must contain either one of the nestedidsornamessections, or thename_regexpparameter.
-
groups: List of group IDs the rule applies to. If you do not specifygroups, the rule applies to all user groups. -
users: List of user IDs the rule applies to. If you do not specifyusers, the rule applies to all users. -
description: Rule description.
-
-
If you have already set the access rules, open the existing
body.jsonrules file and edit it as needed. You can:- Add new rules.
- Update the existing ones.
- Delete the rules you no longer need.
-
Call the ClusterService.Update method, e.g., via the following gRPCurl
request: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 -
Check the server response to make sure your request was successful.
Example of setting procedure access rules
Let's configure access rules for custom procedures in a Trino cluster:
- Prohibit any actions with procedures to the user with the
banned_user_id. - Allow users in the group with the
admins_group_idto call procedures. - Prohibit any actions with procedures to all other users.
The access_control.yaml file for this rule set is as follows:
procedures:
- users:
- banned_user_id
- groups:
- admins_group_id
privileges:
- EXECUTE
The configuration file for this rule set is as follows:
resource "yandex_trino_access_control" "trino_access_control" {
...
cluster_id = <cluster_ID>
procedures = [
{
users = ["banned_user_id"]
},
{
groups = ["admins_group_id"]
privileges = ["EXECUTE"]
},
]
...
}
The body.json file for this rule set is as follows:
{
"cluster_id": "<cluster_ID>",
"update_mask": {
"paths": [
"trino.access_control.procedures"
]
},
"trino": {
"access_control": {
"procedures": [
{
"users": [
"banned_user_id"
]
},
{
"groups": [
"admins_group_id"
],
"privileges": [
"EXECUTE"
]
}
]
}
}
}