文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  InnoDB 存储引擎  /  InnoDB 数据休眠加密

17.13 InnoDB 数据休眠加密

InnoDB 支持 每表文件 表空间、通用 表空间、mysql 系统表空间、重做日志和撤消日志的数据休眠加密。

您可以为架构和通用表空间设置加密默认值;这允许 DBA 控制在这些架构和表空间中创建的表是否被加密。

InnoDB 数据休眠加密功能和功能在本节中的以下主题下进行了描述。

关于数据休眠加密

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

数据休眠加密功能依赖于用于主加密密钥管理的密钥环组件或插件。

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

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

  • component_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_hashicorp: 与 HashiCorp Vault 通信以进行后端存储。

警告

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

安全可靠的加密密钥管理解决方案对于安全性和遵守各种安全标准至关重要。当数据休眠加密功能使用集中式密钥管理解决方案时,该功能称为 MySQL 企业版透明数据加密 (TDE).

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

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

加密先决条件

  • 必须在启动时安装和配置密钥环组件或插件。早期加载确保在初始化 InnoDB 存储引擎之前可用该组件或插件。有关密钥环安装和配置说明,请参见 第 8.4.4 节,“MySQL 密钥环”。说明显示了如何确保选择的组件或插件处于活动状态。

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

    重要

    在 MySQL 实例中创建加密表空间后,必须在启动时继续加载用于创建加密表空间的密钥环组件或插件。否则,在启动服务器和执行 InnoDB 恢复时会发生错误。

  • 加密生产数据时,请确保您采取措施防止丢失主加密密钥。如果丢失主加密密钥,则存储在加密表空间文件中的数据将无法恢复。如果您使用 component_keyring_filecomponent_keyring_encrypted_file 组件,请在创建第一个加密表空间后、主密钥轮换之前以及主密钥轮换之后立即备份密钥环数据文件。对于每个组件,其配置文件都指示数据文件位置。如果您使用 keyring_okvkeyring_aws 插件,请确保您已执行必要的配置。有关说明,请参阅 第 8.4.4 节,“MySQL 密钥环”

为模式和通用表空间定义加密默认值

default_table_encryption 系统变量定义模式和通用表空间的默认加密设置。CREATE TABLESPACECREATE SCHEMA 操作在未明确指定 ENCRYPTION 子句时应用 default_table_encryption 设置。

ALTER SCHEMAALTER TABLESPACE 操作不应用 default_table_encryption 设置。必须明确指定 ENCRYPTION 子句才能更改现有模式或通用表空间的加密。

default_table_encryption 变量可以为单个客户端连接设置,也可以使用 SET 语法全局设置。例如,以下语句在全局范围内启用默认模式和表空间加密

mysql> SET GLOBAL default_table_encryption=ON;

还可以使用 DEFAULT ENCRYPTION 子句在创建或更改模式时定义模式的默认加密设置,如下例所示

mysql> CREATE SCHEMA test DEFAULT ENCRYPTION = 'Y';

如果在创建模式时未指定 DEFAULT ENCRYPTION 子句,则应用 default_table_encryption 设置。必须指定 DEFAULT ENCRYPTION 子句才能更改现有模式的默认加密。否则,模式将保留其当前加密设置。

默认情况下,表将继承其创建所在的模式或通用表空间的加密设置。例如,在启用加密的模式中创建的表默认情况下将被加密。此行为使 DBA 能够通过定义和强制执行模式和通用表空间加密默认值来控制表加密的使用。

通过启用 table_encryption_privilege_check 系统变量来强制执行加密默认值。当 table_encryption_privilege_check 启用时,在创建或更改具有与 default_table_encryption 设置不同的加密设置的模式或通用表空间时,或在创建或更改具有与默认模式加密不同的加密设置的表时,将进行权限检查。当 table_encryption_privilege_check 禁用(默认值)时,不会执行权限检查,并且上述操作将被允许继续执行,并显示警告。

需要 TABLE_ENCRYPTION_ADMIN 权限才能在启用 table_encryption_privilege_check 时覆盖默认加密设置。DBA 可以授予此权限,使用户能够在创建或更改模式或通用表空间时偏离 default_table_encryption 设置,或者在创建或更改表时偏离默认模式加密。此权限不允许在创建或更改表时偏离通用表空间的加密。表必须与它所在的通用表空间具有相同的加密设置。

每个表文件表空间加密

每个表文件表空间继承创建表的模式的默认加密,除非在 CREATE TABLE 语句中明确指定了 ENCRYPTION 子句。

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

要更改现有每个表文件表空间的加密,必须指定 ENCRYPTION 子句。

mysql> ALTER TABLE t1 ENCRYPTION = 'Y';

如果启用了 table_encryption_privilege_check,则指定具有与默认模式加密不同的设置的 ENCRYPTION 子句需要 TABLE_ENCRYPTION_ADMIN 权限。请参阅 为模式和通用表空间定义加密默认值

通用表空间加密

default_table_encryption 变量决定新创建的通用表空间的加密,除非在 CREATE TABLESPACE 语句中明确指定了 ENCRYPTION 子句。

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' ENCRYPTION = 'Y' Engine=InnoDB;

要更改现有通用表空间的加密,必须指定 ENCRYPTION 子句。

mysql> ALTER TABLESPACE ts1 ENCRYPTION = 'Y';

如果启用了 table_encryption_privilege_check,则指定具有与 default_table_encryption 设置不同的设置的 ENCRYPTION 子句需要 TABLE_ENCRYPTION_ADMIN 权限。请参阅 为模式和通用表空间定义加密默认值

双写文件加密

在 MySQL 8.4 中,InnoDB 会自动加密属于加密表空间的双写文件页面。不需要采取任何操作。双写文件页面使用关联表空间的加密密钥进行加密。写入表空间数据文件的相同加密页面也会写入双写文件。属于未加密表空间的双写文件页面将保持未加密状态。

在恢复期间,加密的双写文件页面将被解密,并检查是否有损坏。

mysql 系统表空间加密

mysql 系统表空间包含 mysql 系统数据库和 MySQL 数据字典表。默认情况下,它是未加密的。要为 mysql 系统表空间启用加密,请在 ALTER TABLESPACE 语句中指定表空间名称和 ENCRYPTION 选项。

mysql> ALTER TABLESPACE mysql ENCRYPTION = 'Y';

要禁用 mysql 系统表空间的加密,请使用 ALTER TABLESPACE 语句将 ENCRYPTION 设置为 'N'

mysql> ALTER TABLESPACE mysql ENCRYPTION = 'N';

启用或禁用 mysql 系统表空间的加密需要对实例中的所有表具有 CREATE TABLESPACE 权限 (CREATE TABLESPACE on *.*)

重做日志加密

重做日志数据加密使用 innodb_redo_log_encrypt 配置选项启用。默认情况下,重做日志加密处于禁用状态。

与表空间数据一样,重做日志数据加密在重做日志数据写入磁盘时发生,解密在重做日志数据从磁盘读取时发生。重做日志数据读入内存后,将以未加密的形式存在。重做日志数据使用表空间加密密钥进行加密和解密。

启用 innodb_redo_log_encrypt 后,磁盘上存在的未加密重做日志页面将保持未加密状态,新的重做日志页面将以加密形式写入磁盘。同样,禁用 innodb_redo_log_encrypt 后,磁盘上存在的加密重做日志页面将保持加密状态,新的重做日志页面将以未加密形式写入磁盘。

重做日志加密元数据(包括表空间加密密钥)存储在具有最新检查点 LSN 的重做日志文件头中。如果删除了包含加密元数据的重做日志文件,则重做日志加密将被禁用。

启用重做日志加密后,无法在没有密钥环组件或插件或没有加密密钥的情况下正常重启,因为 InnoDB 必须能够在启动时扫描重做页面,而如果重做日志页面被加密,则无法执行此操作。如果没有密钥环组件或插件或加密密钥,则只能执行不使用重做日志的强制启动 (SRV_FORCE_NO_LOG_REDO)。请参阅 第 17.20.3 节,“强制 InnoDB 恢复”

撤消日志加密

撤消日志数据加密使用 innodb_undo_log_encrypt 配置选项启用。撤消日志加密适用于位于 撤消表空间 中的撤消日志。请参阅 第 17.6.3.4 节,“撤消表空间”。默认情况下,撤消日志数据加密处于禁用状态。

与表空间数据一样,撤消日志数据加密在撤消日志数据写入磁盘时发生,解密在撤消日志数据从磁盘读取时发生。撤消日志数据读入内存后,将以未加密的形式存在。撤消日志数据使用表空间加密密钥进行加密和解密。

启用 innodb_undo_log_encrypt 后,磁盘上存在的未加密撤消日志页面将保持未加密状态,新的撤消日志页面将以加密形式写入磁盘。同样,禁用 innodb_undo_log_encrypt 后,磁盘上存在的加密撤消日志页面将保持加密状态,新的撤消日志页面将以未加密形式写入磁盘。

撤消日志加密元数据(包括表空间加密密钥)存储在撤消日志文件头中。

注意

禁用撤消日志加密后,服务器将继续需要用于加密撤消日志数据的密钥环组件或插件,直到包含加密撤消日志数据的撤消表空间被截断。(仅在撤消表空间被截断时,撤消表空间中的加密头才会被删除。)有关截断撤消表空间的信息,请参阅 截断撤消表空间

主密钥轮换

应定期轮换主加密密钥,以及在怀疑密钥被泄露时轮换主加密密钥。

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

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

轮换主加密密钥需要 ENCRYPTION_KEY_ADMIN 权限(或已弃用的 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 文件中的表空间密钥。有关相关信息,请参阅 第 17.6.1.3 节,“导入 InnoDB 表”

加密和复制

识别加密的表空间和模式

Information Schema INNODB_TABLESPACES 表包含一个 ENCRYPTION 列,可用于识别加密的表空间。

mysql> SELECT SPACE, NAME, SPACE_TYPE, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
       WHERE ENCRYPTION='Y'\G
*************************** 1. row ***************************
     SPACE: 4294967294
      NAME: mysql
SPACE_TYPE: General
ENCRYPTION: Y
*************************** 2. row ***************************
     SPACE: 2
      NAME: test/t1
SPACE_TYPE: Single
ENCRYPTION: Y
*************************** 3. row ***************************
     SPACE: 3
      NAME: ts1
SPACE_TYPE: General
ENCRYPTION: Y

当在 CREATE TABLEALTER TABLE 语句中指定 ENCRYPTION 选项时,它将记录在 INFORMATION_SCHEMA.TABLESCREATE_OPTIONS 列中。可以通过查询此列来识别位于加密的每个表文件表空间中的表。

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

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

可以通过查询 Information Schema SCHEMATA 表来识别启用加密的模式。

mysql> SELECT SCHEMA_NAME, DEFAULT_ENCRYPTION FROM INFORMATION_SCHEMA.SCHEMATA
       WHERE DEFAULT_ENCRYPTION='YES';
+-------------+--------------------+
| SCHEMA_NAME | DEFAULT_ENCRYPTION |
+-------------+--------------------+
| test        | YES                |
+-------------+--------------------+

SHOW CREATE SCHEMA 还显示 DEFAULT ENCRYPTION 子句。

监控加密进度

可以使用 性能模式 监控普通表空间和 mysql 系统表空间加密进度。

stage/innodb/alter tablespace (encryption) 阶段事件仪表报告普通表空间加密操作的 WORK_ESTIMATEDWORK_COMPLETED 信息。

以下示例演示了如何启用 stage/innodb/alter tablespace (encryption) 阶段事件仪表及其相关的使用者表,以监控普通表空间或 mysql 系统表空间加密进度。有关性能模式阶段事件仪表及其相关使用者的信息,请参阅 第 29.12.5 节,“性能模式阶段事件表”

  1. 启用 stage/innodb/alter tablespace (encryption) 仪表

    mysql> USE performance_schema;
    mysql> UPDATE setup_instruments SET ENABLED = 'YES'
           WHERE NAME LIKE 'stage/innodb/alter tablespace (encryption)';
  2. 启用阶段事件使用者表,其中包括 events_stages_currentevents_stages_historyevents_stages_history_long

    mysql> UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
  3. 运行表空间加密操作。在本示例中,名为 ts1 的普通表空间被加密。

    mysql> ALTER TABLESPACE ts1 ENCRYPTION = 'Y';
  4. 通过查询性能模式 events_stages_current 表来检查加密操作的进度。 WORK_ESTIMATED 报告表空间中的页面总数。 WORK_COMPLETED 报告已处理的页面数。

    mysql> SELECT EVENT_NAME, WORK_ESTIMATED, WORK_COMPLETED FROM events_stages_current;
    +--------------------------------------------+----------------+----------------+
    | EVENT_NAME                                 | WORK_COMPLETED | WORK_ESTIMATED |
    +--------------------------------------------+----------------+----------------+
    | stage/innodb/alter tablespace (encryption) |           1056 |           1407 |
    +--------------------------------------------+----------------+----------------+

    如果加密操作已完成,则 events_stages_current 表将返回空集。在这种情况下,可以检查 events_stages_history 表以查看已完成操作的事件数据。例如

    mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_history;
    +--------------------------------------------+----------------+----------------+
    | EVENT_NAME                                 | WORK_COMPLETED | WORK_ESTIMATED |
    +--------------------------------------------+----------------+----------------+
    | stage/innodb/alter tablespace (encryption) |           1407 |           1407 |
    +--------------------------------------------+----------------+----------------+

加密使用注意事项

  • 使用 ENCRYPTION 选项更改现有每个表文件表空间时,请适当地进行计划。位于每个表文件表空间中的表将使用 COPY 算法重建。当更改普通表空间或 mysql 系统表空间的 ENCRYPTION 属性时,将使用 INPLACE 算法。 INPLACE 算法允许对位于普通表空间中的表进行并发 DML。并发 DDL 将被阻止。

  • 当加密普通表空间或 mysql 系统表空间时,所有位于表空间中的表都会被加密。同样,在加密的表空间中创建的表也会被加密。

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

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

  • 主密钥轮换会重新加密表空间密钥,但不会更改表空间密钥本身。要更改表空间密钥,必须禁用并重新启用加密。对于每个表文件表空间,重新加密表空间是一个 ALGORITHM=COPY 操作,它会重建该表。对于普通表空间和 mysql 系统表空间,它是一个 ALGORITHM=INPLACE 操作,不需要重建位于表空间中的表。

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

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

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

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

加密限制

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

  • 仅支持对 每个表文件 表空间、普通 表空间和 mysql 系统表空间进行加密。不支持对其他表空间类型进行加密,包括 InnoDB 系统表空间

  • 您不能将表从加密的 每个表文件 表空间、普通 表空间或 mysql 系统表空间移动或复制到不支持加密的表空间类型。

  • 您不能将表从加密的表空间移动或复制到未加密的表空间。但是,允许将表从未加密的表空间移动到加密的表空间。例如,您可以将表从未加密的 每个表文件普通 表空间移动或复制到加密的普通表空间。

  • 默认情况下,表空间加密仅应用于表空间中的数据。可以通过启用 innodb_redo_log_encryptinnodb_undo_log_encrypt 来加密重做日志和撤消日志数据。有关重做日志加密和撤消日志加密的更多信息,请参见 重做日志加密撤消日志加密。有关二进制日志文件和中继日志文件加密的信息,请参见 第 19.3.2 节“加密二进制日志文件和中继日志文件”.

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