HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

Apache ShardingSphere 数据脱敏全解决方案详解 (下)

  • 2020-03-22
  • 本文字数:4079 字

    阅读完需:约 13 分钟

Apache ShardingSphere数据脱敏全解决方案详解(下)

1 解决方案详解

在了解了 ShardingSphere 脱敏处理流程后,即可将脱敏配置、脱敏处理流程与实际场景进行结合。所有的设计开发都是为了解决业务场景遇到的痛点。那么面对之前提到的业务场景需求,又应该如何使用 ShardingSphere 这把利器来满足业务需求呢?


1、新上线业务


  • 业务场景分析:新上线业务由于一切从零开始,不存在历史数据清洗问题,所以相对简单。

  • 解决方案说明:选择合适的加密器,如 AES 后,只需配置逻辑列(面向用户编写 SQL)和密文列(数据表存密文数据)即可,逻辑列和密文列可以相同也可以不同。建议配置如下(Yaml 格式展示):


encryptRule:  encryptors:    aes_encryptor:      type: aes      props:        aes.key.value: 123456abc  tables:    t_user:      columns:        pwd:          cipherColumn: pwd          encryptor: aes_encryptor
复制代码


使用这套配置,Encrypt-JDBC 只需将 logicColumn 和 cipherColumn 进行转换,底层数据表不存储明文,只存储了密文,这也是安全审计部分的要求所在。如果用户希望将明文、密文一同存储到数据库,只需添加 plainColumn 配置即可。整体处理流程如下图所示:



2、已上线业务改造


  • 业务场景分析:由于业务已经在线上运行,数据库里必然存有大量明文历史数据。现在的问题是如何让历史数据得以加密清洗、如何让增量数据得以加密处理、如何让业务在新旧两套数据系统之间进行无缝、透明化迁移。

  • 解决方案说明:在提供解决方案之前,我们先来头脑风暴一下:首先,既然是旧业务需要进行脱敏改造,那一定存储了非常重要且敏感的信息。这些信息含金量高且业务相对基础重要。如果搞错了,整个团队 KPI 就再见了。所以不可能一上来就停业务,禁止新数据写入,再找个加密器把历史数据全部加密清洗,再把之前重构的代码部署上线,使其能把存量和增量数据进行在线加密解密。如此简单粗暴的方式,按照历史经验来谈,一定凉凉。


那么另一种相对安全的做法是:重新搭建一套和生产环境一模一样的预发环境,然后通过相关迁移洗数工具把生产环境的存量原文数据加密后存储到预发环境,而新增数据则通过例如 MySQL 主从复制及业务方自行开发的工具加密后存储到预发环境的数据库里,再把重构后可以进行加解密的代码部署到预发环境。这样生产环境是一套 以明文为核心的查询修改 的环境;预发环境是一套 以密文为核心加解密查询修改 的环境。在对比一段时间无误后,可以夜间操作将生产流量切到预发环境中。此方案相对安全可靠,只是时间、人力、资金、成本较高,主要包括:预发环境搭建、生产代码整改、相关辅助工具开发等。除非无路可走,否则业务开发人员一般是从入门到放弃。


业务开发人员最希望的做法是:减少资金费用的承担、最好不要修改业务代码、能够安全平滑迁移系统。于是,ShardingSphere 的脱敏功能模块便应用而生。可分为三步进行:


3、系统迁移前


假设系统需要对 t_user 的 pwd 字段进行脱敏处理,业务方使用 Encrypt-JDBC 来代替标准化的 JDBC 接口,此举基本不需要额外改造(我们还提供了 SpringBoot,SpringNameSpace,Yaml 等接入方式,满足不同业务方需求)。另外,提供一套脱敏配置规则,如下所示:


encryptRule:  encryptors:    aes_encryptor:      type: aes      props:        aes.key.value: 123456abc  tables:    t_user:      columns:        pwd:          plainColumn: pwd          cipherColumn: pwd_cipher          encryptor: aes_encryptorprops:    query.with.cipher.column: false
复制代码


依据上述脱敏规则可知,首先需要在数据库表 t_user 里新增一个字段叫做 pwd_cipher,即 cipherColumn,用于存放密文数据,同时我们把 plainColumn 设置为 pwd,用于存放明文数据,而把 logicColumn 也设置为 pwd。由于之前的代码 SQL 就是使用 pwd 进行编写,即面向逻辑列进行 SQL 编写,所以业务代码无需改动。通过 Encrypt-JDBC,针对新增的数据,会把明文写到 pwd 列,并同时把明文进行加密存储到 pwd_cipher 列。此时,由于 query.with.cipher.column 设置为 false,对业务应用来说,依旧使用 pwd 这一明文列进行查询存储,却在底层数据库表 pwd_cipher 上额外存储了新增数据的密文数据,其处理流程如下图所示:



新增数据在插入时,就通过 Encrypt-JDBC 加密为密文数据,并被存储到了 cipherColumn。而现在就需要处理历史明文存量数据。由于 Apache ShardingSphere 目前并未提供相关迁移洗数工具,此时需要业务方自行将 pwd 中的明文数据进行加密处理存储到 pwd_cipher


4、系统迁移中


新增的数据已被 Encrypt-JDBC 将密文存储到密文列,明文存储到明文列;历史数据被业务方自行加密清洗后,将密文也存储到密文列。也就是说现在的数据库里即存放着明文也存放着密文,只是由于配置项中的


query.with.cipher.column=false,所以密文一直没有被使用过。现在我们为了让系统能切到密文数据进行查询,需要将脱敏配置中的 query.with.cipher.column 设置为 true。在重启系统后,我们发现系统业务一切正常,但是 Encrypt-JDBC 已经开始从数据库里取出密文列的数据,解密后返回给用户;而对于用户的增删改需求,则依旧会把原文数据存储到明文列,加密后密文数据存储到密文列。


虽然现在业务系统通过将密文列的数据取出,解密后返回;但是,在存储的时候仍旧会存一份原文数据到明文列,这是为什么呢?答案是:为了能够进行系统回滚。因为只要密文和明文永远同时存在,我们就可以通过开关项配置自由将业务查询切换到 cipherColumn 或 plainColumn。也就是说,如果将系统切到密文列进行查询时,发现系统报错,需要回滚。那么只需将 query.with.cipher.column=false,Encrypt-JDBC 将会还原,即又重新开始使用 plainColumn 进行查询。处理流程如下图所示:



5、系统迁移后


由于安全审计部门要求,业务系统一般不可能让数据库的明文列和密文列永久同步保留,我们需要在系统稳定后将明文列数据删除。即我们需要在系统迁移后将 plainColumn,即 pwd 进行删除。那问题来了,现在业务代码都是面向 pwd 进行编写 SQL 的,把底层数据表中的存放明文的 pwd 删除了,换用 pwd_cipher 进行解密得到原文数据,那岂不是意味着业务方需要整改所有 SQL,从而不使用即将要被删除的 pwd 列?还记得我们 Encrypt-JDBC 的核心意义所在吗?


这也正是 Encrypt-JDBC 核心意义所在,即依据用户提供的脱敏规则,将用户 SQL 与底层数据库表结构割裂开来,使得用户的 SQL 编写不再依赖于真实的数据库表结构。而用户与底层数据库之间的衔接、映射、转换交由 ShardingSphere 进行处理。


是的,因为有 logicColumn 存在,用户的编写 SQL 都面向这个虚拟列,Encrypt-JDBC 就可以把这个逻辑列和底层数据表中的密文列进行映射转换。于是迁移后的脱敏配置即为:


encryptRule:  encryptors:    aes_encryptor:      type: aes      props:        aes.key.value: 123456abc  tables:    t_user:      columns:        pwd: # pwd与pwd_cipher的转换映射          cipherColumn: pwd_cipher          encryptor: aes_encryptor props:    query.with.cipher.column: true
复制代码


其处理流程如下



至此,已在线业务脱敏整改解决方案全部叙述完毕。我们提供了 Java、Yaml、SpringBoot、SpringNameSpace 多种方式供用户选择接入,力求满足业务不同的接入需求。该解决方案目前已在京东数科不断落地上线,提供对内基础服务支撑。

2 中间件脱敏服务优势

  1. 自动化 &透明化数据脱敏过程,用户无需关注脱敏中间实现细节。

  2. 提供多种内置、第三方(AKS)的脱敏策略,用户仅需简单配置即可使用。

  3. 提供脱敏策略 API 接口,用户可实现接口,从而使用自定义脱敏策略进行数据脱敏。

  4. 支持切换不同的脱敏策略。

  5. 针对已上线业务,可实现明文数据与密文数据同步存储,并通过配置决定使用明文列还是密文列进行查询。可实现在不改变业务查询 SQL 前提下,已上线系统对加密前后数据进行安全、透明化迁移。

3 适用场景说明

  1. 用户项目使用 Java 语言进行编程。

  2. 后端数据库为 MySQL、Oracle、PostgreSQL、SQLServer。

  3. 用户需要对数据库表中某个或多个列进行脱敏(数据加密 &解密)。

  4. 兼容所有常用 SQL。

4 限制条件

  1. 用户需要自行处理数据库中原始的存量数据、洗数。

  2. 使用脱敏功能+分库分表功能,部分特殊 SQL 不支持,请参考 SQL 使用规范。

  3. 脱敏字段无法支持比较操作,如:大于小于、ORDER BY、BETWEEN、LIKE 等。

  4. 脱敏字段无法支持计算操作,如:AVG、SUM 以及计算表达式。

5 后续

本篇文章介绍了如何使用 ShardingSphere 产品之一的 Encrypt-JDBC 进行接入,接入形式还可以选择使用 SpringBoot、SpringNameSpace 等,这种形态的接入端主要面向 JAVA 同构,并与业务代码共同部署在生产环境中。面向异构语言,ShardingSphere 还提供 Encrypt-Proxy 客户端。Encrypt-Proxy 是一款实现 MySQL、PostgreSQL 的二进制协议的服务器端产品,用户可独立部署 Encrypt-Proxy 服务,并且像使用普通 MySQL、PostgreSQL 数据库一样,使用例如 Navicat 第三方数据库管理工具、JAVA 连接池、命令行的方式访问这台具有脱敏功能的虚拟数据库服务器。


脱敏功能属于 Apache ShardingSphere 分布式治理的功能范畴。事实上,Apache ShardingSphere 这个生态还拥有其他更强大的能力,例如数据分片、读写分离、分布式事务、监控治理等。您甚至可以选择任意多种功能模块进行叠加使用,例如同时使用数据脱敏+数据分片,或是数据分片+读写分离,再或者是监控治理+数据分片等。除了在功能层面的叠加选择,ShardingSphere 还提供了各种接入端形式,例如 Sharding-JDBC 或 Sharding-Proxy 等以满足大家不同场景需求。

6 写在最后

ShardingSphere 从最初的仅支持分库分表功能,到现在已形成包括数据分片、分布式治理、分布式事务等核心功能为主的生态圈。这也标识着它不仅仅是一款分布式数据库中间件,不仅仅拥有分库分表的能力,更是形成以数据分片、分布式治理、分布式事务为核心的全方位解决方案生态体系,欢迎大家在官网了解更多内容,在 gitHub 关注我们☺!


官网 &gitHub

https://shardingsphere.apache.org

https://github.com/apache/incubator-shardingsphere


2020-03-22 21:051115

评论

发布
暂无评论
发现更多内容

学会PCB通用布局规则,复杂设计也能轻松搞定!

华秋电子

PCB

2023年,小游戏分发平台的机遇与挑战

没有用户名丶

混合应用前端框架HybridApp篇

没有用户名丶

视频剪辑中花式抠图的代码实操与案例详述

阿里云视频云

云计算 阿里云

一见“氢”心-康士柏氢能产业链蓄力待发

Geek_2d6073

「程序员转型技术管理」必修的 10 个能力提升方向

LigaAI

开发者 技术管理 经验总结 技术领导力 企业号9月PK榜

Databend 数据集成方案 | Data Infra 第 15 期

Databend

蓝易云:当云服务器频繁被暴力破解时的防护措施有哪些?

百度搜索:蓝易云

云计算 Linux 运维 云服务器 ECS

HBuilder开发者必备!Windows上传IPA文件的软件分享

一种基于动态代理的通用研发提效解决方案

阿里技术

亚信安慧荣膺“信创工委会技术活动单位”

亚信AntDB数据库

AntDB 国产数据库 AntDB数据库

文盘Rust——子命令提示,提高用户体验 | 京东云技术团队

京东科技开发者

rust cli 企业号9月PK榜 领域交互

Mac端电脑风扇控制 Macs Fan Control Pro激活中文版

mac大玩家j

电脑风扇控制软件 风扇转速控制 好用的电脑风扇软件

谈谈JSF业务线程池的大小配置 | 京东物流技术团队

京东科技开发者

测试 测试用例 jsf 企业号9月PK榜

头部媒体经观传媒传依托博睿数据,将故障排查效率提升60%

博睿数据

可观测性 博睿数据

HBuilder开发者必备!Windows上传IPA文件的软件分享

雪奈椰子

百度输入法全面升级,打造首个基于大模型的输入法原生应用

彭飞

小红书广告智能创意能力构建过程详解

小红书技术REDtech

人工智能 小红书

可观测性在灰度发布中的应用

观测云

微服务 性能优化 链路

球场LED显示屏应具备什么特点

Dylan

广告 足球 LED LED display LED显示屏

多重安全防护加持,华为云828营销季为中小企业构建上云安全感

平平无奇爱好科技

七种 BeanDefinition,各显其能!

江南一点雨

Java spring

mac电脑录屏截图标注首选 CleanShot X 最新激活版

胖墩儿不胖y

Mac软件 截图软件 截图工具 屏幕截图软件

时序数据库 TDengine 官网全新上线,四大亮点抢先看

TDengine

tdengine 时序数据库 工业互联网

蓝易云:RabbitMQ安装、端口修改、基本操作详解!

百度搜索:蓝易云

云计算 Linux 运维 RabbitMQ 云服务器

智慧火力发电厂数字孪生3D可视化平台

2D3D前端可视化开发

智慧电厂 智慧火电厂 智慧火力发电厂 数字孪生火电厂 火电厂三维可视化

从“13天”到“0天”延时,揭秘幸福里离线SLA保障最佳实践

字节跳动数据平台

大数据 数据中台 数据治理 数据安全 企业号9月PK榜

接网线怎么保留了568B线序

小齐写代码

WorkPlus Meet | 私有化部署视频会议系统,实现安全高效跨屏协作的利器

WorkPlus

从软件工程师角度聊聊 Kubernetes

SEAL安全

容器 k8s 解决方案 kubernetes 运维 企业号9月PK榜

弹性数据库连接池探活策略调研(三)——DBCP | 京东云技术团队

京东科技开发者

数据库 数据库连接池 企业号9月PK榜 DBCP

Apache ShardingSphere数据脱敏全解决方案详解(下)_文化 & 方法_京东数字科技产业AI中心_InfoQ精选文章