【数据中台建设系列之五】数据中台-数据权限
数据安全是数据中台建设的一个核心功能,本篇文章将主要介绍数据安全中的一个重要模块—数据权限,包含数据行级权限和列级权限的一些设计思路,如果你也正在调研数据权限或者有这个计划,相信本篇文章一定能给你带来不一样的灵感。
数据权限是指用户能够访问和操作的数据资产,例如某个具体的数据表、数据字段等。数据权限确保了数据资产的安全性和合规性,通过数据权限管理,可以更好地控制用户对数据资产的访问和操作,提高数据中台的价值。
数据权限主要包含数据的行级权限和列级权限。通过构建数据的行级权限,不同⽤⼾访问同⼀个数据模型时,由于权限规则不同,获取到的数据集也不同,⾏权限限定的是⼀个范围。而列级权限,主要是对数据中某一个字段进行隐藏或者做不可见处理,从而达到数据隔离或者脱敏目的,列级权限限定的是一个状态。
数据权限主要包含应用层、服务层和执行层三大块。如下图中的所示:
其核心思想是所有的行列权限都作用在一个具体的数据服务API接口或者一个BI报表的模型上(再具体点就是一个SQL上),然后对查看该报表或者调用该数据服务API接口的业务人员配置对应的行级和列级权限,这样就达到了同一个报表或API接口在面对不同人员调用时,看到的数据是不一致的,从而实现了数据行列权限的控制。
包含页面权限配置规则及业务方调用数据服务API接口等(在数据服务篇介绍过,所有的业务方不允许直连数仓);
所有请求底层数仓数据的SQL,都会被数据权限服务拦截,通过权限校验和SQL拦截对原始SQL进行改写;
基于Apache Doris构建的实时数仓作为执行层,就是执行已经经过数据权限服务修改过后的SQL语句,将执行结果返回给应用方;
在数据权限中,将用户划分为三个层级:白名单用户、规则用户和其他用户。
⽩名单⽤⼾是指对规则不⽣效的⽤⼾,它的优先级最⾼。如果⼀个⽤⼾既是规则⽤⼾,⼜是⽩名单⽤⼾,那么他在做权限判定时,会优先判定为⽩名单⽤⼾,⽩名单⽤⼾可以访问该数据集下的所有数据,对规则不⽣效。
该数据集(同一个SQL)下所有规则中包含的⽤⼾。如果该⽤⼾不是⽩名单⽤⼾,那么就按照他⽬前拥有的权限规则进⾏校验。
其他⽤⼾是指除了⽩名单⽤⼾和规则⽤⼾以外的所有⽤⼾。这部分⽤⼾拥有两个权限属性:拥有所有权限和⽆任何权限。拥有所有权限就是值这部分其他用户可以查看该数据集下的所有数据,不受规则约束,无任何权限就是纸面意思,没有查看该数据集数据的任务权限。
行级权限在SQL语句中,我们可以理解为就是增加一个WHERE
条件。具体的配置页面设计如下:
赋权对象:这个可以根据公司实际场景来,可以是人员角色,也可以是人员部门等。
赋权规则:规则深度可以限定为三层(按实际需求来),但三层的关系只能是 且-或-且
或者或-且-或
这两种方式,这个和SQL中的WHERE
条件拼接相关。
在编辑条件栏中可以添加每个具体的规则,这里需要注意的一点就是,所有的筛选字段只能是数据集模型中的字段(也就是SELECT后面的字段)。目前对字段的过滤有三种方式:枚举筛选,标签筛选和条件筛选。
就是对具体字段枚举出固定的几个值,用户只能访问这几个值相关的数据;
定义一组标签,用户与标签形成关系,每个用户对同一个标签都有不同的值,这个也相当于是枚举;
定义了许多过滤方式,比如: 包含,开头是,结尾是,大于,等于,小于等;
以上就是一个数据集的行级权限的设计方式和配置流程,下来给大家简单展示两个效果:
我们首先定义一个数据集DATASET-A
标准SQL : "SELECT xxx FROM xxx "。
某用户只能查看DATASET-A
数据集中数据库id
字段为"2,3,4"的数据,规则配置如下:
经过数据权限拦截改写之后,实际查询数仓的SQL变为如下:
SELECT xxx
FROM
(SELECT xxx
FROM xxx) _D_S_A_
WHERE _D_S_A_.`db_id` IN (2, 3, 4)
某用户可以查看DATASET-A
数据集中数据库id
字段为"2,3,4"的数据,还可以查看引擎 = "doris"
或者创建时间> "2021-11-01"
的数据,规则配置如下:
经过数据权限拦截改写之后,实际查询数仓的SQL变为如下:
SELECT xxx
FROM
(SELECT xxx
FROM xxx) _D_S_A_
WHERE _D_S_A_.`db_id` IN (2, 3, 4)
AND (_D_S_A_.`engine` = 'Doris'
OR _D_S_A_.`create_time` > '2021-11-01')
通过以上这两个例子,相信大家对数据的行级权限有了一定了解了,接下来,我们继续看数据的列级权限。
在上文我们已经说过了,列级权限是字段的一个状态,主要功能是将字段进行脱敏或置为不可见状态。列级权限中,有几个关键概念:
和行级权限是一样的道理,如果是白名单用户,所有的列级规则都不生效,可以访问所有字段。
是指当前用户对这个数据集所有字段中未设定规则的字段,目前对其他字段有"禁止查看"和"允许查看"两个权限配置。
举个例子:
数据集A有"name,age ,phone,address"4个字段,如果管理员对张三设置了对数据集A中的"phone"字段脱敏规则,那除了phone字段以外的"name,age,address"都属于其他字段,此时:
如果将其他字段设置为禁止查看,那么张三就只能查看数据集A中的"phone"字段,同时给字段还是脱敏状态;
如果将其他字段设置为允许查看,那么张三可以看到数据集A下的所有字段内容,但"phone"字段是脱敏状态;
这个地方稍微有点绕,可以好好理解一下。
如下图所示可以添加一个列级规则:
从图中,我们可以看到列级规则包含禁止查看和数据脱敏两个选项,那该规则如何生效?这块列举出4种生效方式:
生效方式 | 说明 |
---|---|
所有人生效 | 指该条列规则对所有⼈⽣效 |
所有人不生效 | 该条列规则对所有⼈不⽣效 |
指定人生效 | 指定⽤⼾对某个规则⽣效 |
指定人不生效 | 指定⽤⼾对某个规则不⽣效 |
脱敏选项也包含众多方式,比如:前几位脱敏,后面几位脱敏,中间几位脱敏等,这块实现思路就是通过SQL中一些字符串的操作函数进行切分替换拼接实现的。
以上就是数据权限中列级权限的一个整体配置流程和实现思路,接下来我们一起看看这个例子:
数据集DATASET-A
标准SQL : "SELECT xxx FROM xxx ",用户张三的列级权限规则为:
<u>对"chinese_name"字段进行中间3位脱敏,对"charge_person" 字段进行脱敏,对"engine"的后三位脱敏</u>
经过数据权限拦截改写之后,实际查询数仓的SQL变为如下:
SELECT
_D_S_A_.`tbl_desc` AS `tbl_desc`,
_D_S_A_.`tbl_typ e` AS `tbl_type`,
CONCAT(SUBSTR(`engine`, 1, 3), '***') AS `engine`,
_D_S_A_.`create_time` AS `create_time`,
_D_S_A_.`create_table_sql` AS `create_table_sql`,
CONCAT(SUBSTR( `charge_person`, 1, 1), '**') AS `charge_person`,
CASE
WHEN CHAR_LENGTH(`chinese_name`) <= 3 THEN '***'
ELSE REPLACE(`chinese_name`, SUBSTR(`chinese_name`, 3, CHAR_LENGTH(`chinese_name`)-3), '***')
END AS `chinese_name`,
_D_S_A_.`sec urity_level` AS `security_level`,
_D_S_A_.`create_time` AS `create_time`,
_D_S_A_.`expression_add_field2` AS `expression_add_field2`
FROM
(
SELECT
xxx
FROM
xxx ) _D_S_A_
本数据权限系统已经在企业内部广泛应用,目前数据权限配置已超千人,包括数据服务,BI报表等其他项目,经受住了各种业务场景的考验,该系统已稳定运行2年之久,是一个经过时间沉淀的系统。在数据中台建设中,数据权限建设是非常重要的一环,本篇文章详细介绍了整体设计思路和配置流程,希望对大家有一定的借鉴帮助。
我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。