前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初探ClickHouse的RBAC权限功能

初探ClickHouse的RBAC权限功能

作者头像
Nauu
发布2020-05-20 23:27:06
3.1K2
发布2020-05-20 23:27:06
举报

最近电脑出了点问题,所以断更了一段时间,现在问题都解决了所以我也就回归啦。

在4.28号的线上 Meetup 中,朵夫介绍了 ClickHouse 的一项新特性,即基于角色的RBAC权限功能,当时我就觉得这将会是一项实用的功能。

会后我查阅了相关资料,发现在新版本中不仅新增了 Role 的概念,对于 User (用户)、 Row Policy (行级权限)、Settings Profile (配置) 和 Quota (熔断) 这些之前只能通过 XML 设置的项目,现在都已经支持 SQL 驱动式的维护(创建、修改和删除)。

当然,今天的主题是 RBAC ,所以接下来将会尝鲜这项新功能,由于是新特性,所以必须使用高版本的CH,这里我使用的是20.4.2.9。

SQL 驱动的访问控制和账户管理功能,在默认的情况下对所有用户是禁用的,所以首先我们需要开启这项功能,开启的方式分为两个步骤:

第一,在 config.xml 中添加 access_control_path 配置项

代码语言:html
复制
   <!-- config.xml -->        
   <access_control_path>/var/lib/clickhouse/access/</access_control_path>

通过 SQL 形式创建的用户、角色等信息将以文件的形式被保存在这个目录。

在添加此配置后需要重启服务,重启之后,在指定目录下会生成一系列存储文件:

代码语言:shell
复制
[root@ch7 ~]# cd /var/lib/clickhouse/access
[root@ch7 access]# ll
total 40
-rw-r-----. 1 clickhouse clickhouse   1 May 15 20:27 quotas.list
-rw-r-----. 1 clickhouse clickhouse   1 May 15 20:27 roles.list
-rw-r-----. 1 clickhouse clickhouse   1 May 15 20:27 row_policies.list
-rw-r-----. 1 clickhouse clickhouse   1 May 15 20:27 settings_profiles.list
-rw-r-----. 1 clickhouse clickhouse   1 May 15 20:39 users.list

第二,在 user.xml 中为默认用户 default 添加 access_management 配置项

代码语言:html
复制
<!-- user.xml  -->
     <users>
        <!-- If user name was not specified, 'default' user is used. -->
        <default>
           <password></password>
           <access_management>1</access_management>
           ...

至此,SQL 驱动的访问控制和账户管理功能就开启了。

default 作为默认用户,默认拥有所有的权限,我们应该将它当做 super admin 使用。

所以一般我们会使用 default 用户创建另外一批 admin 用户,用于日常管理,例如:

代码语言:sql
复制
ch7.nauu.com :) CREATE USER admin IDENTIFIED WITH PLAINTEXT_PASSWORD BY '123'
CREATE USER admin IDENTIFIED WITH plaintext_password BY '123'
Ok.
0 rows in set. Elapsed: 0.004 sec. 

然后为 admin 用户 赋 *.* 权限:

代码语言:sql
复制
ch7.nauu.com :) GRANT ALL ON *.* TO admin WITH GRANT OPTION
GRANT ALL ON *.* TO admin WITH GRANT OPTION
Ok.
0 rows in set. Elapsed: 0.003 sec.

现在使用 admin 用户,创建一个测试用户 test1

首先登录 admin 用户:

代码语言:shell
复制
[root@ch7 ~]# clickhouse-client -h ch7.nauu.com -u admin --password 123
ClickHouse client version 20.4.2.9 (official build).
Connecting to ch7.nauu.com:9000 as user admin.
Connected to ClickHouse server version 20.4.2 revision 54434.
ch7.nauu.com :)  

创建 test1 用户:

代码语言:sql
复制
ch7.nauu.com :)  CREATE USER test1
CREATE USER test1
Ok.
0 rows in set. Elapsed: 0.001 sec. 

铺垫了那么多前戏,终于轮到正主登场了,咱们的赋权。

ClickHouse 目前提供了 SELECTINSERTALTERCREATE 等十多个分类,共计数十项权限功能 (Privileges),详细列表可以参阅官方文档:

https://clickhouse.tech/docs/en/sql-reference/statements/grant/#grant-privileges

赋权的完整语法如下所示:

代码语言:sql
复制
GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION]

注意哦,CH 的权限是可以设置到 table 级别的,现在我们测试一下:

代码语言:sql
复制
ch7.nauu.com :) GRANT SELECT(WatchID,JavaEnable) ON hits_v1 TO test1 WITH GRANT OPTION
GRANT SELECT(JavaEnable, WatchID) ON hits_v1 TO test1 WITH GRANT OPTION
Ok.
0 rows in set. Elapsed: 0.012 sec.

为 test1 用户设置 SELECT 查询权限,并且只能查询 hits_v1 的

JavaEnable 和 WatchID 两列。

现在看看权限效果,切换到 test1 用户,尝试查询 * 所有列:

代码语言:sql
复制
ch7.nauu.com :) select * from hits_v1
SELECT *FROM hits_v1
Received exception from server (version 20.4.2):Code: 497. DB::Exception: Received from ch7.nauu.com:9000. DB::Exception: test1: Not enough privileges. To execute this query it's necessary to have the grant SELECT(WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, ClientIP6, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, URLDomain, RefererDomain, Refresh, IsRobot, RefererCategories, URLCategories, URLRegions, RefererRegions, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, UTCEventTime, Age, Sex, Income, Interests, Robotness, GeneralInterests, RemoteIP, RemoteIP6, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, RedirectTiming, DOMInteractiveTiming, DOMContentLoadedTiming, DOMCompleteTiming, LoadEventStartTiming, LoadEventEndTiming, NSToDOMContentLoadedTiming, FirstPaintTiming, RedirectCount, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, GoalsReached, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID, YCLID, ShareService, ShareURL, ShareTitle, `ParsedParams.Key1`, `ParsedParams.Key2`, `ParsedParams.Key3`, `ParsedParams.Key4`, `ParsedParams.Key5`, `ParsedParams.ValueDouble`, IslandID, RequestNum, RequestTry) ON default.hits_v1.
0 rows in set. Elapsed: 0.005 sec.

可以看到权限已经生效,提示没有足够的权限。

现在查询 JavaEnable 列字段:

代码语言:sql
复制
ch7.nauu.com :) select WatchID from hits_v1 limit 3;

SELECT WatchID
FROM hits_v1
LIMIT 3

┌─────────────WatchID─┐
│ 9023833769755460183 │
│ 7412848916899250789 │
│ 7839860753624947270 │
└─────────────────────┘

3 rows in set. Elapsed: 0.011 sec.

结果如愿返回。

除了直接为用户赋权之外,还能以 Role 角色的形式分派。角色本质上是 权限(Privileges) 和 配置 (Settings and constraints)的集合。

例如创建一个角色 dev :

代码语言:sql
复制
ch7.nauu.com :) CREATE ROLE dev
CREATE ROLE dev
Ok.
0 rows in set. Elapsed: 0.007 sec.

然后为 dev 赋权:

代码语言:sql
复制
ch7.nauu.com :) GRANT SELECT ON db.* TO dev
GRANT SELECT ON db.* TO dev
Ok.
0 rows in set. Elapsed: 0.003 sec.

那么,在创建用户的时候,可以直接为用户指定角色:

代码语言:sql
复制
CREATE USER test2 DEFAULT ROLE dev

或者为已有用户指定角色:

代码语言:sql
复制
ALTER USER user DEFAULT ROLE role1,role2

亦或是直接设置全局默认角色:

代码语言:sql
复制
SET DEFAULT ROLE {NONE | role [,...] | ALL | ALL EXCEPT role [,...]} TO {user|CURRENT_USER} [,...]

好了,现在总结一下

  1. 在新版本中,CH进一步完善了它的权限体系,功能颇为强大
  2. 基于 SQL 驱动的访问控制和账户管理功能,使得 CH ”更像一款数据库“

由于篇幅有限,本文也只是抛砖引玉,CH 目前提供的相关设置项颇多,具体可以查阅 https://clickhouse.tech/docs/en/operations/access-rights/ 进一步了解。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ClickHouse的秘密基地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档