初探ClickHouse的RBAC权限功能
Posted ClickHouse的秘密基地
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初探ClickHouse的RBAC权限功能相关的知识,希望对你有一定的参考价值。
最近电脑出了点问题,所以断更了一段时间,现在问题都解决了所以我也就回归啦。
在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 配置项
<!-- config.xml -->
<access_control_path>/var/lib/clickhouse/access/</access_control_path>
通过 SQL 形式创建的用户、角色等信息将以文件的形式被保存在这个目录。
在添加此配置后需要重启服务,重启之后,在指定目录下会生成一系列存储文件:
[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 配置项
<!-- 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 用户,用于日常管理,例如:
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 用户 赋 *.* 权限:
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 用户:
[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 用户:
ch7.nauu.com :) CREATE USER test1
CREATE USER test1
Ok.
0 rows in set. Elapsed: 0.001 sec.
铺垫了那么多前戏,终于轮到正主登场了,咱们的赋权。
ClickHouse 目前提供了 SELECT、INSERT、 ALTER、CREATE 等十多个分类,共计数十项权限功能 (Privileges),详细列表可以参阅官方文档:
https://clickhouse.tech/docs/en/sql-reference/statements/grant/#grant-privileges
赋权的完整语法如下所示:
GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION]
注意哦,CH 的权限是可以设置到 table 级别的,现在我们测试一下:
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 用户,尝试查询 * 所有列:
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 列字段:
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 :
ch7.nauu.com :) CREATE ROLE dev
CREATE ROLE dev
Ok.
0 rows in set. Elapsed: 0.007 sec.
然后为 dev 赋权:
ch7.nauu.com :) GRANT SELECT ON db.* TO dev
GRANT SELECT ON db.* TO dev
Ok.
0 rows in set. Elapsed: 0.003 sec.
那么,在创建用户的时候,可以直接为用户指定角色:
CREATE USER test2 DEFAULT ROLE dev
或者为已有用户指定角色:
ALTER USER user DEFAULT ROLE role1,role2
亦或是直接设置全局默认角色:
SET DEFAULT ROLE {NONE | role [,...] | ALL | ALL EXCEPT role [,...]} TO {user|CURRENT_USER} [,...]
好了,现在总结一下
在新版本中,CH进一步完善了它的权限体系,功能颇为强大
基于 SQL 驱动的访问控制和账户管理功能,使得 CH ”更像一款数据库“
由于篇幅有限,本文也只是抛砖引玉,CH 目前提供的相关设置项颇多,具体可以查阅 https://clickhouse.tech/docs/en/operations/access-rights/ 进一步了解。
如果这篇文章对你有帮助,欢迎 订阅、转发、在看 三连击 :)
以上是关于初探ClickHouse的RBAC权限功能的主要内容,如果未能解决你的问题,请参考以下文章