ClickHouse 基于角色访问控制(RBAC)最佳实践

2023-05-16

本文介绍ClickHouse RBAC访问控制模型。包括如何启用SQL管理,创建管理员用户,创建角色,授权,细粒度列和行级授权。并通过示例进行验证实现过程。

启用RBAC

在users.xml中启用SQL用户模式,在admin用户下加入下面内容。

<access_management>1</access_management>
<named_collection_control>1</named_collection_control>
<show_named_collections>1</show_named_collections>
<show_named_collections_secrets>1</show_named_collections_secrets>

default用户主要用于内部或后台操作,使用密码设置反而不方便,因为你必须在许多配置部分中更改它。最佳方式是保护default用户,仅允许在localhost或信任网络中。


<clickhouse>
<users>
    <default>
    ......    
        <networks>
            <ip>127.0.0.1/8</ip>
            <ip>10.10.10.0/24</ip>
        </networks>
    
    ......
    </default>
</clickhouse>

现在我们创建dba用户,并启用SQL管理功能。

创建admin用户

创建DBA用户,就如MySQL中root,这里为admin:

<clickhouse>
<users>
  <default>
  ....
  </default>
  <admin>
      <!--    
        Password could be specified in plaintext or in SHA256 (in hex format).

        If you want to specify password in plaintext (not recommended), place it in 'password' element.
        Example: <password>qwerty</password>.
        Password could be empty.

        If you want to specify SHA256, place it in 'password_sha256_hex' element.
        Example: <password_sha256_hex>65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5</password_sha256_hex>
        Restrictions of SHA256: impossibility to connect to ClickHouse using MySQL JS client (as of July 2019).

        If you want to specify double SHA1, place it in 'password_double_sha1_hex' element.
        Example: <password_double_sha1_hex>e395796d6546b1b65db9d665cd43f0e858dd4303</password_double_sha1_hex>
      -->
      <password></password> 
      <networks>
          <ip>::/0</ip>
      </networks>
      <!-- Settings profile for user. -->
      <profile>default</profile>
      <!-- Quota for user. -->
      <quota>default</quota>
      <!-- Set This parameter to Enable RBAC
      Admin user can create other users and grant rights to them. -->
    <access_management>1</access_management>
    <named_collection_control>1</named_collection_control>
    <show_named_collections>1</show_named_collections>
    <show_named_collections_secrets>1</show_named_collections_secrets>
  </admin>
...
</clickhouse>

admin为用户名,密码有三种方式支持明文和加密方式(参考注释)。然后是配置网络访问,为了安全dba也建议设置专门管理ip进行访问。profile配置查询资源配额,quota配置熔断资源配额。最后4行是重点,启动SQL管理。

创建用户和角色

现在可以像其他数据库一样,实用通用RBAC方法创建角色和用户,给角色授权,为不同应用创建用户等。

示例

创建三个角色:dba, dashboard_ro, ingester_rw

create role dba on cluster '{cluster}';
grant all on *.* to dba on cluster '{cluster}';
create user `user1` identified  by 'pass1234' on cluster '{cluster}';
grant dba to user1 on cluster '{cluster}';

-- dashboard_ro 为只读角色,仅能访问default资源,通用dictGet访问字典
create role dashboard_ro on cluster '{cluster}';
grant select on default.* to dashboard_ro on cluster '{cluster}';
grant dictGet on *.*  to dashboard_ro on cluster '{cluster}';

-- 给dashboard_ro设置熔断配额
create settings profile or replace profile_dashboard_ro on cluster '{cluster}'
settings max_concurrent_queries_for_user = 10 READONLY, 
         max_threads = 16 READONLY, 
         max_memory_usage_for_user = '30G' READONLY,
         max_memory_usage = '30G' READONLY,
         max_execution_time = 60 READONLY,
         max_rows_to_read = 1000000000 READONLY,
         max_bytes_to_read = '5000G' READONLY
TO dashboard_ro;

-- 创建用户,并授权dashboard_ro角色
create user `dash1` identified  by 'pass1234' on cluster '{cluster}';

grant dashboard_ro to dash1 on cluster '{cluster}';

-- 创建读写权限角色
create role ingester_rw on cluster '{cluster}';
grant select,insert on default.* to ingester_rw on cluster '{cluster}';

create settings profile or replace profile_ingester_rw on cluster '{cluster}'
settings max_concurrent_queries_for_user = 40 READONLY,    -- user can run 40 queries (select, insert ...) simultaneously  
         max_threads = 10 READONLY,                        -- each query can use up to 10 cpu (READONLY means user cannot override a value)
         max_memory_usage_for_user = '30G' READONLY,       -- all queries of the user can use up to 30G RAM
         max_memory_usage = '25G' READONLY,                -- each query can use up to 25G RAM
         max_execution_time = 200 READONLY,                -- each query can executes no longer 200 seconds
         max_rows_to_read = 1000000000 READONLY,           -- each query can read up to 1 billion rows
         max_bytes_to_read = '5000G' READONLY              -- each query can read up to 5 TB from a MergeTree
TO ingester_rw;

-- 创建用户并授权角色
create user `ingester_app1` identified  by 'pass1234' on cluster '{cluster}';

grant ingester_rw to ingester_app1 on cluster '{cluster}';

创建用户还有更多选项,举例限定IP地址:

create user if not exists benjaminwootton_ip_restricted 
identified with plaintext_password by 'password321' host ip '192.168.0.0/16';

检查

$ clickhouse-client -u dash1 --password pass1234

create table test ( A Int64) Engine=Log;
   DB::Exception: dash1: Not enough privileges
   
   
$ clickhouse-client -u user1 --password pass1234

create table test ( A Int64) Engine=Log;
Ok.

drop table test;
Ok.


$ clickhouse-client -u ingester_app1 --password pass1234

select count() from system.numbers limit 1000000000000;
   DB::Exception: Received from localhost:9000. DB::Exception: Limit for rows or bytes to read exceeded, max rows: 1.00 billion

清理测试数据

show profiles;
┌─name─────────────────┐
│ default              │
│ profile_dashboard_ro │
│ profile_ingester_rw  │
│ readonly             │
└──────────────────────┘

drop profile if exists readonly on cluster '{cluster}';
drop profile if exists profile_dashboard_ro on cluster '{cluster}';
drop profile if exists profile_ingester_rw on cluster '{cluster}';


show roles;
┌─name─────────┐
│ dashboard_ro │
│ dba          │
│ ingester_rw  │
└──────────────┘

drop role if exists dba on cluster '{cluster}';
drop role if exists dashboard_ro on cluster '{cluster}';
drop role if exists ingester_rw on cluster '{cluster}';


show users;
┌─name──────────┐
│ dash1         │
│ default       │
│ ingester_app1 │
│ user1         │
└───────────────┘

drop user if exists ingester_app1 on cluster '{cluster}';
drop user if exists user1 on cluster '{cluster}';
drop user if exists dash1 on cluster '{cluster}';

更细粒度控制示例

创建两个角色SALESPERSON 和 SALESMANAGER,两者有不同的权限:

SALESPERSON

  • 能读写customers
  • 能写sales

SALESMANAGER

  • 能写customers
  • 能写sales
  • 能读employees

创建角色:

create role if not exists salesperson;
create role if not exists salesmanager;

给角色授权:


grant select on db.customers TO salesperson;
grant insert, select on db.sales TO salesperson;

grant insert on db.customers TO salesmanager;
grant insert on db.sales TO salesmanager;
grant select on db.employees to salesmanager;

给用户绑定角色:

grant salesmanager to testuser1;

-- 也可以创建用户时直接绑定
create user if not exists testuser2 
identified with plaintext_password by 'password321' 
default role salesperson 

限制列权限

RBAC模型中最后组件是权限,它描述了对特定数据库对象执行特定类型查询的权限。举例,下面查询中,销售管理者角色可以查询表特定字段:


grant select(order_id,pizza_type) ON db.pizza_orders 
to salesmanager with grant option

上面示例给角色授权,ClickHouse也支持给用户直接授权:

grant select(order_id,pizza_type) ON db.pizza_orders 
to testuser1 with grant option

WITH GRANT OPTION子句意味着我们授予权限的用户反过来有权将相同的权限授予其他用户。在上面的例子中,我们可能让销售经理将读取数据的权限下放给他们的员工,但销售人员可能不会拥有同样的权限。具体的配置将取决于具体业务需要。

限制行权限(行策略)

除了按列限制数据访问外,还可以按行以更细粒度的方式限制用户可以看到的数据。这可以通过ROW POLICY对象来实现,它接受一个SQL查询,说明给定的用户或角色可以访问哪些行:

create row policy low_value_orders_policy on
mydb.pizza_orders USING pizza_value < 1000 TO salesperson

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ClickHouse 基于角色访问控制(RBAC)最佳实践 的相关文章

  • 程序员的生活,其实苦不堪言

    前一天 A 下班前把这个代码发给我 B 好的 xff01 第二天 A 都他妈中午了 xff0c 代码怎么还没发过来 xff1f B 我他妈还没下班呢 xff01 程序猿的真实写照 曾经刚参加工作 xff0c 接手一个项目的维护 xff0c
  • 文件后缀大全

    file extensions with related program associations a unix library unix ada program a01 arj multi volume compressed archiv
  • Android Studio 安装Kotlin插件

    1 打开Android Studio 的File gt Settings xff0c 选择左侧Plugins显示已安装插件列表 搜索框输入kotlin xff0c 若无搜索结果 xff0c 可以点击 Search in repositori
  • Python读取文件的多种方式

    在Python编程中 xff0c 读取文件是非常常见的操作 Python提供了多种读取文件的方式 xff0c 本文将介绍其中的几种方式 1 使用open函数读取文件 使用Python内置函数open 可以打开一个文件 xff0c 并返回一个
  • 阿里Java面试题剖析:关于系统拆分,为什么要进行系统拆分?

    外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img Xz97Uqx1 1663815474530 https upload images jianshu io upload images 16535373 f09e8
  • 关于完全二叉树高度h与结点个数n的推导

    推导1 xff1a 具有n个 n gt 0 结点的完全二叉树的高度h为 xff1a log2 n 43 1 由于高度h的满二叉树共有2h 1个结点 高度为h 1的满二叉树有2h 1 1个结点 可得2h 1 1 lt n lt 61 2h 1
  • Android 采用fastboot刷system.img boot.img recovery.img

    手机正常启动后 xff0c 命令行模式下输入 adb reboot bootloader 该命令会自动进入fastboot模式 接着 xff1a fastboot devices 查看是否有设备 erase 擦除的意思 xff0c 你懂得
  • ButterKnife与BindView使用详解

    ButterKnife与BindView使用详解 ButterKnife的优势 具有强大的view绑定和click事件处理能力 方便处理Adapter里的viewHolder绑定问题 运行时不会影响app效率 xff0c 配置方便 代码清晰
  • libpcap的安装

    最近参加了一个实训项目 xff0c 是把一个WireShark抓到的pcapng文件用libpcap库还原成原始的TS流 xff0c 需求分析弄了一天 xff0c 安装环境用了一天 xff0c 接下来再开始写代码 xff0c 让我们一起完成
  • 【手把手教你】使用Python玩转金融时间序列模型

    01 引言 上一篇推文 Python量化基础 时间序列的自相关性与平稳性着重介绍了时间序列的一些基础概念 xff0c 包括自相关性 偏自相关性 白噪声和平稳性 xff0c 以及Python的简单实现 本文在此基础上 xff0c 以沪深300
  • Java 解决 java.lang.IllegalStateException 异常错误

    今天运行项目时出现的这个问题 xff0c 有错误提示可以看出 xff0c 大概意思是这个项目已经停止 xff0c 不能重新加载 也就是说只需重新部署基本就可以啦 网上有人说可以将项目从tomcat中先移除再部署上去 xff0c 实在不行就把
  • 学习笔记3 hive数据分析(实例)

    目的 xff1a 分析企业新闻舆情的正负面性与该公司是否有非法集资风险的关系 思路 xff1a 将两张表连接成一张新表 xff1b 根据 id 企业唯一标识 positive negtive 新闻正负面性 public date 发布日期
  • Gradle sync failed: Could not find com.android.tools.build:gradle:4.1.3解决方法

    Gradle sync failed Could not find com android tools build gradle 4 1 3解决方法 升级安卓4 1 3后导入其他项目显示如下错误 原因是软件无法更新Gradle sync x
  • AlertDialog对话框弹出后,旋转屏幕,对话框消失,造成leak window

    看log信息 按字面了解 xff0c Window Leaked大概就是说一个窗体泄漏了 xff0c 也就是我们常说的内存泄漏 xff0c 为什么窗体会泄漏呢 xff1f 我们知道Android的每一个Activity都有个WindowMa
  • 如何高效地阅读技术类书籍与博客

    原文地址 xff1a http www nowamagic net librarys veda detail 2050 如何高效地阅读技术类书籍与博客 影像阅读法 阅读是自我提升的一个有效方法 xff0c 阅读书籍 阅读博客都是我们技术提升
  • Java进阶面试题:如何设计一个高并发系统?

    面试原题 如何设计一个高并发系统 xff1f 面试官心理分析 说实话 xff0c 如果面试官问你这个题目 xff0c 那么你必须要使出全身吃奶劲了 为啥 xff1f 因为你没看到现在很多公司招聘的 JD 里都是说啥 xff0c 有高并发就经
  • 微擎按照UID获取用户绑定手机号

    按照UID获取用户信息 users 61 pdo fetch 34 select from 34 tablename 39 users 39 34 where uid 61 W 39 uid 39 34 按照UID获取用户绑定手机号 thi
  • AD-----间距、线宽、阻焊、铺铜规则设置

    1 间距规则 快捷键 D 43 R xff0c 出现如下界面 xff0c 在Clearance 中 即可设置对应的规则 Track 走线 SMD Pad 贴片式焊盘 TH Pad 通孔焊盘 Via xff1a 过孔 Copper xff1a
  • 【Python】程序员情人节搞事情的程序

    程序员情人节搞事情的程序 效果展示源码备注1 这段代码用 python 实现2 用 pyinstaller 打包成exe3 没有 pyinstaller 的话 xff0c 可以直接用 pip 安装 效果展示 源码 import pygame
  • Maven项目在编译及导入Eclipse时出现的错误汇总处理

    Maven项目在编译及导入Eclipse时出现的错误处理汇总 Maven在构建项目时确实是比较强大 xff0c 而且也越来越流行 xff0c 目前不但越来越多的开源项目 xff0c 甚至越来越多的商业项目都在使用Maven 但是不得不说Ma

随机推荐

  • AS导入项目报错:Plugin with id ‘com.android.application‘ not found

    转自 xff1a https www cnblogs com cuichen16 p 10785951 html 从github或第三方Demo中获取的项目导入到AndroidStudio中报错Plugin with id com andr
  • C#向Excel报表中插入图片的2种方法

    这几天做向Excel插入数据 xff0c 其中有插入图片的需求 xff0c 经试验 xff0c 下面2种方法都可以插入图片 xff0c 但各有不同的用处 现将这2种方法共享出来 xff0c 希望需要的朋友进行参考 xff0c 代码中已经有详
  • Response.Redirect 打开新窗口的两种方法

    一般情况下 xff0c Response Redirect 方法是在服务器端进行转向 xff0c 因此 xff0c 除非使用 Response Write 34 lt script gt window location 61 39 http
  • C# 实现向浏览器的兼容性视图列表中添加、删除网站和检查网站是否在兼容性网站列表中

    今天回答论坛上的一个问题 xff0c 搜索了一下网上 xff0c 并没有找到一个完整的例子 xff0c 下面根据网上的一些资料 xff0c 经过转换 完善成一个完整的例子 下面的例子可以实现添加 删除 检测网站是否在兼容性网站列表中的功能
  • Excel中 ColorIndex 属性值和颜色对照表

    Excel中 ColorIndex 属性值和颜色对照表 资料参考 http msdn microsoft com en us library cc296089 aspx http www mvps org dmcritchie excel
  • AJAX(XMLHttpRequest)进行跨域请求方法详解(一)

    注意 xff1a 以下代码请在Firefox 3 5 Chrome 3 0 Safari 4之后的版本中进行测试 IE8的实现方法与其他浏览不同 跨域请求 xff0c 顾名思义 xff0c 就是一个站点中的资源去访问另外一个不同域名站点上的
  • 分享30道Redis面试题,面试官能问到的我都找到了

    1 什么是Redis xff1f 简述它的优缺点 xff1f Redis本质上是一个Key Value类型的内存数据库 xff0c 很像memcached xff0c 整个数据库统统加载在内存当中进行操作 xff0c 定期通过异步操作把数据
  • AJAX(XMLHttpRequest)进行跨域请求方法详解(二)

    注意 xff1a 以下代码请在Firefox 3 5 Chrome 3 0 Safari 4之后的版本中进行测试 IE8的实现方法与其他浏览不同 2 xff0c 预检请求 预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTION
  • 将文本文件的内容或者文字保存成图片

    调用方法 xff1a ConvertTextFileToImage Server MapPath 34 Log txt 34 Server MapPath 34 Log png 34 实现代码 xff1a void ConvertTextF
  • Windows 文件资源管理器中搜索带特殊字符文件名的方法

    今天处理一些文件 xff0c 文件夹这包含有类似 16年普通高等学校招生全国统一考试 英语 的文件名 xff0c 想全部找出来删除掉 xff0c 直接在文件资源管理器里面输入 是搜索不到想要的文件的 xff0c 这些是特殊字符 xff0c
  • 脑成像坐标系: MNI + Talairach

    一 脑成像坐标系 xff1a MNI Talairach MNI 脑 Montreal Neurological Institute 是基于大量的正常被试MRI扫描结果得到的标准脑 xff08 当然是欧罗巴人群的 xff09 Talaira
  • windows10隐藏分区(隐藏efi系统分区)

    我们需要使用diskpart来移除这个误显示的盘符 可能使用的命令 xff1a 1 以管理员身份运行CMD xff1b 2 运行diskpart命令 xff1b 3 list disk 显示所有安装的磁盘 xff1b 4 select di
  • 干支纪年和纪日算法

    怎样从已知年份和日期得到对应的干支纪年和纪日 文 xff0f 葛民勤 摘要 xff1a 从已知年份计算干支纪年很简单 xff1a 年份数减3 xff0c 除以10的余数是天干 xff0c 除以12的余数是地 支 从已知日期计算干支纪日的公式
  • Shell 脚本监控磁盘空间

    df 命令可以展示文件系统的磁盘有效空间信息 如果不指定文件名 xff0c 则当前所有挂载的文件系统有效空间信息 实现步骤 使用 df 查看磁盘信息使用 grep命令 过滤文件系统 xff0c 获取空间使用百分比通过Shell 脚本进行监控
  • R 实现熵权法计算权重

    按照信息论基本原理的解释 xff0c 信息是系统有序程度的一个度量 xff0c 熵是系统无序程度的一个度量 xff1b 根据信息熵的定义 xff0c 对于某项指标 xff0c 可以用熵值来判断某个指标的离散程度 xff0c 其信息熵值越小
  • R实现KMeans聚类算法教程

    本文和你一起学习无监督机器学习算法 kmeans算法 xff0c 并在R中给详细的实现示例和步骤 什么是k means聚类算法 聚类是从数据集中对观测值进行聚类的机器学习方法 它的目标是聚类相似观测值 xff0c 不同类别之间差异较大 聚类
  • 使用gopsutil获取OS信息

    生产环境通常需要掌握主机硬盘 CPU 内存 进程等资源使用情况 xff0c 可以执行系统命令获得 xff0c 通过os exec执行命令 xff0c 如 xff1a ps cd top xff0c 然后解析命令执行结果 对于linux操作系
  • gcc工具小结

    关于 l和 Wall选项的解析 xff1a Wall 打开gcc的所有警告 l参数就是用来指定程序要链接的库 xff0c l参数紧接着就是库名 xff0c 那么库名跟真正的库文件名有什么关系呢 xff1f 就拿数学库来说 xff0c 他的库
  • 如何在Java中调用Python

    Python语言有丰富的系统管理 数据处理 统计类软件包 xff0c 因此从java应用中调用Python代码的需求很常见 实用 DataX 是阿里开源的一个异构数据源离线同步工具 xff0c 致力于实现包括关系型数据库 MySQL Ora
  • ClickHouse 基于角色访问控制(RBAC)最佳实践

    本文介绍ClickHouse RBAC访问控制模型 包括如何启用SQL管理 xff0c 创建管理员用户 xff0c 创建角色 xff0c 授权 xff0c 细粒度列和行级授权 并通过示例进行验证实现过程 启用RBAC 在users xml中