数据脱敏背景及介绍git
1.1数据库脱敏背景github
伴随着互联网大数据、云服务等新兴技术的飞速发展和普及,业务上云、数据集中存储、数据共享等数据应用方式已成为将来发展的趋势,云数据库和云计算服务具备易部署、低成本、高效率、高可靠的优点,使得愈来愈多的消费者更倾向于将我的数据存储在云上而非我的移动硬盘中。实际上,因为数据使用场景越发复杂,我的隐私数据泄露、被窃取的风险愈来愈高,仅近年来就发生数起重大数据库信息泄露事件,这对数据库安全提出了更高的要求。sql
数据脱敏,顾名思义就是将敏感数据经过变形、屏蔽等方式处理,其目的是保护隐私数据信息,防止数据泄露和恶意窥探。当企业或者机构收集用户我的身份数据、手机、银行卡号等敏感信息,而后将数据经过导出(非生产环境)或直接查询(结合生产环境)的方式投入使用时,按照隐私保护相关法律法规需将数据进行“脱敏”处理。数据库
1.2 数据脱敏介绍安全
数据脱敏主要分为静态脱敏和动态脱敏,静态数据脱敏(Static Data Masking)采用“先脱敏-后分发”的方式,通常是将生产环境数据拷贝到测试或开发库中,导出后的数据已经改变了原始数据的内容,使得脱敏后的数据成为了测试开发源数据。而动态数据脱敏(Dynamic Data Masking)是与生产环境紧密关联的,访问敏感数据时实时地进行脱敏,主要用于直接访问生产数据的场景,在屏蔽敏感信息的同时也保证了源数据的一致性和有效性。微信

图1:静态脱敏与动态脱敏架构
动态数据脱敏和静态数据脱敏适用于不一样的场景,二者之间没有优劣之分,主要是以使用场景来选择合适的脱敏模式。openGauss最新版本已正式对外支持动态数据脱敏特性,下面的章节将围绕openGauss动态数据脱敏机制进行阐述。运维
目前主流的动态数据脱敏技术路线分为“结果集解析”和“语句改写”两条路径:dom
结果集解析:不改写发给数据库的语句,须要提早获悉数据表结构,待数据库返回结果后再根据表结构判断集合内哪些数据须要脱敏,并逐条改写结果数据。svg
语句改写:将包含敏感字段查询的语句改写,对于查询中涉及的敏感字段(表列)经过外层嵌套函数的方式改写,使得数据库运行查询语句时返回不包含敏感数据的结果集。
从性能上来讲,结果集解析方法须要在数据库返回结果集后再逐行字段解析、规则匹配、数据脱敏,须要逐个修改结果集中每一行数据,所以脱敏耗时与结果集容量线性相关,总体性能损耗较大;而语句改写经过将较为简短的查询语句进行解析并重写的方式,对语句中的敏感列外嵌了一层脱敏函数,数据库执行命令时将自动执行脱敏函数实现数据脱敏,返回的结果集即为脱敏后的数据。该方式仅仅改写一条查询语句而不涉及结果集的解析,所以可以极大地下降性能损耗,openGauss即是采用了语句改写的方式,10万条敏感数据脱敏的性能损耗低于5%。
另外,对于比较复杂的命令,查询字段通常包含大量同名字段、表别名、嵌套查询等,基于结果集解析首先须要将结果集与真实查询列进行一一对应才可判断出该字段是否须要脱敏,查询越复杂识别难度越高,匹配的准确率就越低,而基于语句的改写可精确的对复杂查询涉及的字段嵌套脱敏函数。
综上分析,基于语句改写方法的数据脱敏不管对于性能仍是准确性来讲都是较为优秀的脱敏方案,openGauss基于语句改写思想,在查询解析获取查询树后,根据用户定义的脱敏策略识别查询树目标结点(Node),并对待脱敏结点进行改写构造“脱敏查询树”,再交由数据库内核执行最终返回脱敏后数据。
openGauss 动态数据脱敏解决方案
动态数据脱敏功能在工业界一般以中间插件或数据脱敏系统(Data Masking System)的形态加载,经过在客户端与服务端数据库之间拦截命令或结果集来实现脱敏,而openGauss内置动态数据脱敏特性,使数据库无需借助外部插件就能够实现数据脱敏,有效地下降数据中间传输而致使敏感数据泄漏的风险。
openGauss从1.1.0版本定义了一套完整的内置安全策略模型,基于该模型用户能够定义资源标签来标识敏感数据,针对不一样的资源标签类别和内容可定义相关的安全策略机制,而动态数据脱敏就是其中一种。
2.1 内置安全策略
内置安全策略(Security Policy)模型,是指经过配置一系列安全策略来对用户行为进行识别和保护,提供了包括保护用户敏感数据的能力。
资源标签(Resource Label)是Security Policy的基础,它的本质是一系列数据库资源集合。为了可以统一管理数据库资源,数据管理者能够将多个数据库资源添加到同一个资源标签下,经过对资源标签配置策略来实现批量地对数据库资源进行管理的能力。
例如,多张数据表中均包含银行卡号“creditcard”这种敏感信息列,那么能够将这些列统一地划分到资源标签“creditcard_label”中,随后管理员即可以经过对“creditcard_label”配置脱敏策略以实现对全部相关敏感列的批量配置。
动态数据脱敏策略(Dynamic Data Masking)是Security Policy模型支持的一类安全策略,数据控制者对用户表中的敏感数据识别后(敏感数据发现和识别不在该特性范围内),对包含敏感列的资源标签配置数据脱敏策略,并依据不一样的应用场景来限制用户对数据的访问行为和信息提取行为,以达到对敏感信息保护的能力。
总的来讲,资源标签是用来归类数据库资源,并将这些资源统一地投入到各类安全策略中去管理。动态数据脱敏特性即是利用资源标签去识别敏感数据,而后匹配脱敏策略,实现对敏感数据的屏蔽。
2.2 动态数据脱敏核心思路
openGauss中的动态数据脱敏是之内置安全插件(security plugin)的方式与数据库部署在一块儿的,业务方面无需额外适配就可以使用,SQL的解析与脱敏策略匹配交由openGauss安全策略模块负责,业务在配置脱敏策略后便可生效。
2.2.1 配置脱敏策略
脱敏策略的配置主要包括三个方面——脱敏方式(Masking Function)、脱敏对象(Resource Label)、用户过滤器(Masking Filter)。
脱敏方式,是指该脱敏策略使用何种方式对目标字段进行脱敏,目前openGauss预置了7种脱敏方式:creditcardmasking、 basicemailmasking、fullemailmasking、alldigitsmasking、shufflemasking、randommasking、maskall。分别适用于不一样的脱敏场景。
脱敏对象,是指脱敏策略生效时做用的对象集合(LABEL),若查询目标字段存在于LABEL中,则该字段将会根据脱敏策略进行敏感数据脱敏,须要注意的是,openGauss动态数据脱敏特性支持对仅包含数据列的LABEL进行脱敏。
用户过滤器,指出脱敏策略在何种用户场景下生效,主要涉及USER(用户名)、APP(用户登陆客户端名称)、IP(用户所处的ip)。当查询用户同时知足Masking Filter所指定的阈值时,数据脱敏策略才会生效。
如下案例演示了一个数据动态脱敏策略建立的基本过程。
1.数据准备
确认内置安全策略总开关是否开启。

准备两张包含敏感字段(creditcard、customername)的表。

2.策略配置
策略管理员(拥有poladmin权限)登陆数据库,将两张数据表的敏感字段分别添加到资源标签“creditcard_label”、“customer_label”中去管理。

策略管理员建立两个脱敏策略,其做用以下:
脱敏策略mask_card_pol:只有当用户“user1”在‘10.11.12.13’ip上使用gsql访问表时,标签creditcard_label中的列将按照‘creditcardmasking’方式脱敏。
脱敏策略mask_name_pol:默认对于全部查询用户,标签customer_label中的列将按照‘MASKALL’的方式脱敏。

2.2.2触发脱敏策略
当系统接收到查询命令时,security_plugin将在解析器中拦截语义分析生成的查询树(Query),首先根据用户登陆信息(用户名、客户端、IP)筛选出知足用户场景的脱敏策略。因为脱敏策略是基于(仅包含表列的)资源标签配置的,所以须要判断查询树的目标节点是否属于某个资源标签,而后将识别到的资源标签与脱敏策略相匹配,根据策略内容将查询树目标节点改写,最终将查询树返还给解析器。
security_plugin模块因为内置查询树脱敏方式,数据访问者不会感知内置安全策略重写查询树的过程,如同执行普通查询同样去访问数据,同时保护数据隐私。

图2:openGauss动态数据脱敏架构
基于配置脱敏策略小节举出的案例,咱们能够经过查询数据表来触发脱敏策略。
触发脱敏策略
用户user1在知足mask_card_pol策略的状况下使用gsql登陆数据查询敏感数据,系统将返回脱敏后的数据结果。而用户user2不知足该条策略,所以该用户查询的数据未作脱敏处理。

而不管对于user1仍是user2用户,他们查询order表时都会触发脱敏策略mask_name_pol,所以customername字段将会被脱敏处理。

openGauss动态数据脱敏优点
openGauss动态数据脱敏关注访问用户身份识别问题,用户过滤器(Masking Filter)的配置细化到指定用户、客户端工具、登陆IP,策略管理员能够灵活地根据不一样业务、不一样用户场景来制定不一样的脱敏策略,赋予他们不一样级别的敏感数据访问能力以适用于各类复杂的生产环境。例如金融、医疗行业中前台服务人员只容许看到身份证、银行卡号部分信息,而运维管理员则能够查询并维护全部用户信息。在保证脱敏场景多样性的前提下,指定用户过滤器时系统会进行严格的互斥校验,避免同一用户同时知足多个用户过滤器而出现策略选择的二义性。

图3:openGauss根据过滤条件脱敏
其次,openGauss动态数据脱敏更加注重数据库资源的批量管理,在安全策略模型中,将须要管控的数据库资源集中归类划分红标签,对标签的操做实际上就是对指定一簇资源的操做,极大的简化管理流程,提升管理效率。在其余数据库上的动态数据脱敏特性通常是基于单个列或单张表的,脱敏策略与数据库资源是一一对应的,即便想要采用相同的脱敏方式,不一样的数据库资源也要配置多个对应的脱敏策略,这无疑是提升了策略配置成本,增长了后期运维、批量资源策略管理的难度。所以将须要批量管理的数据库资源划分到资源标签中是openGauss动态数据脱敏的基础,也是其优点之一。

图4:openGauss资源标签批量配置策略
动态数据脱敏内置在openGauss内核中,可以在必定程度上保证数据传输路径上的安全性,而外部插件存在绕过风险:当外部插件将客户端发送的SQL或服务端返回的结果集改写后,攻击者依然能够绕过插件直接向数据库发送SQL或截取数据库返回的源数据结果集,致使脱敏插件失效。所以相较于外部插件脱敏的方式,openGauss动态数据脱敏在必定程度上也能下降传输路径上的敏感数据泄漏风险。
动态数据脱敏其目的是屏蔽结果集中的敏感数据,动态数据脱敏是与生产环境相结合,由业务方提供查询接口,再由接口触发数据脱敏,openGauss为了尽量的保证敏感数据的安全性,在绝大多数场景包括带有RETURNING的增删改、Merge into、CTE、Subquery等场景也适配了脱敏策略,这样可以丰富业务方对敏感数据的操做接口而不仅仅只能提供数据查询接口。
openGauss为了提升易用性,提供了一套简洁的策略配置语法,涵盖了资源标签以及脱敏策略的增删改,用户使用定义语法能够轻松地配置脱敏策略,简化了管理员操做流程。
openGauss 动态数据脱敏的展望
openGauss动态数据脱敏特性提供了相对简洁、灵活的策略配置方案,在必定程度上保用户隐私数据不被泄漏,是openGauss多层级安全防护架构中不可或缺的一环。
将来openGauss动态数据脱敏特性将开放更加灵活的策略配置手段包括UDF(User Defined Function)Masking以及条件脱敏(Conditional Masking)等,以期支持更加灵活、丰富的隐私保护场景。
欢迎访问openGauss官方网站

openGauss开源社区官方网站:
https://opengauss.org
openGauss组织仓库:
https://gitee.com/opengauss
openGauss镜像仓库:
https://github.com/opengauss-mirror

扫码关注咱们
微信公众号|openGauss
微信社群小助手|openGauss-bot
本文分享自微信公众号 - openGauss(openGauss)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。