欢迎来到博客文章系列的第2部分对MySQL加密在休息的时候。这篇文章包括InnoDB表空间加密。
Per雷竞技下载官网cona,与我们合作的客户数量,需要强有力的安全措施对PCI, HIPAA和φ合规,MySQL管理的数据需要加密”在休息的时候。“万物与开源,几个选项满足MySQL加密在休息的要求。在这个分为三部分的系列文章中,我们将介绍几个热门选择加密数据和现在的每个解决方案的优缺点。你可能想要评估这些教程的哪些部分最适合您的情况之前在生产中使用它们。
第一部分本系列的覆盖实现磁盘级别加密使用地下室+陆。
在这篇文章中,我们将讨论InnoDB表空间加密(TE)。你可以选择使用陆,InnoDB TE,也可以同时使用。这取决于你的合规需求和配置。例如,假设你把你的二进制日志和InnoDB重做日志分区X, InnoDB表空间(即。,.ibd文件)分区y InnoDB TE只处理加密的表空间。您将需要使用陆分区X加密这些文件。
InnoDB表空间加密教程
手动描述InnoDB加密如下:
InnoDB表空间加密密钥加密使用两层体系结构,包括主密钥和表空间的钥匙。当一个InnoDB表加密,一个表空间加密并存储在表空间头是关键。当一个应用程序或通过身份验证的用户想要访问加密的表空间数据,InnoDB使用主密钥解密表空间的关键。解密后的版本的表空间关键永远不会改变,但是你可以根据需要改变主密钥。这一行动被称为万能钥匙旋转。
作为一个实际的例子,高中看门人的钥匙圈。每个键是不同的;每个键是只有一个门(或在MySQL的情况下,表)。钥匙本身永远不会改变,但是每个键上的标签可以改变基于门卫要注意的关键是如何工作的大门。在任何时候,看门人可以重新设定键有特殊的名字,阻挠任何流氓开门他们不应该开放。
配置更改
如上所述,InnoDB使用密匙环来管理密钥基于每个表而创建的。但是你必须密匙环加载插件之前InnoDB。将以下代码添加到你my.cnf下(mysqld)部分。keyring文件你可以用一条不同的道路,但确保mysqld权限这条路径:
|
1
2
|
早期
- - - - - -
插件
- - - - - -
负载
=
keyring_file
所以
keyring_file_data
=
/
var
/
自由
/
mysql
- - - - - -
密匙环
/
密匙环
|
你不需要重新启动MySQL,但你可以如果你愿意。这些设置是为了在未来当你重新启动MySQL。
安装密匙环在MySQL插件
如果你不希望重新启动MySQL在这个时候,你仍然可以继续下去。在MySQL运行以下SQL语句来加载插件和配置keyring文件:
|
1
2
|
mysql
>
安装
插件
keyring_file
SONAME
“keyring_file.so”
;
mysql
>
集
全球
keyring_file_data
=
/ var / lib / mysql-keyring /密匙环的
;
|
你现在可以创建加密的表或改变现有表加密用一个简单的命令:
|
1
2
3
4
5
|
mysql
>
创建
表
t1
(
c1
INT
)
加密
=
“Y”
;
查询
好吧
,
0
行
影响
(
0.04
证券交易委员会
)
mysql
>
改变
表
用户
加密
=
“Y”
;
查询
好吧
,
1
行
影响
(
0.04
证券交易委员会
)
|
小心上面改变:它将最有可能阻止其他事务在此转换。
使用pt-online-schema-change加密表
使用pt-online-schema-change相当简单。虽然有许多选项,最基本的使用加密单个表如下:
|
1
|
pt
- - - - - -
在线
- - - - - -
模式
- - - - - -
改变
- - -
执行
- - -
改变
“引擎= innodb加密= Y”
D
=
mydb
,
t
=
mytab
|
pt-online-schema-change表的创建一个加密,影子复制mytab。一旦原始数据填充表,它drop-swaps表和替换原始表的新的。
它总是建议首次运行pt-online-schema-change与——即将国旗第一,为了验证命令和改变。
加密数据库中的所有表
加密数据库中的所有表,我们可以简单的把上面的命令,包装壳循环。循环是美联储从MySQL数据库中的表的列表。你只需要改变dbname变量:
|
1
2
3
|
= # dbname mydb
# mysql - b - n - e”从INFORMATION_SCHEMA选择TABLE_NAME。表S WHERE TABLE_SCHEMA='$dbname' and TABLE_TYPE='BASE TABLE'" |
而
读
行
;
做
pt
- - - - - -
在线
- - - - - -
模式
- - - - - -
改变
- - -
执行
- - -
改变
“引擎= innodb加密= Y”
D
=
美元dbname
,
t
=
行美元
;
完成
|
小心使用上面的命令,因为它会通过的所有更改起飞和爆炸!
旋转InnoDB加密密钥
你的合规政策规定多长时间你需要旋转InnoDB中的加密密钥:
|
1
|
mysql
>
改变
实例
旋转
INNODB
主
关键
;
|
这个命令创建一个新的密钥,加密解密所有表空间头(你在哪里存储表键)使用之前的钥匙,然后对标题的新密钥。注意,表本身并不对。这将是一个非常侵入和潜在危险操作。记得上面每个表的加密密钥不会改变(除非整个表会解密)。可以改变的是密钥用于加密,密钥在每个表的标题。
MySQL的密匙环udf
密匙环插件也可以用于存储敏感数据在MySQL供以后检索。此功能超出了这个博客的范围,因为它不直接处理InnoDB TE。你可以阅读更多关于它MySQL手册。
结论
InnoDB表空间加密很容易使用MySQL加密在休息的时候。记住使用的缺点只有TE: InnoDB表空间加密不包括undo日志,重做日志或主ibdata1表空间。此外,InnoDB加密不包括binary-logs slow-query-logs。






好的博客。
两个问题:
1。建议使用块与表空间级别加密加密(请记住只用TE)的缺点吗?
2。之间的性能影响是什么?
你好icsomu,
1。你可以做两个,但没有获得你任何东西。如果一切(表空间,重做,binlog等)已经在1分区,你应该做的——这样你加密所有的休息。如果你有分手的事情,像binlogs分区,重做/撤销分区B, C和分区表空间,那么你可以做一个组合的陆,和B,并使用InnoDB表TE。
2。对性能的影响是最小的,如果您的CPU AES硬件加速。你可以编译这个测试套件,写在大会,确定你的CPU支持AES。https://github.com/kmcallister/aesni-examples
谢谢
你能请让我们知道如何加密的表/或完整的数据库移动到其他服务器,使用语音。
如果我们改变主加密密钥(改变实例旋转INNODB主密钥;)它改变的关键
keyring_file_data = / mount / mysql-keyring /密匙环
你好@Srinivas。您可以导出加密的表空间。这是更多的手册信息,https://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace-encryption.html innodb-tablespace-encryption-exporting
是的,旋转主键修改密匙环内的加密密钥。
我用Galera,我为所有节点具有相同的密匙环,通过风场后续节点不能加入吗?
@Manuel。是的,你需要在所有节点相同的密匙环。你可能需要额外的参数传递给xtrabackup_v2 SST脚本。我不知道这个时候如果它可以处理加密的默认表空间。