专栏首页MySQL解决方案工程师MySQL静态数据加密和企业版TDE

MySQL静态数据加密和企业版TDE

MySQL支持静态数据加密。静态数据加密的目的是为了防止保存在磁盘上的文件被非法盗用,使用该功能可以确保数据库的表空间,日志等文件即使是被盗用,也无法读取里面的敏感数据。

InnoDB通过两层密钥架构实现静态数据加密功能。当表空间文件进行加密时,会产生一个加密的表空间密钥,该密钥保存在表空间文件的文件头。当应用程序或者合法用户对表进行访问时,InnoDB会使用一个主密钥将加密的表空间密钥解密。主密钥可以进行轮换,表空间密钥无法更改,除非对表空间重新进行加密。

静态数据加密功能依靠MySQL的keyring plugin(暂且叫做钥匙环插件吧,密钥全部保存在钥匙环里,挺形象的)实现。目前,MySQL提供如下插件:

  • keyring_file:社区版提供,将钥匙环数据保存在本地的文件。
  • keyring_encrypted_file:企业版提供,将钥匙环数据保存在本地的加密文件。
  • keyring_okv:企业版提供,包含一个KMIP客户端,提供一个兼容KMIP协议的集中管理解决方案,例如,Oracle Key Vault, Gemalto KeySecure等。
  • keyring_aws:企业版提供,与Amazon Web Services Key Management Service 通信,用于后端存储。
  • keyring_hashicorp:企业版提供,与HashiCorp Vault通信,用于后端存储。

一个安全可靠的加密密钥管理解决方案对于安全性和合规要求都是至关重要的。需要注意的是,使用keyring_file 和 keyring_encrypted file 插件时,无法满足某些规范要求的密钥集中管理,因此,当静态加密功能使用集中式密钥管理解决方案时,该特性被称为“MySQL企业透明数据加密(TDE)”。

接下来,将通过一组演示,为大家介绍静态加密的功能和使用方法。由于不具备集中保管密钥的条件,只能使用keyring_encrypted_file的方式进行演示。演示内容包括,安装keyring插件,安装UDF,UDF的目的是通过SQL管理密钥,加密表空间文件,加密redo日志,加密binlog,主密钥轮换。

首先,我们在MySQL里面创建一张表。表名为"tde",非常简单的一张表。

接下来,往里面插入一条记录:

数据已经写入表中了,这时我还没有安装keyring插件,让我们看看表空间文件里能否查到我这条记录:

执行 xxd /usr/local/mysql_old/3310/test/tde.ibd | less可以查看并检索表空间文件里是否包含刚才插入的字符。

果然,表空间文件里存在着刚才插入的记录,如果这是一个敏感数据,则用户就会面临着风险。接下来,我将在服务器里安装插件和UDF。安装其实也非常简单,首先需要创建一个路径用以保存钥匙环。

mkdir -p /opt/mysql-keyring/

chown -R mysql:mysql /opt/mysql-keyring

其次,打开mysql的配置文件my.cnf,在[mysqld]的下面添加如下内容:

early-plugin-load=keyring_encrypted_file.so

keyring_encrypted_file_data=/opt/mysql-keyring/keyring

keyring_encrypted_file_password=password

这里需要注意的是,keyring插件要在服务器启动之前加载,并且只能选择使用一种keyring插件,另外一点,加密的keyring文件密码保存在了配置文件里,因此要严格注意配置文件的访问权限。

执行:INSTALL PLUGIN keyring_udf SONAME 'keyring_udf.so';

安装以后,可以看到插件已经激活。接下来安装一组UDF:

这些UDF用于管理密钥,举个例子看一下,使用kering_key_generate来生成一个密钥,然后再通过keyring_key_fetch查看一下密钥:

下面,我们开启加密,执行:alter table test.tde encryption ='y';

我们再次看看加密情况和表空间文件的内容:

开启加密之后,表空间文件的内容里,已经查找不到我的名字。

表空间的加密演示结束,接下来演示一下redo日志的加密。让我们先看一下redo日志里面的内容。

执行:mysql> \! xxd /usr/local/mysql_old/3310/ib_logfile0 |less

没有加密之前,是可以在redo日志里面找到相关记录的。确认一下参数值,开启加密:

插入第二条记录:

再次确认一下redo日志里面的内容,已经无法找到第二条记录。

接下来,我们开启binlgo加密,在开启之前,先确认一下日志的加密情况。

开启加密:

插入一条新纪录:

再次确认一下日志加密情况,最新的日志已经被加密:

使用mysqlbinlog工具查看日志内容,注意,由于日志格式的原因,需要指定-v才能看到相应的SQL语句。

日志已经显示被加密无法读取。

最后一个环节,让我们看一下如何管理密钥,进行主密钥轮换。

可以通过performance_schema里面的keyring_keys查看当前密钥:内容包括ID,所有者信息。

可以对InnoDB和binlog的主密钥执行轮换:

alter instance rotate innodb master key;

alter instance rotate binlog master key;

需要注意的是,不要在服务器运行和正在启动时轮换密钥,可能会发生无法读取数据的情况,造成数据丢失事故。

以上内容是对MySQL静态数据加密做的一个简介,希望能够帮到有需要的朋友。

本文分享自微信公众号 - MySQL解决方案工程师(mysqlse),作者:徐轶韬

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL安全性解决方案

    随着数据爆发式的增长,安全性已经是用户头等重要的工作,数据已经成为其最重要的资产。

    MySQLSE
  • 使用MySQL Keyring 的 SECRET类型密钥执行非对称加密

    以下是一个示例,演示应用程序使用公钥进行非对称加密数据。在MySQL 8.0.19中,添加了支持Keyring技术的SECRET密钥类型。使用此技术,用户可以使...

    MySQLSE
  • MySQL8.0 的表空间文件加密控制

    MySQL 5.7.11引入了InnoDB表空间加密,该加密启用了对每表文件表空间的支持,此博客中将讨论此功能。

    MySQLSE
  • [设计模式]之一:简单工厂模式

    最近思考了一下这两年的工作:做Android的时候一直看Android知识,做iOS的时候一直学iOS的东西。其实看起来感觉这样没什么问题,但仔细想想,我发现自...

    wOw
  • 15种常见的数据可视化工具

    企业可以使用多种工具来可视化其数据和信息。在这里,我们列出了在大数据专业人士中非常流行的15种最重要的数据可视化工具!

    加米谷大数据
  • 即收即毁临时邮箱系统搭建

    执行完毕后按键盘上的CTRL+A,再按D返回,此时就可以通过访问  mx.deyaya.cc:3000  来访问你搭建的邮件系统了,如果打不开,十有八九是没有开...

    周俊辉
  • HTTP、TCP、UDP:通信协议的规则和区别

    TCP、HTTP、UDP:都是通信协议,也就是通信时所遵守的规则,只有双方按照这个规则“说话”,对方才能理解或为之服务。 TCP HTTP UDP三者的...

    Albert陈凯
  • 迈向HTTPS(四)HTTPS到底解决了什么问题

    很多人一提到 HTTPS,第一反应就是安全,对于普通用户来说这就足够了,对于程序员来说,有必要了解下 HTTP 到底有什么问题?HTTPS 是如何解决的?其背后...

    JackJiang
  • D-News|工信部称将建2个公共工业云平台和1个工业大数据平台 IBM发布沃森数据平台

    大数据文摘
  • 调查问卷:测试你对多核多线程的认知程度

            目前,多核多线程编程已经成为一种趋势,但大部分程序员还没有从串行程序的思维中走出来。即使有些人对多核多线程的概念有所了解,但也是一知半解,...

    ternturing

扫码关注云+社区

领取腾讯云代金券