现已开源|有这款神器,业务0改动即可实现数据加密

简介: 全密态Go驱动开源啦


1. 阿里云全密态为什么这么好用?

小王是某物流公司的CTO,出于公司在安全合规方面的业务规划,需要根据以下要求完成业务整改:

  1. 即使数据库账密丢失,黑客也无法拖库。
  2. 研发、运维、DBA等人员无法接触线上敏感客户数据。
  3. 快速上线。


小王为此找到了阿里云瑶池数据库团队,接触到了阿里云全密态数据库,在3天内快速完成了业务测试、改造、上线。在使用全密态数据库的过程中,他惊奇地发现,改造完后虽然从数据库侧读到的数据全是类似“锟斤拷烫烫烫”这样的密文,但是自己的业务应用居然在完全没改动代码的情况下可以正常运行。


他不禁开始奇怪这是怎么一回事。有没有可能阿里云在糊弄自己,客户端读取到的真的是密文吗?如果数据是加密的,怎么可能自己不需要改动业务代码呢?


之前了解到业界处理类似问题的方案,都需要在业务侧做大量的改造。如果是基于传统的数据库自己做端侧数据加密存储的话,存在很多问题,例如大量SQL无法继续支持、业务代码改造成本极高、性能很差......


带着这个疑问,他找到了阿里云的数据库专家,进行咨询。数据库专家听完小王的疑惑,微微一笑,说:“您不用担心,我结合代码,为您解释一下其中的原理。

2. 全密态数据库原理解析

“全密态能力指的是数据全生命周期以密态存在。数据一旦流出可信环境,就总是处于密文状态下的。只有当数据落入正确的人手里,例如数据到达咱们的业务系统客户侧,才会被解密。任何账号通过直连数据库的形式,都是无法读取数据明文的。


小王问:“那么什么叫做让数据落入正确的人手中呢?产研、运维人员是不是正确的人呢?


数据库专家:“请看图。对于应用终端用户来说,他们是数据的真正所有者,可以看到明文或者是脱敏后的敏感数据。对于应用研发、运维人员以及数据库研发、运维人员来说,他们都只能看到加密后的数据,监守自盗的问题不复存在。”

image.png

数据库专家继续说:“我们全密态功能,是在数据库本身查询流程上做的一个拓展。我们在数据库上集成了一个自研的安全闸口,这个组件会根据用户定义的敏感数据规则,在数据被输出时进行加密。同时,考虑到企业用户往往会给DBA、产研人员一定的阿里云控制台权限,定义规则这个行为本身可以通过阿里云的RAM体系来约束。企业可以根据最小授信原则给DBA、产研人员授权,避免他们恶意篡改规则,以明文形式导出数据。明文数据库加上安全闸口,即为我们的全密态数据库产品。”

image.png

“全密态数据库本身在加密数据的时候,是字段级别的加密。从数据内容的角度来看,我们的网络包完全符合MySQL本身的通信协议,只是对数据内容本身做了替换,如下图所示。”

image.png

全密态数据库通信协议


“在MySQL的文本通信协议中,每一个字段的数据都以字符串的形式保存,其中每个字符串的编码形式为长度加上内容。我们遵循这个原则,在返回数据时,也将密文用这种格式组织。我们遵循MySQL的通信协议,使得全密态数据库兼容了所有业界现存数据库客户端。同时,我们通过有选择地对数据加密,让这些客户端在查询时显示密文。”

注:MySQL有文本协议、二进制协议两种通信机制,本文仅以第一种作例子。

3. 全密态Go驱动开源啦

小王:“全密态数据库果然厉害。不过,为什么公司的业务应用可以在完全没改动代码的情况下正常运行呢?”


数据库专家开心地说道:“嘿嘿,现在我们可以对外进行详细的技术揭秘了。因为,我们的的客户端项目  alibabacloud-encdb-mysql-go-client  终于开源啦!客户端本身支持所有SQL语句,支持MySQL的两种通信协议,且提供标准Go接口,因此完全不需要业务改造即可接入Gorm、Gin等框架。听我下面跟你详细讲述。”

3.1 Go语言客户端原理解析

“类似于Java为了让应用程序使用相同的接口接入不同的数据库创造了JDBC,GoLang创造了database/sql/driver系列通用接口。不同的数据库驱动,只需要实现统一的Driver(驱动)及其派生成出来的Conn(连接)、Stmt(语句)、Rows(数据行)类型,就可以让应用程序以统一的接口调用。MySQL社区驱动就是通过这种方式被无数用户使用的。请看下面这幅图,本质上应用侧调用了Rows类的Next接口获取数据。”

image.png

社区MySQL Go驱动UML关系图


“您查看我们全密态数据库Go驱动的代码,可以很清楚发现,我们实现的Driver、Conn等类,其实内部都有一个相应的社区实现类作为成员。”


driver.go文件

// Driver实现:内含MySQL实现类
type EncMySQLDriver struct {
  mysqlDriver *mysql.MySQLDriver
}

“我们利用这些内部的社区实现类实现了大部分的标准接口。例如社区要求的Conn.Begin接口,我们就是直接调用了内部的社区类成员的同名函数。”


connection.go文件

func (c *encmysqlConn) Begin() (driver.Tx, error) {
  return c.conn.Begin()
}

“这种设计,让我们完全不需要关心MySQL本身的连接、事务、SQL等机制,我们只需要专注于加密解密处理本身。之前提到。我们的全密态数据库完全符合MySQL通信协议,因此,在我们的客户端内部我们可以利用社区驱动,调用Rows.Next接口直接读到密文内容。我们需要做的,只是在我们自己实现的Rows.Next接口里,将密文进行解析,再将明文返回给应用侧即可。”

image.png

全密态MySQL Go客户端UML关系图


“对应用侧来说,则完全不需要关心底层的驱动实现,只需要引入我们的开源包即可。”


获取全密态mysql go客户端

go get github.com/aliyun/alibabacloud-encdb-mysql-go-client@latest

“参照我们的README.md您很快就可以跑起来一个demo。由于我们实现了Go语言的标准接口,客户端本身可以一键接入Gorm、Gin等GoLang常见Web框架,稳定性、易用性都已经通过了客户验证。”

3.2 为什么要开源

小王听完,赞叹道:“这个客户端设计还真是巧妙。不过,这么棒的技术,你们为什么决定开源呢?


数据库专家认真地回答道:“首先我们相信,作为云厂商,在给用户带来安全产品的时候,开源透明、公开的精神能增强用户对我们的信任。坦诚和互信常常是连在一起的,通过阅读我们的开源代码,用户可以更加相信我们产品的安全性、可靠性、稳定性。


其次,在Go的世界里,闭源的项目是没法直接通过Go的包管理机制透出的。在此前,全密态数据库对客户输出时,采用的是将压缩包放在文档界面的形式,这种形式增加了客户集成程序包的复杂度,对线上业务的部署也增加了难度。出于客户第一的价值考虑,我们最终选择了开源。”


小王感叹:“确实,代码全部开源,我们客户使用起来也更加放心,对项目更加可控。必须要给阿里云点一个大大的赞!”


全密态数据库基于用户的设置,实时对业务敏感数据进行字段级加密,将业务数据资产与传统DBA、运维等未授权人员进行了隔离,保障客户数据安全。全密态数据库客户端基于社区驱动、开源的密码库,实现了标准的Go语言数据库驱动接口,助力客户系统代码0改造接入全密态数据库,为客户提供了高度的易用性。当您的数据库中有数据需要被保护时,可以使用RDS MySQL和PolarDB MySQL的全密态数据库功能

4. 了解更多

全密态数据库PolarDB MySQL

全密态数据库RDS MySQL

全密态数据库Go客户端开源地址见Github


作者:杨逍(软补)

作者介绍
目录