Documentation Home
MySQL 8.0 参考手册  / 第 15 章 InnoDB 存储引擎  /  14.14 InnoDB静态数据加密

14.14 InnoDB静态数据加密

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

关于静态数据加密

InnoDB使用两层加密密钥架构,由主加密密钥和表空间密钥组成。当表空间被加密时,表空间密钥被加密并存储在表空间头中。当应用程序或经过身份验证的用户想要访问加密数据时, InnoDB使用主加密密钥来解密表空间密钥。表空间密钥的解密版本永远不会改变,但可以根据需要更改主加密密钥。此操作称为主密钥轮换

静态数据加密功能依赖于用于主加密密钥管理的密钥环插件。

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

MySQL 企业版提供额外的密钥环插件:

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

  • keyring_okv:用于与 KMIP 兼容的后端密钥环存储产品一起使用的 KMIP 1.1 插件。受支持的 KMIP 兼容产品包括集中式密钥管理解决方案,例如 Oracle Key Vault、Gemalto KeySecure、Thales Vormetric 密钥管理服务器和 Fornetix Key Orchestration。

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

警告

对于加密密钥管理, keyring_filekeyring_encrypted_file插件并非旨在作为法规遵从性解决方案。PCI、FIPS 等安全标准要求使用密钥管理系统来保护、管理和保护密钥库或硬件安全模块 (HSM) 中的加密密钥。

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

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

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

加密先决条件

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

    一次只能启用一个密钥环插件。不支持启用多个密钥环插件,结果可能与预期不同。

    重要的

    early-plugin-load 一旦在 MySQL 实例中创建了加密表空间,创建加密表空间时加载的密钥环插件必须在启动时使用该选项 继续加载。不这样做会导致在启动服务器时和InnoDB恢复期间出错。

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

    mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
           FROM INFORMATION_SCHEMA.PLUGINS
           WHERE PLUGIN_NAME LIKE 'keyring%';
    +--------------+---------------+
    | PLUGIN_NAME  | PLUGIN_STATUS |
    +--------------+---------------+
    | keyring_file | ACTIVE        |
    +--------------+---------------+
  • 加密生产数据时,确保采取措施防止丢失主加密密钥。如果主加密密钥丢失,存储在加密表空间文件中的数据将无法恢复。如果您使用 keyring_fileor keyring_encrypted_file插件,请在创建第一个加密表空间之后、主密钥轮换之前和主密钥轮换之后立即创建密钥环数据文件的备份。keyring_file_data 配置选项定义keyring_file插件的 密钥环数据文件位置。keyring_encrypted_file_data 配置选项定义keyring_encrypted_file插件的 密钥环数据文件位置。如果您使用keyring_okvkeyring_aws插件,请确保您已执行必要的配置。有关说明,请参阅 第 6.4.4 节,“MySQL 密钥环”

启用 File-Per-Table 表空间加密

要为新的 file-per-table 表空间启用加密,请在语句中指定该ENCRYPTION选项 。CREATE TABLE以下示例假定 innodb_file_per_table已启用。

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

要为现有的 file-per-table 表空间启用加密,请在语句 中指定该ENCRYPTION选项 。ALTER TABLE

mysql> ALTER TABLE t1 ENCRYPTION='Y';

要禁用 file-per-table 表空间的加密,请 ENCRYPTION='N'使用ALTER TABLE.

mysql> ALTER TABLE t1 ENCRYPTION='N';

主密钥轮换

应定期轮换主加密密钥,并在您怀疑密钥已被泄露时进行轮换。

主密钥轮换是一个原子的、实例级的操作。每次轮换主加密密钥时,MySQL 实例中的所有表空间密钥都会重新加密并保存回各自的表空间标头。作为原子操作,一旦启动旋转操作,所有表空间密钥的重新加密必须成功。如果主密钥轮换因服务器故障而中断,InnoDB则在服务器重新启动时向前滚动操作。有关详细信息,请参阅 加密和恢复

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

轮换主加密密钥需要 SUPER特权。

要轮换主加密密钥,请运行:

mysql> ALTER INSTANCE ROTATE INNODB MASTER KEY;

ALTER INSTANCE ROTATE INNODB MASTER KEY支持并发 DML。但是,它不能与表空间加密操作并发运行,并采用锁定来防止并发执行可能引起的冲突。如果一个 ALTER INSTANCE ROTATE INNODB MASTER KEY操作正在运行,它必须在表空间加密操作可以继续之前完成,反之亦然。

加密和恢复

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

如果在主密钥轮换期间发生服务器故障, InnoDB则在服务器重新启动时继续操作。

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

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

导出加密表空间

导出加密表空间时, InnoDB生成用于加密表空间密钥的传输密钥。加密的表空间密钥和传输密钥存储在一个 tablespace_name.cfp 文件中。执行导入操作需要此文件和加密的表空间文件。导入时, InnoDB使用传输密钥解密 tablespace_name.cfp 文件中的表空间密钥。有关相关信息,请参阅 第 14.6.1.3 节,“导入 InnoDB 表”

加密和复制

识别加密表空间

当在or 语句ENCRYPTION中指定选项 时,它被记录在 的列中 。可以查询此列以识别驻留在加密的 file-per-table 表空间中的表。 CREATE TABLEALTER TABLECREATE_OPTIONSINFORMATION_SCHEMA.TABLES

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 以检索有关与特定模式和表关联的表空间的信息。

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在使用该选项 更改现有表空间时进行适当规划。使用该COPY算法重建该表。INPLACE不支持 该 算法。

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

  • 第一个主加密密钥在第一个新的或现有的表空间被加密时生成。

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

  • COMPRESSION 如果使用和 选项 创建表 ENCRYPTION ,则在加密表空间数据之前执行压缩。

  • 如果密钥环数据文件(由 keyring_file_data或 命名的文件keyring_encrypted_file_data)为空或丢失,则第一次执行 ALTER INSTANCE ROTATE INNODB MASTER KEY创建主加密密钥。

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

  • 建议您不要将密钥环数据文件放在与表空间数据文件相同的目录下。

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

加密限制

  • 高级加密标准 (AES) 是唯一受支持的加密算法。InnoDB静态数据加密使用电子密码本 (ECB) 块加密模式进行表空间密钥加密,使用密码块链接 (CBC) 块加密模式进行数据加密。填充不与 CBC 块加密模式一起使用。相反, InnoDB确保要加密的文本是块大小的倍数。

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

  • 加密仅支持 file-per-table 表 空间。其他表空间类型不支持加密,包括 通用表空间系统表空间

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

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

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

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