1 背景
在真实业务场景中,相关业务开发团队则往往需要针对公司安全部门需求,自行实行并维护一套加解密系统,而当脱敏场景发生改变时,自行维护的脱敏系统往往又面临着重构或修改风险。此外,对于已经上线的业务,如何在不修改业务逻辑、业务 SQL 的情况下,透明化、安全低风险地实现无缝进行脱敏改造呢?
Apache ShardingSphere 根据业界对脱敏的需求及业务改造痛点,提供了一套完整、安全、透明化、低改造成本的数据脱敏整合解决方案。
2 前序
Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。它们均能够提供标准化的数据分片、分布式事务和分布式治理功能,可适用于如 Java 同构、异构语言、容器、云原生等各种多样化的应用场景。
数据脱敏模块属于 ShardingSphere 分布式治理这一核心功能下的子功能模块。它通过对用户输入的 SQL 进行解析,并依据用户提供的脱敏配置对 SQL 进行改写,从而实现对原文数据进行加密,并将原文数据(可选)及密文数据同时存储到底层数据库。在用户查询数据时,它又从数据库中取出密文数据,并对其解密,最终将解密后的原始数据返回给用户。Apache ShardingSphere 分布式数据库中间件自动化 &透明化了数据脱敏过程,让用户无需关注数据脱敏的实现细节,像使用普通数据那样使用脱敏数据。此外,无论是已在线业务进行脱敏改造,还是新上线业务使用脱敏功能,ShardingSphere 都可以提供一套相对完善的解决方案。
3 需求场景分析
对于数据脱敏的需求,在现实的业务场景中一般分为两种情况
:1、新业务上线,安全部门规定需将涉及用户敏感信息,例如银行、手机号码等进行加密后存储到数据库,在使用的时候再进行解密处理。因为是全新系统,因而没有存量数据清洗问题,所以实现相对简单。
2、已上线业务,之前一直将明文存储在数据库中。相关部门突然需要对已上线业务进行脱敏整改。这种场景一般需要处理三个问题:
历史数据需要如何进行脱敏处理,即洗数。
如何能在不改动业务SQL和逻辑情况下,将新增数据进行脱敏处理,并存储到数据库;在使用时,再进行解密取出。
如何较为安全、无缝、透明化地实现业务系统在明文与密文数据间的迁移。
4 脱敏流程详解
1、整体架构
ShardingSphere 提供的 Encrypt-JDBC 和业务代码部署在一起。业务方需面向 Encrypt-JDBC 进行 JDBC 编程。由于 Encrypt-JDBC 实现所有 JDBC 标准接口,业务代码无需做额外改造即可兼容使用。此时,业务代码所有与数据库的交互行为交由 Encrypt-JDBC 负责。业务只需提供脱敏规则即可。作为业务代码与底层数据库中间的桥梁,Encrypt-JDBC 便可拦截用户行为,并在改造行为后与数据库交互。
Encrypt-JDBC 将用户发起的 SQL 进行拦截,并通过 SQL 语法解析器进行解析、理解 SQL 行为,再依据用户传入的脱敏规则,找出需要脱敏的字段和所使用的加解密器对目标字段进行加解密处理后,再与底层数据库进行交互。ShardingSphere 会将用户请求的明文进行加密后存储到底层数据库;并在用户查询时,将密文从数据库中取出进行解密后返回给终端用户。ShardingSphere 通过屏蔽对数据的脱敏处理,使用户无需感知解析 SQL、数据加密、数据解密的处理过程,就像在使用普通数据一样使用脱敏数据。
2、脱敏规则
在详解整套流程之前,我们需要先了解下脱敏规则与配置,这是认识整套流程的基础。脱敏配置主要分为四部分:数据源配置,加密器配置,脱敏表配置以及查询属性配置,其详情如下图所示:
数据源配置:是指DataSource的配置。
加密器配置:是指使用什么加密策略进行加解密。目前ShardingSphere内置了两种加解密策略:AES/MD5。用户还可以通过实现ShardingSphere提供的接口,自行实现一套加解密算法。
脱敏表配置:用于告诉ShardingSphere数据表里哪个列用于存储密文数据(cipherColumn)、哪个列用于存储明文数据(plainColumn)以及用户想使用哪个列进行SQL编写(logicColumn)。
查询属性的配置:当底层数据库表里同时存储了明文数据、密文数据后,该属性开关用于决定是直接查询数据库表里的明文数据进行返回,还是查询密文数据通过Encrypt-JDBC解密后返回。
如何理解用户想使用哪个列进行SQL编写(logicColumn)?
我们可以从Encrypt-JDBC存在的意义来理解。Encrypt-JDBC最终目的是希望屏蔽底层对数据的脱敏处理,也就是说不希望用户知道数据是如何被加解密的、如何将明文数据存储到plainColumn,将密文数据存储到cipherColumn。换句话说,不希望用户知道plainColumn和cipherColumn的存在和使用。所以,需要给用户提供一个概念意义上的列,这个列可以脱离底层数据库的真实列,它可以是数据库表里的一个真实列,也可以不是,从而使得用户可以随意改变底层数据库的plainColumn和cipherColumn的列名。或者删除plainColumn,选择永远不再存储明文,只存储密文。只要用户的SQL面向这个逻辑列进行编写,并在脱敏规则里给出logicColumn和plainColumn、cipherColumn之间正确的映射关系即可。
为什么要这么做呢?答案在文章后面,即为了让已上线的业务能无缝、透明、安全地进行数据脱敏迁移。
3、脱敏处理过程
举个栗子,假如数据库里有一张表叫做 t_user,这张表里实际有两个字段 pwd_plain,用于存放明文数据、pwd_cipher,用于存放密文数据,同时定义 logicColumn 为 pwd。那么,用户在编写 SQL 时应该面向 logicColumn 进行编写,即 INSERT INTO t_user SET pwd = ‘123’。
ShardingSphere 接收到该 SQL,通过用户提供的脱敏配置,发现 pwd 是 logicColumn,于是便对逻辑列及其对应的明文数据进行脱敏处理。可以看出 ShardingSphere 将面向用户的逻辑列与面向底层数据库的明文列和密文列进行了列名以及数据的脱敏映射转换。如下图所示:
这也正是 Encrypt-JDBC 核心意义所在,即依据用户提供的脱敏规则,将用户 SQL 与底层数据表结构割裂开来,使得用户的 SQL 编写不再依赖于真实的数据库表结构。而用户与底层数据库之间的衔接、映射、转换交由 ShardingSphere 进行处理。为什么我们要这么做?还是那句话:为了让已上线的业务能无缝、透明、安全地进行数据脱敏迁移。
为了让读者更清晰了解到 Encrypt-JDBC 的核心处理流程,下方图片展示了使用 Encrypt-JDBC 进行增删改查时,其中的处理流程和转换逻辑,如下图所示。
5 写在最后
Apache ShardingSphere 针对新业务上线、旧业务改造分别提供了相应的全套脱敏解决方案。由于篇幅所限,本次分享仅将实现原理和设计思想进行了解读。如何将脱敏规则、脱敏处理流程与真实业务场景相结合呢?请期待下周的 Apache ShardingSphere 数据脱敏全解决方案详解(下)!
欢迎大家在官网了解更多内容,在 gitHub 关注我们☺!
官网&gitHub
评论