14.14 InnoDB 静态数据加密

InnoDB支持file-per-tabletable 空间的静态数据加密。

关于静态数据加密

InnoDB使用两层加密密钥体系结构,包括主加密密钥和 table 空间密钥。对 table 空间进行加密时,table 空间密钥将被加密并存储在 table 空间 Headers 中。当应用程序或经过身份验证的用户想要访问加密的数据时,InnoDB使用主加密密钥来解密 table 空间密钥。table 空间密钥的解密版本从不更改,但是可以根据需要更改主加密密钥。此操作称为主键旋转

静态数据加密功能依赖于密钥环插件进行主加密密钥 Management。

所有 MySQL 版本均提供keyring_file插件,该插件将密钥环数据存储在服务器主机本地的文件中。

MySQL Enterprise Edition 提供了其他密钥环插件:

Warning

keyring_filekeyring_encrypted file插件不能用作法规遵从性解决方案。诸如 PCI,FIPS 等安全标准要求使用密钥 Management 系统来保护,Management 和保护密钥库或硬件安全模块(HSM)中的加密密钥。

安全且强大的加密密钥 Management 解决方案对于安全性以及对各种安全标准的遵守至关重要。当静态数据加密功能使用集中式密钥 Management 解决方案时,该功能称为“ MySQL 企业透明数据加密(TDE)”。

静态数据加密功能支持基于高级加密标准(AES)块的加密算法。它使用电子密码簿(ECB)块加密模式进行 table 空间密钥加密,并使用密码块链接(CBC)块加密模式进行数据加密。

有关静态数据加密功能的常见问题,请参阅第 A.17 节“ MySQL 5.7 FAQ:InnoDB 静态数据加密”

Encryption Prerequisites

一次只能启用一个 Keyring 插件。不支持启用多个密钥环插件。

Important

在 MySQL 实例中创建加密 table 空间后,创建加密 table 空间时加载的密钥环插件必须在启动时 continue 使用early-plugin-load选项加载。否则,启动服务器时和InnoDB恢复期间将导致错误。

要验证钥匙圈插件是否处于活动状态,请使用SHOW PLUGINS语句或查询INFORMATION_SCHEMA.PLUGINStable。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE 'keyring%';
+--------------+---------------+
| PLUGIN_NAME  | PLUGIN_STATUS |
+--------------+---------------+
| keyring_file | ACTIVE        |
+--------------+---------------+

启用每 table 文件 table 空间加密

要为新的每 table 文件 table 空间启用加密,请在CREATE TABLE语句中指定ENCRYPTION选项。以下示例假定启用了innodb_file_per_table

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

要为现有的每 table 文件 table 空间启用加密,请在ALTER TABLE语句中指定ENCRYPTION选项。

mysql> ALTER TABLE t1 ENCRYPTION='Y';

要禁用每 table 文件 table 空间的加密,请使用ALTER TABLE设置ENCRYPTION='N'

mysql> ALTER TABLE t1 ENCRYPTION='N';

主键旋转

应定期旋转主加密密钥,并且每当怀疑密钥已被破坏时都应旋转。

主键旋转是原子的,实例级的操作。每次旋转主加密密钥时,MySQL 实例中的所有 table 空间密钥都会被重新加密并保存回它们各自的 table 空间头中。作为原子操作,一旦启动旋转操作,所有 table 空间密钥的重新加密都必须成功。如果服务器故障中断了主密钥旋转,则InnoDB在服务器重新启动时将操作向前滚动。有关更多信息,请参见加密与恢复

旋转主加密密钥仅更改主加密密钥并重新加密 table 空间密钥。它不会解密或重新加密关联的 table 空间数据。

旋转主加密密钥需要SUPER特权。

要旋转主加密密钥,请运行:

mysql> ALTER INSTANCE ROTATE INNODB MASTER KEY;

ALTER INSTANCE 旋转 INNODB 主密钥支持并发 DML。但是,它不能与 table 空间加密操作并发运行,并且采取了锁定措施以防止可能由于并发执行而引起冲突。如果ALTER INSTANCE 旋转 INNODB 主密钥操作正在运行,则它必须先完成,然后才能进行 table 空间加密操作,反之亦然。

加密和恢复

如果在加密操作期间发生服务器故障,则在重新启动服务器时将前滚操作。

如果在主密钥旋转期间发生服务器故障,则InnoDB在服务器重新启动时 continue 操作。

必须在存储引擎初始化之前加载密钥环插件,以便在InnoDB初始化和恢复活动访问 table 空间数据之前,可以从 table 空间头中检索解密 table 空间数据页所需的信息。 (请参阅Encryption Prerequisites。)

InnoDB初始化和恢复开始后,主键旋转操作将恢复。由于服务器故障,某些 table 空间密钥可能已经使用新的主加密密钥进行了加密。 InnoDB从每个 table 空间 Headers 中读取加密数据,如果数据 table 明使用旧的主加密密钥对 table 空间密钥进行了加密,则InnoDB从密钥环中检索旧密钥,并使用它来解密 table 空间密钥。 InnoDB然后使用新的主加密密钥重新加密 table 空间密钥,并将重新加密的 table 空间密钥保存回 table 空间 Headers。

导出加密的 table 空间

导出加密的 table 空间时,InnoDB生成一个传输密钥,用于对 table 空间密钥进行加密。加密的 table 空间密钥和传输密钥存储在tablespace_name.cfp文件中。该文件与加密的 table 空间文件一起执行导入操作是必需的。导入时,InnoDB使用传输密钥解密tablespace_name.cfp文件中的 table 空间密钥。有关相关信息,请参见第 14.6.1.3 节“导入 InnoDBtable”

加密和复制

识别加密的 table 空间

CREATE TABLEALTER TABLE语句中指定ENCRYPTION选项时,它记录在INFORMATION_SCHEMA.TABLESCREATE_OPTIONS列中。可以查询此列以标识驻留在每 table 加密文件 table 空间中的 table。

mysql> SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES
       WHERE CREATE_OPTIONS LIKE '%ENCRYPTION%';
+--------------+------------+----------------+
| TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |
+--------------+------------+----------------+
| test         | t1         | ENCRYPTION="Y" |
+--------------+------------+----------------+

查询INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES以检索有关与特定架构和 table 关联的 table 空间的信息。

mysql> SELECT SPACE, NAME, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE NAME='test/t1';
+-------+---------+------------+
| SPACE | NAME    | SPACE_TYPE |
+-------+---------+------------+
|     3 | test/t1 | Single     |
+-------+---------+------------+

加密使用说明

Encryption Limitations

首页