14.14 InnoDB 静态数据加密

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

关于静态数据加密

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

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

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

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

  • keyring_encrypted_file将密钥环数据存储在服务器主机本地的加密文件中。

  • keyring_okv包含一个 KMIPClient 端(KMIP 1.1),该 Client 端使用兼容 KMIP 的产品作为密钥环存储的后端。支持的 KMIP 兼容产品包括集中式密钥 Management 解决方案,例如 Oracle Key Vault,Gemalto KeySecure,Thales Vormetric 密钥 Management 服务器和 Fornetix 密钥编排。

  • keyring_aws与 Amazon Web Services 密钥 Management 服务(AWS KMS)通信,以作为密钥生成的后端,并使用本地文件存储密钥。

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

  • 必须安装和配置密钥环插件。密钥环插件安装是在启动时使用early-plugin-load选项执行的。尽早加载可确保在初始化InnoDB存储引擎之前可以使用该插件。有关密钥环插件的安装和配置说明,请参阅第 6.4.4 节“ MySQL 密钥环”

一次只能启用一个 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 空间文件中的数据.*如果使用keyring_filekeyring_encrypted_file插件,请在创建第一个加密 table 空间之后,主密钥轮换之前立即创建密钥环数据文件的备份。主键旋转后。 keyring_file_data配置选项定义keyring_file插件的密钥环数据文件位置。 keyring_encrypted_file_data配置选项定义keyring_encrypted_file插件的密钥环数据文件位置。如果使用keyring_okvkeyring_aws插件,请确保已执行必要的配置。有关说明,请参见第 6.4.4 节“ MySQL 密钥环”

启用每 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选项更改现有 table 空间时,请进行适当的计划。该 table 是使用COPY算法重建的。不支持INPLACE算法。

  • 如果服务器在正常操作过程中退出或停止,建议使用与先前配置相同的加密设置重新启动服务器。

  • 当对第一个新的或现有的 table 空间进行加密时,将生成第一个主加密密钥。

  • 主密钥轮换会重新加密 table 空间密钥,但不会更改 table 空间密钥本身。要更改 table 空间密钥,必须禁用并重新启用加密,这是用于重建 table 的ALGORITHM=COPY操作。

  • 如果使用COMPRESSIONENCRYPTION选项创建 table,则在对 table 空间数据进行加密之前执行压缩。

  • 如果密钥环数据文件(以keyring_file_datakeyring_encrypted_file_data命名的文件)为空或丢失,则ALTER INSTANCE 旋转 INNODB 主密钥的首次执行将创建一个主加密密钥。

  • 卸载keyring_filekeyring_encrypted_file插件不会删除现有的密钥环数据文件。

  • 建议不要将密钥环数据文件与 table 空间数据文件放在同一目录下。

  • 在运行时或重新启动服务器时修改keyring_file_datakeyring_encrypted_file_data设置可能会导致无法访问以前加密的 table 空间,从而导致数据丢失。

Encryption Limitations

  • 高级加密标准(AES)是唯一受支持的加密算法。 InnoDB静态数据加密使用电子密码簿(ECB)块加密模式进行 table 空间密钥加密,并使用密码块链接(CBC)块加密模式进行数据加密。

  • 更改 table 的ENCRYPTION属性是使用COPY算法执行的。不支持INPLACE算法。

  • file-per-table个 table 空间支持加密。其他 table 空间类型(包括general tablespacessystem tablespace)不支持加密。

  • 您不能将 table 从加密的file-per-tabletable 空间移动或复制到不支持加密的 table 空间类型。

  • 加密仅适用于 table 空间中的数据。数据在重做日志,撤消日志或二进制日志中未加密。

  • 不允许更改驻留在加密 table 空间中或以前驻留在其中的 table 的存储引擎。

  • 添加FULLTEXT索引时隐式创建的InnoDB FULLTEXT索引 table 不支持加密。有关相关信息,请参见InnoDB 全文索引 table