百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

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

bigegpt 2024-08-26 11:13 2 浏览

一、概述

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

相关推荐

Docker篇(二):Docker实战,命令解析

大家好,我是杰哥上周我们通过几个问题,让大家对于Docker有了一个全局的认识。然而,说跟练往往是两个概念。从学习的角度来说,理论知识的学习,往往只是第一步,只有经过实战,才能真正掌握一门技术所以,本...

docker学习笔记——安装和基本操作

今天学习了docker的基本知识,记录一下docker的安装步骤和基本命令(以CentOS7.x为例)一、安装docker的步骤:1.yuminstall-yyum-utils2.yum-con...

不可错过的Docker完整笔记(dockerhib)

简介一、Docker简介Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,...

扔掉运营商的 IPTV 机顶盒,全屋全设备畅看 IPTV!

其实现在看电视节目的需求确实大大降低了,折腾也只是为了单纯的让它实现,享受这个过程带来的快乐而已,哈哈!预期构想家里所有设备直接接入网络随时接收并播放IPTV直播(电信点播的节目不是太多,但好在非常稳...

第五节 Docker 入门实践:从 Hello World 到容器操作

一、Docker容器基础运行(一)单次命令执行通过dockerrun命令可以直接在容器中执行指定命令,这是体验Docker最快捷的方式:#在ubuntu:15.10容器中执行ech...

替代Docker build的Buildah简单介绍

Buildah是用于通过较低级别的coreutils接口构建OCI兼容镜像的工具。与Podman相似,Buildah不依赖于Docker或CRI-O之类的守护程序,并且不需要root特权。Builda...

Docker 命令大全(docker命令大全记录表)

容器生命周期管理run-创建并启动一个新的容器。start/stop/restart-这些命令主要用于启动、停止和重启容器。kill-立即终止一个或多个正在运行的容器rm-于删除一个或...

docker常用指令及安装rabbitMQ(docker安装rabbitmq配置环境)

一、docker常用指令启动docker:systemctlstartdocker停止docker:systemctlstopdocker重启docker:systemctlrestart...

使用Docker快速部署Storm环境(docker部署confluence)

Storm的部署虽然不是特别麻烦,但是在生产环境中,为了提高部署效率,方便管理维护,使用Docker来统一管理部署是一个不错的选择。下面是我开源的一个新的项目,一个配置好了storm与mono环境的D...

Docker Desktop安装使用指南:零基础教程

在之前的文章中,我多次提到使用Docker来安装各类软件,尤其是开源软件应用。鉴于不少读者对此有需求,我决定专门制作一期关于Docker安装与使用的详细教程。我主要以Macbook(Mac平台)为例进...

Linux如何成功地离线安装docker(linux离线安装httpd)

系统环境:Redhat7.2和Centos7.4实测成功近期因项目需要用docker,所以记录一些相关知识,由于生产环境是不能直接连接互联网,尝试在linux中离线安装docker。步骤1.下载...

Docker 类面试题(常见问题)(docker面试题目)

Docker常见问题汇总镜像相关1、如何批量清理临时镜像文件?可以使用sudodockerrmi$(sudodockerimages-q-fdanging=true)命令2、如何查看...

面试官:你知道Dubbo怎么优雅上下线的吗?你:优雅上下线是啥?

最近无论是校招还是社招,都进行的如火如荼,我也承担了很多的面试工作,在一次面试过程中,和候选人聊了一些关于Dubbo的知识。Dubbo是一个比较著名的RPC框架,很多人对于他的一些网络通信、通信协议、...

【Docker 新手入门指南】第五章:Hello Word

适合人群:完全零基础新手|学习目标:30分钟掌握Docker核心操作一、准备工作:先确认是否安装成功打开终端(Windows用户用PowerShell或GitBash),输入:docker--...

松勤软件测试:详解Docker,如何用portainer管理Docker容器

镜像管理搜索镜像dockersearch镜像名称拉取镜像dockerpullname[:tag]列出镜像dockerimages删除镜像dockerrmiimage名称或id删除...