Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL安全相关-- TDE和数据脱敏功能介绍

MySQL安全相关-- TDE和数据脱敏功能介绍

作者头像
MySQLSE
发布于 2022-03-14 06:39:13
发布于 2022-03-14 06:39:13
1.8K0
举报

罗伟文 多年的DBA经验,从oracle8i到MySQL,从传统行业到互联网,从音乐直播到电子商务,有大规模高并发数据库集群的实战经验,现任甲骨文云MySQL首席解决方案工程师

1 TDE

TDE( Transparent Data Encryption,透明数据加密) 指的是无需修改应用就可以实现数据的加解密,在数据写磁盘的时候加密,读的时候自动解密。加密后其他人即使能够访问数据库文件,没有key也无法读取数据,从而达到防止非法访问的目的。

  • MySQL的支持情况

InnoDB使用的是两层的加密键架构,包括一个master加密键和表空间加密键,master加密键是用来加解密表空间键的,而表空间加密键保持不变,放置在表空间文件的文件头,这样可以不时轮换master的加密键,从而提供更高的安全性,而表空间的数据不用重新进行加解密,节省时间,对生产系统的影响也较小。

静态数据加密功能支持基于高级加密标准 (Advanced EncryptionStandard,AES) 块的加密算法。它使用电码本(Electronic Codebook ) 块加密模式进行表空间密钥加密,使用密码分组链接 (CipherBlock Chaining) 块加密模式进行数据加密。

加密的key都是通过keyring(钥匙圈)来进行管理的,使用的是插件和组件的形式。这些插件或组件使用本身的后台存储或者与其它的密钥后端存储系统通信,MySQL 5.7开始支持TDE,8.0提供更多的加密选项,社区版和企业版都可以,区别是企业版提供额外的keyring组件和插件,可以提供更好的安全性,如果要达到合规的要求,需要使用企业版,详细支持情况列表如下。

keyring 组件名

社区版

企业版

component_keyring_file

8.0.24+

8.0.24+

component_keyring_encrypted_file

不支持

8.0.24+

keyring_file

5.7+

5.7+

keyring_encrypted_file

不支持

5.7+

keyring_okv

不支持

5.7+

keyring_aws

不支持

5.7+

keyring_hashicorp

不支持

8.0.18+

keyring_oci

不支持

8.0.22+

对于不同的版本,支持的文件加密也是有区别的,8.0.23或以上,支持的加密包括有:独立表空间、通用表空间、DoubleWrite文件、mysql系统表空间、Redo log和UndoLog文件的加密。

根据官方文档,启用后性能影响百分比在个位数,实际的影响情况可用工作负载测试下。启用加密后,数据库的占用空间也变化不大。

启用加密后,对于备份策略也需要调整,需要考虑到master键的保存,并不时作备份恢复测试,确保即使生产数据完全丢失也可以恢复数据。要注意的是,如果使用MySQL Enterprise Backup (MEB)备份TDE的表空间,备份下来也是加密的,而mysqldump备份是没有加密的,考虑到安全问题可手动加密。

以下演示的是通过插件方式进行的TDE加密,keyring_encrypted_file是企业版带的插件,它将钥匙圈数据存储在一个加密的、用密码保护的本地文件中。

首先,安装插件

mkdir -p /usr/local/mysql/mysql-keyring/

chown mysql:mysql /usr/local/mysql/mysql-keyring/

修改配置文件

[mysqld]

early-plugin-load=keyring_encrypted_file.so

keyring_encrypted_file_data=/usr/local/mysql/mysql-keyring/keyring-encrypted

keyring_encrypted_file_password=password

重新启动后,确认插件是ACTIVE状态

SELECT PLUGIN_NAME, PLUGIN_STATUS

FROM INFORMATION_SCHEMA.PLUGINS

WHERE PLUGIN_NAME LIKE 'keyring%';

要实现通过SQL接口来进行钥匙圈的key管理,还需要安装一个插件keyring_udf.so的插件

INSTALL PLUGIN keyring_udf SONAME'keyring_udf.so';

再次确认插件是否ACTIVE

mysql> SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%'\G

*************************** 1. row***************************

PLUGIN_NAME: keyring_encrypted_file

PLUGIN_STATUS: ACTIVE

*************************** 2. row***************************

PLUGIN_NAME: keyring_udf

PLUGIN_STATUS: ACTIVE

2 rows in set (0.01 sec)

接着创建对应的函数:

CREATE FUNCTION keyring_key_generateRETURNS INTEGER

SONAME 'keyring_udf.so';

CREATE FUNCTION keyring_key_fetch RETURNSSTRING

SONAME 'keyring_udf.so';

CREATE FUNCTION keyring_key_length_fetchRETURNS INTEGER

SONAME 'keyring_udf.so';

CREATE FUNCTION keyring_key_type_fetchRETURNS STRING

SONAME 'keyring_udf.so';

CREATE FUNCTION keyring_key_store RETURNSINTEGER

SONAME 'keyring_udf.so';

CREATE FUNCTION keyring_key_remove RETURNSINTEGER

SONAME 'keyring_udf.so';

mysql> CREATE TABLE t1 (c1 INT)ENCRYPTION = 'Y';

Query OK, 0 rows affected (0.02 sec)

确认是否已经加密

mysql> SELECT SPACE, NAME, SPACE_TYPE,ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES

-> WHEREENCRYPTION='Y'\G

*************************** 1. row***************************

SPACE: 2

NAME: test/t1

SPACE_TYPE: Single

ENCRYPTION: Y

1 row in set (0.00 sec)

加密已经完成了,如果在生产中应用,需要注意保存好master加密键,这个步骤建议在创建首个加密表空间后就要马上做个备份,以后如果发生加密键轮换,再继续备份一次。

各种插件和组件的安装和使用方法见:https://dev.mysql.com/doc/refman/8.0/en/keyring.html

2 数据脱敏

数据脱敏,就是将敏感的信息,例如身份证信息、信用卡信息和电话号码等隐藏起来,从而达到保护客户资料隐私的目的。

从8.0.13开始,MySQL企业版提供了数据脱敏的功能,主要包括:

1.转换现有数据,例如将信用卡号只保留最后四个字符,其余数据均更改为“X”字符;

2.随机数据的生成,例如电子邮件地址和信用卡号。

这些功能都是通过安装插件实现的,日常需要数据脱敏的时候,例如测试环境的部署等,

通过使用这些函数可大大方便我们的工作。安装步骤如下:

INSTALL PLUGIN data_masking SONAME 'data_masking.so';

CREATE FUNCTION gen_blacklist RETURNS STRING

SONAME 'data_masking.so';

CREATE FUNCTION gen_dictionary RETURNS STRING

SONAME 'data_masking.so';

CREATE FUNCTION gen_dictionary_drop RETURNS STRING

SONAME 'data_masking.so';

CREATE FUNCTION gen_dictionary_load RETURNS STRING

SONAME 'data_masking.so';

CREATE FUNCTION gen_range RETURNS INTEGER

SONAME 'data_masking.so';

CREATE FUNCTION gen_rnd_email RETURNS STRING

SONAME 'data_masking.so';

CREATE FUNCTION gen_rnd_pan RETURNS STRING

SONAME 'data_masking.so';

CREATE FUNCTION gen_rnd_ssn RETURNS STRING

SONAME 'data_masking.so';

CREATE FUNCTION gen_rnd_us_phone RETURNS STRING

SONAME 'data_masking.so';

CREATE FUNCTION mask_inner RETURNS STRING

SONAME 'data_masking.so';

CREATE FUNCTION mask_outer RETURNS STRING

SONAME 'data_masking.so';

CREATE FUNCTION mask_pan RETURNS STRING

SONAME 'data_masking.so';

CREATE FUNCTION mask_pan_relaxed RETURNS STRING

SONAME 'data_masking.so';

CREATE FUNCTION mask_ssn RETURNS STRING

SONAME 'data_masking.so';

安装好后,我们就可以调用这些函数了。

2.1 数据打码功能

mask_inner() 和mask_outer(),可以根据设定的位置将部分的字符串打码。

例如:mask_inner可将中间部分的字符串打码,下面设置的是除开始的5个字符和最后的一个字符不打码外,其余均打码脱敏

SELECT mask_inner('This is a string', 5,1);

+--------------------------------------+

| mask_inner('This is a string', 5, 1) |

+--------------------------------------+

| This XXXXXXXXXXg |

mask_outer的作用则相反,中间不打码,其余均打码

SELECT mask_outer('This is a string', 5,1);

+--------------------------------------+

| mask_outer('This is a string', 5, 1) |

+--------------------------------------+

| XXXXXis a strinX

信用卡账号打码,下面先用gen_rnd_pan生成随机的信用卡账号,然后mask_pan,只保留后面4位

mysql> SELECT mask_pan(gen_rnd_pan());

+-------------------------+

| mask_pan(gen_rnd_pan()) |

+-------------------------+

| XXXXXXXXXXXX2461 |

+-------------------------+

2.2 随机数据生成功能

l 生成随机的email地址

例如下面生成example.com域的随机email地址

mysql> SELECT gen_rnd_email();

+---------------------------+

| gen_rnd_email() |

+---------------------------+

| ayxnq.xmkpvvy@example.com |

l 取字典中的随机项目

先导入字典,然后随机取出里面项目

下面de_cities.txt存放的是测试的项目,每个一条,通过gen_dictionary_load导入并设置一个标签DE_Cities

mysql> SELECTgen_dictionary_load('/usr/local/mysql/mysql-files/de_cities.txt', 'DE_Cities');

+--------------------------------------------------------------------------------+

| gen_dictionary_load('/usr/local/mysql/mysql-files/de_cities.txt','DE_Cities') |

+--------------------------------------------------------------------------------+

| Dictionary load success |

然后通过DE_Cities标签可以随机取出一个项目

mysql> SELECTgen_dictionary('DE_Cities');

+-----------------------------+

| gen_dictionary('DE_Cities') |

+-----------------------------+

| Berlin |

+-----------------------------+

更多的脱敏函数,可参见

https://dev.mysql.com/doc/refman/8.0/en/data-masking-function-reference.html

关于TDE和数据脱敏,就介绍到这里了,有需要的朋友可以测试下。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MySQL解决方案工程师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL企业版之数据脱敏功能
1. 插件安装2. 数据打码插件应用2.1 隐藏重要数据2.2 生成随机数据并打码2.3 基于字典生成随机值2.4 其他要注意的地方3. 总结4. 延伸阅读 MySQL企业版从8.0.13开始,新增一个插件叫做Data Masking and De-Identification,我将其简称为数据打码插件,其主要功能有:
老叶茶馆
2020/06/23
1.5K0
MySQL Clone Plugin 实现用SQL进行备份
执行INSTALL PLUGIN命令后,会注册到mysql.plugins表中,所以下次重启该实例会自动加载插件,无需再依赖plugin-load-add
田帅萌
2020/04/15
1.2K0
MySQL Clone Plugin 实现用SQL进行备份
Percona8.0.17的数据屏蔽插件的使用
MySQL企业版里面的数据屏蔽的功能,在Percona 8.0.17里面被开源实现了。
保持热爱奔赴山海
2020/02/14
5390
MySQL 脱敏函数使用
在当今数据驱动的世界中,保护敏感信息变得至关重要。MySQL提供了多种方法来实现数据脱敏,本指南将详细介绍如何使用Percona插件和自定义函数来保护各类敏感数据。
贺春旸的技术博客
2024/09/26
3130
MySQL InnoDB表空间加密
  从 MySQL5.7.11开始,MySQL对InnoDB支持存储在单独表空间中的表的数据加密 。此功能为物理表空间数据文件提供静态加密。该加密是在引擎内部数据页级别的加密手段,在数据页写入文件系统时加密,加密用的是AES算法,而其解密是在从文件读到内存中时进行。
俊才
2020/08/18
3.6K0
MySQL InnoDB表空间加密
MySQL静态数据加密和企业版TDE
MySQL支持静态数据加密。静态数据加密的目的是为了防止保存在磁盘上的文件被非法盗用,使用该功能可以确保数据库的表空间,日志等文件即使是被盗用,也无法读取里面的敏感数据。
MySQLSE
2020/09/28
2.8K0
mysql clone plugin
默认情况下,远程克隆操作会删除原来接收者的数据,替换为clone的数据,通过Cloning to a Named Directory可以避免删除原来的数据
wangwei-dba
2021/02/08
1.6K0
数据库安全·开发加密插件
以下节选择《Netkiller Architect 手札》 作者:netkiller 地址 http://www.netkiller.cn/architect/ 接下来几周的话题是数据库安全。 5.9. 开发加密插件开发 数据库内部提供的摘要函数MD5/SHA/CRC与现有的AES/DES加密函数以及不能满足我们的需求,所以我们有必要开发外挂插件实现数据加密。 这里有一个例子,是我早年开发的 https://github.com/netkiller/mysql-safenet-plugin 这个UD
netkiller old
2018/03/05
3K0
用MySQL自身函数实现 - 随机盐加密,解密,脱敏。
贺春旸的技术博客
2024/08/27
2290
用MySQL自身函数实现 - 随机盐加密,解密,脱敏。
MySQL 表空间加密插件 Keyring
MySQL支持对InnoDB单表空间、通用表空间、系统表空间和Redo、Undo文件进行静态加密。从8.0.16开始支持对Schema和通用表空间设置加密默认值,这就允许对在这些Schema和表空间中的表是否加密进行统一控制;静态加密功能依赖于Keyring组件或插件,MySQL社区版提供的Keyring file插件会将Keyring数据存储在服务器主机的本地文件系统中。
数据和云
2021/09/22
3.6K0
新功能简介|MySQL8.0数据查询脱敏
数据库管理员会负责维护数据的隐私和完整性。针对数据的脱敏,通常的方案是:应用端实现或者引入加密机等。
田帅萌
2020/02/17
1.8K0
数据库进程间通信解决方案
数据库进程间通信解决方案 数据库与其他第三方应用程序进程间通信解决方案 摘要 你是否想过当数据库中的数据发生变化的时候出发某种操作?但因数据无法与其他进程通信(传递信号)让你放弃,而改用每隔一段时间查询一次数据变化的方法?下面的插件可以解决你的问题。 原文出处:http://netkiller.github.io/journal/mysql.plugin.fifo.html ---- 目录 1. 背景 2. 解决思路 3. Mysql plugin 4. plugin 的开发与使用 5. 插件如何使用 6.
netkiller old
2018/03/05
7350
mysql之udf提权
UDF (user defined function),即用户自定义函数。是通过添加新函数,对MySQL的功能进行扩充,就像使用本地函数如 user() 一样。
故里[TRUE]
2023/04/21
2.9K0
技术分享 | 实战 MySQL 8.0.17 Clone Plugin
很神奇,5.7.17 和 8.0.17,连续两个17小版本都让人眼前一亮。前者加入了组复制(Group Replication)功能,后者加入了克隆插件(Clone Plugin)功能。今天我们实战测试一下这个新功能。
田帅萌
2019/08/01
1.5K0
技术分享 | 实战 MySQL 8.0.17 Clone Plugin
使用MySQL Keyring 的 SECRET类型密钥执行非对称加密
以下是一个示例,演示应用程序使用公钥进行非对称加密数据。在MySQL 8.0.19中,添加了支持Keyring技术的SECRET密钥类型。使用此技术,用户可以使用以下方法安全地管理自己的密钥:
MySQLSE
2020/09/28
2K0
数据库与图片完美解决方案
数据库与图片完美解决方案 电商商品图品与数据库脏数据完美解决方案 摘要 你是是不是在开发中常常遇到,删除了数据库记录后,发现该记录对应的图片没有删除,或者删除了图片,数据库中仍有数据存在,你的网站脏数据(图片)成几何数增长,阅读下文这里为你提供了一个完美决方案。 ---- 目录 1. 背景 2. 解决思路 3. 解决方案 4. plugin 的开发与使用 5. 在事务中使用该插件 6. 通过触发器调用图片处理函数 1. 背景 我以电商网站为例,一般的网站产品数据存放在数据库中,商品图片是上传到文件服务器,然
netkiller old
2018/03/05
9310
MySQL中涉及安全性的SQL语句
您的MySQL安全吗?数据是最有价值的资产,数据安全已经成为重中之重。本篇将介绍如何使用SQL语句确保MySQL的安全性。
MySQLSE
2024/07/18
1722
MySQL中涉及安全性的SQL语句
技术译文 | MySQL 8.x DDL 和查询重写插件
本文来源:https://www.percona.com/blog/2020/08/07/mysql-8-x-ddl-rewriter-and-query-rewriter-plugins-implementation-and-use-cases/
爱可生开源社区
2020/08/17
4480
MySQL8 中文参考(二十二)
本节描述了如何安装或卸载ddl_rewriter插件。有关安装插件的一般信息,请参见 Section 7.6.1,“安装和卸载插件”。
ApacheCN_飞龙
2024/06/26
2490
MySQL8 中文参考(二十二)
JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)
无论MySQL还是Redis,自身都带有数据同步的机制,像比较常用的 MySQL的Master/Slave模式 ,就是由Slave端分析Master的binlog来实现的,这样的数据复制其实还是一个异步过程,只不过当服务器都在同一内网时,异步的延迟几乎可以忽略。
BUG弄潮儿
2022/06/30
1.5K0
JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)
相关推荐
MySQL企业版之数据脱敏功能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档