Trino 权限控制讲解与实战操作(资源分组)

一、概述

Trino支持两种主要类型的权限控制:系统权限控制文件权限控制。这两种类型的权限控制可以用于管理哪些用户或角色可以执行特定操作和访问特定资源。

在这里插入图片描述

二、系统访问权限控制

1)系统访问权限控制介绍

系统访问控制在任何连接器级别授权之前在全局级别强制执行授权。您可以使用 Trino 中的内置实现之一,或者按照 系统访问控制中的指南提供您自己的实现。

官网文档:https://trino.io/docs/current/security/built-in-system-access-control.html

要使用系统访问控制,请etc/access-control.properties在所有集群节点上添加包含以下内容和所需系统访问控制名称的文件:

access-control.name=allow-all

可以使用配置属性一次配置多个系统访问控制实现access-control.config-files。它应该包含要使用的访问控制属性文件的逗号分隔列表(而不是默认的etc/access-control.properties)。

Trino 提供以下内置系统访问控制实现:

权限名称 描述
default 除了用户模拟和触发 Graceful shutdown之外,所有操作都是允许的。如果未配置,则这是默认访问控制。
allow-all 所有操作均被允许。
read-only 允许读取数据或元数据的操作,但不允许写入数据或元数据的操作。
file 授权规则在配置文件中指定。请参阅 基于文件的访问控制。

如果您想以除上面列出的方式之外的任何其他方式限制系统级别的访问,则必须实施自定义系统访问控制。自定义系统访问控制,可以参考官方文档:https://trino.io/docs/current/security/built-in-system-access-control.html

2)测试验证

测试验证可以参考我这篇文章:Trino HTTPS 与密码认证介绍与实战操作

三、资源分组

资源分组是比较重要的,可以控制不同用户使用的资源,官方文档:https://trino.io/docs/current/admin/resource-groups.html?highlight=resource+groups+json

添加一个配置文件 etc/resource-groups.properties,内容如下:

resource-groups.configuration-manager=file
resource-groups.config-file=etc/resource-groups.json

etc/resource-groups.json 配置文件示例:

{
  "rootGroups": [
    {
      "name": "global",
      "softMemoryLimit": "80%",
      "hardConcurrencyLimit": 100,
      "maxQueued": 1000,
      "schedulingPolicy": "weighted",
      "jmxExport": true,
      "subGroups": [
        {
          "name": "data_definition",
          "softMemoryLimit": "10%",
          "hardConcurrencyLimit": 5,
          "maxQueued": 100,
          "schedulingWeight": 1
        },
        {
          "name": "adhoc",
          "softMemoryLimit": "10%",
          "hardConcurrencyLimit": 50,
          "maxQueued": 1,
          "schedulingWeight": 10,
          "subGroups": [
            {
              "name": "other",
              "softMemoryLimit": "10%",
              "hardConcurrencyLimit": 2,
              "maxQueued": 1,
              "schedulingWeight": 10,
              "schedulingPolicy": "weighted_fair",
              "subGroups": [
                {
                  "name": "${USER}",
                  "softMemoryLimit": "10%",
                  "hardConcurrencyLimit": 1,
                  "maxQueued": 100
                }
              ]
            },
            {
              "name": "bi-${toolname}",
              "softMemoryLimit": "10%",
              "hardConcurrencyLimit": 10,
              "maxQueued": 100,
              "schedulingWeight": 10,
              "schedulingPolicy": "weighted_fair",
              "subGroups": [
                {
                  "name": "${USER}",
                  "softMemoryLimit": "10%",
                  "hardConcurrencyLimit": 3,
                  "maxQueued": 10
                }
              ]
            }
          ]
        },
        {
          "name": "pipeline",
          "softMemoryLimit": "80%",
          "hardConcurrencyLimit": 45,
          "maxQueued": 100,
          "schedulingWeight": 1,
          "jmxExport": true,
          "subGroups": [
            {
              "name": "pipeline_${USER}",
              "softMemoryLimit": "50%",
              "hardConcurrencyLimit": 5,
              "maxQueued": 100
            }
          ]
        }
      ]
    },
    {
      "name": "admin",
      "softMemoryLimit": "100%",
      "hardConcurrencyLimit": 50,
      "maxQueued": 100,
      "schedulingPolicy": "query_priority",
      "jmxExport": true
    }
  ],
  "selectors": [
    {
      "user": "bob",
      "group": "admin"
    },
    {
      "userGroup": "admin",
      "group": "admin"
    },
    {
      "source": ".*pipeline.*",
      "queryType": "DATA_DEFINITION",
      "group": "global.data_definition"
    },
    {
      "source": ".*pipeline.*",
      "group": "global.pipeline.pipeline_${USER}"
    },
    {
      "source": "jdbc#(?<toolname>.*)",
      "clientTags": ["hipri"],
      "group": "global.adhoc.bi-${toolname}.${USER}"
    },
    {
      "group": "global.adhoc.other.${USER}"
    }
  ],
  "cpuQuotaPeriod": "1h"
}

资源组属性字段解释:

  • name(必填):群组名称。

  • maxQueued(必需):排队查询的最大数量。一旦达到此限制,新的查询将被拒绝。

  • softConcurrencyLimit(可选):并发运行的查询数,只有在低于其软限制的所有对等资源 组不合格或所有符合条件的对等资源组均高于软限制时,才会运行新查询。

  • hardConcurrencyLimit(必需):运行查询的最大数量。

  • softMemoryLimit(必需):在新查询排队之前,该组可以使用的最大分布式内存量。可以指定为集群内存的绝对值(即1GB)或百分比(即)。10%

  • softCpuLimitcpuQuotaPeriod(可选):在对正在运行的查询的最大数量应用惩罚之前,该组在一段时间内可以使用的最大 CPU 时间(请参阅)。hardCpuLimit还必须指定。

  • hardCpuLimit(可选):该组在一段时间内可以使用的最大 CPU 时间。

  • schedulingPolicy(可选):指定如何选择运行排队查询,以及子组如何有资格启动其查询。可能是三个值之一:

    • fair(默认):排队的查询按先进先出的方式处理,子组必须 轮流启动新查询(如果有任何排队的查询)。

    • weighted_fair:根据子组以及它们已经同时运行的查询数量来选择子组schedulingWeight。子组运行查询的预期份额是根据所有当前符合条件的子组的权重计算的。选择相对于其份额具有最少并发性的子组来开始下一个查询。

    • weighted:排队的查询根据其优先级按比例随机选择,通过query_priority 会话属性指定。选择子组来按照其 的比例启动新查询schedulingWeight。

    • query_priority:所有子组也必须配置query_priority。排队查询是根据其优先级严格选择的。

  • schedulingWeight(可选):该子组的权重weighted 和weighted_fair调度策略。默认为1。

  • jmxExport(可选):如果为 true,组统计信息将导出到 JMX 进行监控。默认为false.

  • subGroups(可选):子组列表。

Selector 字段解释:

  • user(可选):与用户名匹配的正则表达式。

  • userGroup(可选):用于匹配用户所属的每个用户组的正则表达式。

  • source(可选):与源字符串匹配的正则表达式。

  • queryType(可选):与提交的查询类型匹配的字符串:

    • SELECT:SELECT查询。

    • EXPLAIN:EXPLAIN查询(但不是)。EXPLAIN ANALYZE

    • DESCRIBE: DESCRIBE、、、 和查询。DESCRIBE INPUTDESCRIBE OUTPUTSHOW

    • INSERT: INSERT、、 和查询。CREATE TABLE ASREFRESH MATERIALIZED VIEW

    • UPDATE:UPDATE查询。

    • DELETE:DELETE查询。

    • ANALYZE:ANALYZE查询。

    • DATA_DEFINITION:更改/创建/删除模式/表/视图的元数据以及管理准备好的语句、权限、会话和事务的查询。

  • clientTags(可选):标签列表。为了匹配,此列表中的每个标签都必须位于客户端提供的与查询关联的标签列表中。

  • group(必需):这些查询将在其中运行的组。

【温馨提示】选择器按顺序处理,并且将使用第一个匹配的选择器。

四、基于文件的访问控制

1)基于文件的访问控制介绍

官方文档:https://trino.io/docs/current/security/file-system-access-control.html

为了保护对集群中数据的访问,您可以实施基于文件的访问控制,其中对数据和操作的访问由手动配置的 JSON 文件中声明的规则定义。

有两种类型的基于文件的访问控制:

  • 系统级访问控制使用带有单个 JSON 文件的访问控制插件,该文件指定整个集群的授权规则。

  • 目录级访问控制对每个目录使用单独的 JSON 文件,以对该目录中的数据进行精细控制,包括列级授权。

【温馨提示】默认情况下允许访问包括表函数在内的所有函数。为了减少不需要的访问,您必须添加一条function 规则来拒绝该TABLE功能类型。

要使用访问控制插件,请添加一个 etc/access-control.properties 包含两个必需属性的文件:access-control.name,必须设置为file,以及security.config-file,必须设置为配置文件的位置。配置文件位置可以指向本地磁盘或 http 端点。例如,如果名为 的配置文件rules.json位于etc,则添加etc/access-control.properties包含以下内容的 :

access-control.name=file
security.config-file=etc/rules.json

【温馨提示】默认情况下,当 JSON 规则文件发生更改时,必须重新启动 Trino 才能加载更改。有一个可选属性可以刷新属性,而无需重新启动 Trino。刷新周期在以下中指定 etc/access-control.properties

security.refresh-period=1s

例如,如果您希望仅允许用户admin访问 mysql和system catalog,允许group finance和human_resources 访问 postgres catalog,允许所有用户访问hive catalog,并拒绝所有其他访问,则可以使用以下规则(etc/rules.json):

{
  "catalogs": [
    {
      "user": "admin",
      "catalog": "(mysql|system)",
      "allow": "all"
    },
    {
      "group": "finance|human_resources",
      "catalog": "postgres",
      "allow": true
    },
    {
      "catalog": "hive",
      "allow": "all"
    },
    {
      "user": "alice",
      "catalog": "postgresql",
      "allow": "read-only"
    },
    {
      "catalog": "system",
      "allow": "none"
    }
  ]
}

2)测试验证

git地址(auth分支):https://gitee.com/hadoop-bigdata/docker-compose-presto

1)部署 Trino(docker-compose.yaml)

version: '3'
services:
  trino-coordinator:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/trino-jmx-exporter:416
    user: "hadoop:hadoop"
    container_name: trino-coordinator
    hostname: trino-coordinator
    restart: always
    privileged: true
    env_file:
      - .env
    volumes:
      - ./etc/coordinator/config.properties:${TRINO_HOME}/etc/config.properties
      - ./etc/coordinator/jvm.config:${TRINO_HOME}/etc/jvm.config
      - ./etc/coordinator/log.properties:${TRINO_HOME}/etc/log.properties
      - ./etc/coordinator/node.properties:${TRINO_HOME}/etc/node.properties
      - ./etc/catalog/:${TRINO_HOME}/etc/catalog/
      - ./jmx-exporter/jmx_config.yaml:${TRINO_HOME}/etc/jmx_config.yaml
      - ./etc/rules.json:${TRINO_HOME}/etc/rules.json
      - ./etc/access-control.properties:${TRINO_HOME}/etc/access-control.properties
    ports:
      - "30080:${TRINO_SERVER_PORT}"
      - "30980:${JMX_RMIREGISTRY_PORT}"
      - "30981:${JMX_RMISERVER_PORT}"
      - "3900"
    command: ["sh","-c","/opt/apache/bootstrap.sh trino-coordinator"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "curl --fail http://localhost:${TRINO_SERVER_PORT}/v1/info || exit 1"]
      interval: 10s
      timeout: 20s
      retries: 3
  trino-worker:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/trino:416
    user: "hadoop:hadoop"
    restart: always
    privileged: true
    deploy:
      replicas: 1
    env_file:
      - .env
    volumes:
      - ./etc/worker/config.properties:${TRINO_HOME}/etc/config.properties
      - ./etc/worker/jvm.config:${TRINO_HOME}/etc/jvm.config
      - ./etc/worker/log.properties:${TRINO_HOME}/etc/log.properties
      - ./etc/worker/node.properties:${TRINO_HOME}/etc/node.properties
      - ./etc/catalog/:${TRINO_HOME}/etc/catalog/
      - ./jmx-exporter/jmx_config.yaml:${TRINO_HOME}/etc/jmx_config.yaml
    ports:
      - "${TRINO_SERVER_PORT}"
    command: ["sh","-c","/opt/apache/bootstrap.sh trino-worker"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "curl --fail http://localhost:${TRINO_SERVER_PORT}/v1/info || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 3

# 连接外部网络
networks:
  hadoop-network:
    external: true

2)启动服务

# 如果没创建就先创建
docker network create hadoop-network

# 开始部署
docker-compose -f docker-compose.yaml up -d

3)测试验证

docker exec -it trino-coordinator bash

# 不指定用户就默认使用当前系统用户,也就是允许Trino的用户(我这里是hadoop)
./bin/trino-cli --server http://localhost:8080
select * from system.runtime.nodes;

# 指定有权限的用户
./bin/trino-cli --server http://localhost:8080 --user=admin

# 指定无权限的用户
./bin/trino-cli --server http://localhost:8080 --user=hive

在这里插入图片描述

Trino 权限控制讲解与实战操作(资源分组)就先到这里了,有任何疑问也可关注我公众号:大数据与云原生技术分享,进行技术交流,如本篇文章对您有所帮助,麻烦帮忙一键三连(点赞、转发、收藏)~

posted @ 2023-09-18 00:05  大数据老司机  阅读(376)  评论(0编辑  收藏  举报