ShardingSphere 5.3.1 发布 | 支持动态脱敏模式、CDC 新功能上线

13a9a135b46627efb367ca462552c89b.gif

Apache ShardingSphere 于本周迎来了 5.3.1 版本的发布!该版本历时一个月,共合并了来自全球的团队和个人累计 448 个 PR。

新版本在功能、性能、测试、文档、示例等方面都进行了大量的优化。

本次 5.3.1 版本带来了如下亮点:

  • 新增脱敏功能「动态脱敏」模式及内置「脱敏算法」

  • CDC 新功能上线

新亮点介绍

新增脱敏功能动态脱敏模式及内置脱敏算法

随着《网络安全法》的颁布施行,对个人隐私数据的保护已经上升到法律层面。传统的应用系统普遍缺少对个人隐私数据的保护措施。

数据脱敏:可实现在不需要对生产数据库中的数据进行任何改变的情况下,依据用户的角色、职责和其他 IT 定义规则,对生产数据库返回的数据进行专门的屏蔽、加密、隐藏和审计,确保业务用户、外包用户、运维人员、兼职雇员、合作伙伴、数据分析、研发和测试团队及顾问能够恰如其分地访问生产环境的敏感数据。

本次发布提供了「动态脱敏模式」存储层原始数据保持不变,在计算层完成数据脱敏。脱敏规则的配置遵循 ShardingSphere 一贯的配置方式,在 Proxy 的 conf/ 目录下,修改 config-mask.yaml 文件。脱敏功能可以和加密、分片等功能同时使用。

用户首先需要在 dataSources 中指定存储单元,然后在 - !MASK 下的 tables 中配置脱敏规则。YAML 配置示例:

databaseName: mask_db

dataSources:
  ds_0:
    url: jdbc:mysql://127.0.0.1:3306/demo_ds_0?serverTimezone=UTC&useSSL=false
    username: root
    password: root
  #...

rules:
  # 脱敏规则
  - !MASK
    tables:
      t_user:
        columns:
          password:
            maskAlgorithm: md5_mask
          email:
            maskAlgorithm: mask_before_special_chars_mask
          telephone:
            maskAlgorithm: keep_first_n_last_m_mask
    
    maskAlgorithms:
      md5_mask:
        type: MD5
      mask_before_special_chars_mask:
        type: MASK_BEFORE_SPECIAL_CHARS
        props:
          special-chars: '@'
          replace-char: '*'
      keep_first_n_last_m_mask:
        type: KEEP_FIRST_N_LAST_M
        props:
          first-n: 3
          last-m: 4
          replace-char: '*'
  
  # 分片规则
  - !SHARDING
    #...

在该配置中,t_user 表的多个字段都配置了脱敏。其中密码进行 MD5 脱敏、邮件地址对用户名进行脱敏、手机号对中间 4 位进行脱敏。启动 Proxy 之后,创建 t_user 表,初始化数据之后查询到的是已脱敏的数据。测试结果示例:

mysql> INSERT INTO t_user(user_id, user_name, password, email, telephone, creation_date) values
    -> (1, 'zhangsan', '111111', 'zhangsan@gmail.com', '12345678900', '2017-08-08'),
    -> (2, 'lisi', '222222', 'lisi@gmail.com', '12345678901', '2017-08-08'),
    -> (3, 'wangwu', '333333', 'wangwu@gmail.com', '12345678902', '2017-08-08');
Query OK, 3 rows affected (0.06 sec)

mysql> SELECT * FROM t_user;
+---------+-----------+----------------------------------+--------------------+-------------+---------------+
| user_id | user_name | password                         | email              | telephone   | creation_date |
+---------+-----------+----------------------------------+--------------------+-------------+---------------+
|       2 | lisi      | e3ceb5881a0a1fdaad01296d7554868d | ****@gmail.com     | 123****8901 | 2017-08-08    |
|       1 | zhangsan  | 96e79218965eb72c92a549dd5a330112 | ********@gmail.com | 123****8900 | 2017-08-08    |
|       3 | wangwu    | 1a100d2c0dab19c4430e7d73762b3423 | ******@gmail.com   | 123****8902 | 2017-08-08    |
+---------+-----------+----------------------------------+--------------------+-------------+---------------+
3 rows in set (0.02 sec)

目前支持的脱敏算法:

脱敏算法名称

说明

MD5

基于 MD5 的数据脱敏算法

KEEP_FIRST_N_LAST_M

保留前 n 后 m 数据脱敏算法

KEEP_FROM_X_TO_Y

保留自 x 至 y 数据脱敏算法

MASK_FIRST_N_LAST_M

遮盖前 n 后 m 数据脱敏算法

MASK_FROM_X_TO_Y

遮盖自 x 至 y 数据脱敏算法

MASK_BEFORE_SPECIAL_CHARS

特殊字符前遮盖数据脱敏算法

MASK_AFTER_SPECIAL_CHARS

特殊字符后遮盖数据脱敏算法

PERSONAL_IDENTITY_NUMBER_RANDOM_REPLACE

身份证号随机替换数据脱敏算法

MILITARY_IDENTITY_NUMBER_RANDOM_REPLACE

军官证随机替换数据脱敏算法

TELEPHONE_RANDOM_REPLACE

⼿机号随机替换数据脱敏算法

💡 还有部分「新的脱敏算法」正在开发中:

💡 https://github.com/apache/shardingsphere/issues/22759

脱敏功能除了支持 YAML 静态配置,还支持 DistSQL 动态配置,这 2 种方式可以混合使用。在 YAML 配置可用的情况下:先查询当前脱敏规则、删除脱敏规则,再查询 t_user 表。由于脱敏不再生效,展示的是明文数据。

mysql> SHOW MASK RULES;
+--------+-----------+---------------------------+-----------------------------------+
| table  | column    | algorithm_type            | algorithm_props                   |
+--------+-----------+---------------------------+-----------------------------------+
| t_user | address   | MD5                       |                                   |
| t_user | email     | MASK_BEFORE_SPECIAL_CHARS | special-chars=@,replace-char=*    |
| t_user | telephone | KEEP_FIRST_N_LAST_M       | first-n=3,last-m=4,replace-char=* |
+--------+-----------+---------------------------+-----------------------------------+
3 rows in set (0.01 sec)

mysql> DROP MASK RULE t_user;
Query OK, 0 rows affected (0.02 sec)

mysql> SHOW MASK RULES;
Empty set (0.01 sec)

mysql> SELECT * FROM t_user;
+---------+-----------+----------+--------------------+-------------+---------------+
| user_id | user_name | password | email              | telephone   | creation_date |
+---------+-----------+----------+--------------------+-------------+---------------+
|       2 | lisi      | 222222   | lisi@gmail.com     | 12345678901 | 2017-08-08    |
|       1 | zhangsan  | 111111   | zhangsan@gmail.com | 12345678900 | 2017-08-08    |
|       3 | wangwu    | 333333   | wangwu@gmail.com   | 12345678902 | 2017-08-08    |
+---------+-----------+----------+--------------------+-------------+---------------+
3 rows in set (0.03 sec)

当前 t_user 表已经没有脱敏规则,通过 DistSQL 动态创建脱敏规则,查询到的脱敏规则和通过 YAML 配置完全一致,从 t_user 表查询到的数据已经脱敏。

mysql> CREATE MASK RULE t_user (
    -> COLUMNS(
    -> (NAME=address,TYPE(NAME='MD5')),
    -> (NAME=email,TYPE(NAME='MASK_BEFORE_SPECIAL_CHARS', PROPERTIES("special-chars"="@", "replace-char"="*"))),
    -> (NAME=telephone,TYPE(NAME='KEEP_FIRST_N_LAST_M', PROPERTIES("first-n"=3, "last-m"=4, "replace-char"="*")))
    -> ));
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW MASK RULES;
+--------+-----------+---------------------------+-----------------------------------+
| table  | column    | algorithm_type            | algorithm_props                   |
+--------+-----------+---------------------------+-----------------------------------+
| t_user | address   | MD5                       |                                   |
| t_user | email     | MASK_BEFORE_SPECIAL_CHARS | special-chars=@,replace-char=*    |
| t_user | telephone | KEEP_FIRST_N_LAST_M       | first-n=3,last-m=4,replace-char=* |
+--------+-----------+---------------------------+-----------------------------------+
3 rows in set (0.01 sec)

mysql> SELECT * FROM t_user;
+---------+-----------+----------+--------------------+-------------+---------------+
| user_id | user_name | password | email              | telephone   | creation_date |
+---------+-----------+----------+--------------------+-------------+---------------+
|       2 | lisi      | 222222   | ****@gmail.com     | 123****8901 | 2017-08-08    |
|       1 | zhangsan  | 111111   | ********@gmail.com | 123****8900 | 2017-08-08    |
|       3 | wangwu    | 333333   | ******@gmail.com   | 123****8902 | 2017-08-08    |
+---------+-----------+----------+--------------------+-------------+---------------+
3 rows in set (0.02 sec)

新亮点介绍CDC 新功能上线

面向 AP 场景的数据查询

CDC 即 Change Data Capture(变更数据捕获),是数据库的常见功能,大部分关系型数据库也都提供了 CDC 功能。比如:MySQL、PostgreSQL、openGauss 等。变更包括记录的增删改,也可能是结构的变化。CDC 系统捕获到变更数据之后,分发给订阅变更数据的下游,再写入其它系统,比如:OLTP、OLAP 或者 MQ 系统。CDC 可用于数据同步,也可用于 ETL。

CDC 功能基于 CS 模式实现,包括:CDC 服务端、CDC 客户端、CDC 协议。CDC 服务端内嵌于 Proxy,默认不开启。开启之后会打开新的端口提供 CDC 服务。相关配置位于server.yaml,配置示例:

cdc:
  enabled: false
  port: 33071

CDC 服务端从存储层获取变更数据。由于数据可能存在分片,所以需要聚合来自不同分片的变更数据,并尽可能保证数据的全局有序。数据有序包括 2 个方面:

  • 同一条记录的变更绝对有序,保证数据正确性。

  • 不同记录之间的变更按照事务提交顺序排序。

目前已基本支持存储层为 openGauss 的场景,MySQL 和 PostgreSQL 等将于后续支持。CDC 服务端采用推模型推送数据给 CDC 客户端。CDC 客户端通过 TCP 协议访问 CDC 服务端,登录并订阅数据变更,接收到推送之后反序列化数据,然后写入目标端。

ShardingSphere 提供了 cdc-client 独立模块,发布后会提交到 Maven 仓库。该模块封装了 TCP 请求、请求响应序列化反序列化、RDBMS 目标端数据写入等通用代码,便于用户实现完整的 CDC 客户端。

CDC 协议采用统一的二进制协议,基于 Protocol Buffers。具有较高的数据压缩率和较好的序列化反序列化性能。兼容性好,方便基于各种编程语言的系统之间集成。当存储层为 Oracle 等商业数据库,更为方便地支持 CDC 功能。

开启 CDC 功能之后,将 ShardingSphere 数据和目标端系统打通大致有 3 种方式:

  • 扩展 CDC 客户端,定制少量代码,且将数据写入「目标端系统」。

  • 为目标端系统实现数据导入插件。

  • 为第三方 ETL 框架实现插件。


目前已支持方式一(第一点),CDC 功能正在迭代优化中,欢迎大家提出宝贵建议!

更新日志新特性

  • 新增脱敏功能「动态脱敏」模式及内置「脱敏算法」

  • CDC 新功能上线

更新日志优化

  • 集群模式避免内存元数据二次刷新

  • SHOW COMPUTE NODES 支持显示各实例的版本号

  • 系统库增加集群信息表

  • 单机模式持久化元数据支持 MySQL

  • 支持字符串截取的 SQL HINT 方式

  • 恢复hint路由到指定库功能

  • 单字符摘要 LIKE 算法支持 LIKE _ 通配符

  • 支持 SQL Federation SELECT NULLS LAST/FIRST 语句

  • 重构 Encrypt 集成测试并增加更多测试 CASE

  • 为 MD5MaskAlgorithm, MD5EncryptAlgorithm 增加 salt 参数

  • 重构 ShardingConditionEngine 以支持 SPI 配置

  • DistSQL:CREATE ENCRYPT RULE 时支持定义列级别的 QUERY_WITH_CIPHER_COLUMN 属性

  • DistSQL:CREATE SHARDING TABLE RULE 增加策略类型匹配校验

更新日志问题修复

  • 修复 ShardingSphere 连接 k8s 中 ZooKeeper 集群报错问题

  • 修复集群模式使用 Consul 启动报错问题

  • 删除数据库发现规则停止数据库探活任务

  • 修复完美 sharding 场景下 SQL 决断错误结果

  • 修复 SQL Federation PostgreSQL 和 openGuass 方言集合运算 UNION, INTERSECT, EXCEPT 优先级问题

  • 修复 CREATE VIEW 语句包含集合运算出现的 out of range 异常

  • 更新Atomikos资源注册长度不超过45限制文档/前置校验

  • 修复事务对spring requires_new 支持

  • 修复 PostgreSQL/openGauss 数据库 char 类型字段,配置 AES 加密算法时解密异常

  • 修复加密功能子查询包含别名时 * 号展开异常

  • 修复集群模式元数据 unsigned 属性不正确的问题

  • 修复 PostgreSQL/openGauss select fetch 解析问题以支持 Federation 执行引擎

  • 修复 MySQL Proxy 的异常处理逻辑可导致客户端错误的问题

  • 修复 PostgreSQL Proxy 操作复合类型报错的问题

  • 修复 MySQL Binary 协议查询无符号数列定义 flag 不正确的问题

  • 修复:通过 Proxy 查询 PG 元数据且结果集为空时,label 丢失的问题

社区建设贡献者「荣誉榜」

ec5a3a5a1b9513cdb26acb5f09d861ea.jpeg

此次 Apache ShardingSphere 5.3.1 版本的发布,共有 28 位 Contributor 提交了 448 个 PR,感谢社区伙伴们的大力支持!ShardingSphere 社区欢迎各路「技术大牛、开发者、使用者、学生党」参与版本迭代 & 社区共建中来。期待与你一起共探开发乐趣!

相关链接

🔗 下载链接:

https://shardingsphere.apache.org/document/current/cn/downloads/ 

🔗 更新日志:

https://github.com/apache/shardingsphere/blob/master/RELEASE-NOTES.md

🔗 项目地址:

https://shardingsphere.apache.org/ 

🔗 Cloud 子项目地址: 

https://github.com/apache/shardingsphere-on-cloud

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值