本文主要介绍了PolarDB数据库代理(Proxy)提供的动态脱敏功能。
前提条件
PolarDB数据库代理版本需为2.4.12或以上。如何查看和升级当前数据库代理版本,请参见小版本升级。
脱敏方案
在数据库使用中,需要实时地从生产环境中的数据库(即生产库)获取最新的客户数据来进行报表生成、数据分析、开发测试等。但为了不泄露真实的客户个人信息(Personal Identifiable Information),需要将这些数据进行脱敏处理后才能提供给第三方使用。目前脱敏方案包括动态脱敏和静态脱敏两种,PolarDB数据库代理使用的是动态脱敏方案。
脱敏方案 | 说明 | 优点 | 缺点 |
动态脱敏 | 当应用程序发起数据查询请求时,系统会在数据库内部对敏感数据进行变换后再返回给应用程序。 开始查询前,仅需指定需要进行脱敏查询的数据库账号,以及需要脱敏的数据库、表或列的名称即可。 |
| 由于需要对实时数据进行脱敏,因此相较于镜像库,生产库的查询性能会略受影响。 |
静态脱敏 | 将生产库的全量数据导入至一个镜像数据库中,同时在导数据的过程中对敏感数据进行加密或脱敏。 | 应用程序访问的不是真正的生产库而是镜像库,因此脱敏过程完全不会影响正常业务对生产库的使用。 |
|
工作原理
在PolarDB控制台上设置完脱敏规则后,控制台会将规则写入至Proxy中。当应用程序通过规则中指定的账号连接至数据库并查询规则中指定的列时,Proxy会先将数据库返回的数据脱敏转换,再将脱敏后的数据返回给客户端。
上图的脱敏规则为:
仅当使用
testAcc
账号连接数据库进行查询时生效。仅对查询结果中
name
和age
列的数据进行脱敏。
只要查询结果中包含脱敏列,该列的值都会被脱敏。如SELECT * FROM t1
,如果t1
表中包含name
和age
列,则查询结果中的这2列值会被脱敏。
当应用程序使用testAcc
连接数据库,并查询某个表中的name
、age
和hobby
时,Proxy会将name
和age
列的数据进行脱敏后再返回,hobby
列的数据则未进行脱敏原样返回。
Proxy会对不同类型的数据进行不同的脱敏处理,具体脱敏处理说明如下表所示。
数据类型 | 脱敏处理说明 | 示例 |
整数型(TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT) | Proxy会根据该数据的类型选择一个符合该类型定义的随机值。 |
|
小数型(DECIMAL、FLOAT、DOUBLE) |
| |
时间型(DATE、TIME、DATETIME、TIMESTAMP、YEAR) |
| |
除上述3种类型之外的数据 | Proxy会统一使用星号(*)进行替换 |
|
注意事项
动态脱敏功能仅对集群地址(包括默认集群地址和自定义集群地址)生效,使用主地址连接数据库进行查询时,动态脱敏功能不生效。查看集群连接地址的操作步骤,请参见查看连接地址和端口。
查询数据时,若查询结果中包含需要脱敏的列,且单行数据超过16 MB时,执行该查询命令的连接会断开。
例如,若已有一张包含了
name
和description
列的表person
,其中name
列需要脱敏,且description
列中的数据超过了16 MB。当执行SELECT name, description FROM person
时,执行该查询命令的连接则会断开。若需要脱敏的数据列作为函数入参,脱敏功能会失效。
例如,已创建了一条需要对
name
列数据进行脱敏的规则,当执行SELECT CONCAT(name, '') FROM person
进行查询时, 应用程序仍然能够读取到name
的原始值。若需要脱敏的数据列同时被用于UNION中,脱敏功能可能会失效。
脱敏失效示例:已创建了一条需要对
name
列数据进行脱敏的规则,当执行SELECT hobby FROM person UNION SELECT name FROM person
语句进行查询时, 应用程序仍然能够读取到name
的原始值。
使用方法
详情请参见管理脱敏规则。
附录:性能影响
脱敏功能会在以下3种场景中对集群的性能产生影响。
本文使用了集群的只读QPS值进行对比。
场景说明 | 性能影响 | |
账号是否加入脱敏规则 | 查询是否命中规则 | |
否 | 否 | 此时等同于当前账号未使用脱敏功能,性能没有损耗。 |
是 | 否 | 此时Proxy仅会分析结果集中的列定义数据,不会对真正的查询结果(即行数据)进行脱敏。 性能损耗约为6%(即开启脱敏功能前后的只读QPS值相差约6%)。 |
是 | 此时Proxy不仅会分析结果集中的列定义数据,还会对真正的查询结果(即行数据)进行脱敏。 此时性能损耗与结果集大小相关,结果行数越多损耗越大。 在返回单行结果的情况下,性能损耗约为6%。 |