【MySQL精通之路】InnoDB静态数据加密(13)

【MySQL精通之路】InnoDB静态数据加密(13)

码农世界 2024-05-27 前端 74 次浏览 0个评论

目录

1.关于静止数据加密

2.加密先决条件

3.为库和通用表空间定义加密默认值

4.FPT表空间加密

5.通用表空间加密

6.Doublewrite文件加密

7.mysql系统表空间加密

8.redolog日志加密

9.undolog日志加密

10.主密钥轮转

11.加密和恢复

12.导出加密的表空间

13.加密和复制

14.识别加密的表空间和库

15.监视加密进度

16.加密使用说明

17.加密限制


InnoDB支持按FPT表空间、通用表空间、mysql系统表空间、redolog日志和undolog日志的静态数据加密。

从MySQL 8.0.16开始,还支持为库和通用表空间设置加密默认值,这允许DBA控制在这些库和表空间中创建的表是否加密。

InnoDB静态数据加密特性和功能在本节的以下主题中进行了描述。

1.关于静止数据加密

InnoDB使用两层加密密钥体系结构,由主加密密钥和表空间密钥组成。

当表空间被加密时,表空间密钥被加密并存储在表空间头中。

当应用程序或经过身份验证的用户想要访问加密的表空间数据时,InnoDB使用主加密密钥来解密表空间密钥。

表空间密钥的解密版本永远不会更改,但可以根据需要更改主加密密钥。此动作称为主钥匙轮转。

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

所有MySQL版本都提供component_keyring_file组件和keyring-file插件,每个插件都将keyring数据存储在服务器主机的本地文件中。

MySQL Enterprise Edition提供了额外的密钥环组件和插件:

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

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

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

keyring_aws:作为密钥生成的后端与Amazon Web Services密钥管理服务(aws KMS)通信,并使用本地文件进行密钥存储。博主PS:阿里云等同类厂商有相同KMS产品可以选购~

keyring_hashicorp:与hashicorp Vault通信以进行后端存储。


警告:

对于加密密钥管理,component_keyring_file和component_keyring_encrypted_file组件,以及keyring_file和keyring_encryptod_file插件不是法规遵从性解决方案。

PCI、FIPS等安全标准要求使用密钥管理系统来保护、管理和保护密钥库或硬件安全模块(HSM)中的加密密钥。

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

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

有关静态数据加密功能的常见问题,

请参阅“MySQL 8.0常见问题解答:InnoDB静止数据加密”。

2.加密先决条件

必须在启动时安装和配置密钥环组件或插件。早期加载可确保组件或插件在初始化InnoDB存储引擎之前可用。

有关密钥环的安装和配置说明,请参阅“MySQL密钥环”。

说明显示了如何确保所选组件或插件处于活动状态。

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

重要:

一旦在MySQL实例中创建了加密的表空间,创建加密表空间时加载的密钥环组件或插件必须在启动时继续加载。如果不这样做,则会在启动服务器和InnoDB恢复期间导致错误。

加密生产数据时,请确保采取措施防止丢失主加密密钥。如果主加密密钥丢失,则存储在加密表空间文件中的数据是不可恢复的。如果使用component_keyring_file或component_keyring_encrypted_file组件,或者使用keyring_file或keyring_encryptod_file插件,请在创建第一个加密表空间之后、主密钥轮转之前和主密钥轮转之后立即创建密钥环数据文件的备份。

对于每个组件,其配置文件指示数据文件的位置。keyring_file_data配置选项定义keyring_file插件的keyring数据文件位置。

keyring_encrypted_file_data配置选项定义keyring_ncrypted_file插件的keyring数据文件位置。

如果使用keyring_okv或keyring_aws插件,请确保执行了必要的配置。

有关说明,请参阅“MySQL密钥环”。

3.为库和通用表空间定义加密默认值

从MySQL 8.0.16开始,default_table_encryption系统变量定义了库和常规表空间的默认加密设置。

当未显式指定encryption子句时,CREATE TABLESPACE和CREATE SCHEMA操作将应用default_table_encryption设置。

ALTER SCHEMA和ALTER 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_privilege_check时,需要TABLE_ENCRYPTION_ADMIN权限来覆盖默认加密设置。

DBA可以授予此权限,使用户在创建或更改库或通用表空间时可以修改default_table_encryption设置,或者在创建或修改表时可以设置默认模式加密。

在创建或更改表时,此权限不允许设置通用表空间的加密。表必须具有与其所在的通用表空间相同的加密设置。

4.FPT表空间加密

从MySQL 8.0.16开始,除非在CREATE TABLE语句中显式指定了encryption子句,否则每个表空间的文件将继承创建表的库的默认加密。

在MySQL 8.0.16之前,必须指定ENCRYPTION子句才能启用加密。

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

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

mysql> ALTER TABLE t1 ENCRYPTION = 'Y';

从MySQL 8.0.16开始,如果启用了table_encryption_privilege_check变量,则使用与默认库加密不同的设置,指定encryption子句需要TABLE_ENCRYPTION_ADMIN 权限。

请参阅第三节 为库和通用空间定义加密默认值。

5.通用表空间加密

从MySQL 8.0.16开始,default_table_encryption变量决定新创建的通用表空间的加密,除非在CREATE tablespace语句中显式指定了encryption子句。在MySQL 8.0.16之前,必须指定ENCRYPTION子句才能启用加密。

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

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

mysql> ALTER TABLESPACE ts1 ENCRYPTION = 'Y';

从MySQL 8.0.16开始,如果启用了table_encryption_privilege_check变量,则使用与default_table_encryption设置不同的设置指定encryption子句需要TABLE_ENCRYPTION_ADMIN 权限。请参阅为库和通用表空间定义加密默认值。

6.Doublewrite文件加密

从MySQL 8.0.23开始提供对双写文件的加密支持。InnoDB会自动加密属于加密表空间的双写文件页。无需执行任何操作。双写文件页使用关联表空间的加密密钥进行加密。写入表空间数据文件的同一加密页也写入双写文件。属于未加密表空间的双写文件页保持未加密状态。

在恢复过程中,加密的双写文件页将解密并检查是否损坏。

7.mysql系统表空间加密

mysql 8.0.16版本提供了对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 TABLESSPACE)。

8.redolog日志加密

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

与表空间数据一样,当将redolog日志数据写入磁盘时,会对redolog日志数据进行加密。

当从磁盘读取redolog日志数据时,会进行解密。一旦redolog日志数据被读取到内存中,它就会以未加密的形式出现。

redolog日志数据会使用表空间加密密钥进行加密和解密。

当innodb_redo_log_encrypt被启用时,磁盘上存在的未加密redolog日志页保持未加密状态,并且新的redolog日志页以加密的形式写入磁盘。

同样,当innodb_redo_log-encrypt处于禁用状态时,磁盘中存在的加密重做日志页面保持加密状态,而新的redolog日志记录页以未加密的形式被写入磁盘。

从MySQL 8.0.30中,redolog日志加密元数据,包括表空间加密密钥,存储在具有最新检查点LSN的redolog日志文件的头中。

在MySQL 8.0.30之前,redolog日志加密元数据,包括表空间加密密钥,存储在第一个redolog日志文件(ib_logfile0)的头中。如果删除了包含加密元数据的redolog日志文件,则会禁用redolog日志加密。

一旦启用了redolog日志加密,就不可能在没有密钥环组件或插件或没有加密密钥的情况下正常重启,因为InnoDB必须能够在启动期间扫描重做页面,如果redolog日志页面被加密,这是不可能的。如果没有密钥环组件或插件或加密密钥,则只能在没有redolog日志(SRV_FORCE_NO_LOG_redo)的情况下强制启动。

请参阅“强制InnoDB恢复”。

9.undolog日志加密

使用innodb_undo_log_encrypt配置选项启用撤消日志数据加密。

undolog日志加密适用于位于undolog表空间中的undolog日志。

参见“undolog表空间”。

默认情况下,“undolog日志数据加密”处于禁用状态。

与表空间数据一样,当将undolog日志数据写入磁盘时,会对undolog日志数据进行加密,当从磁盘读取undolog日志数据时,会进行解密。

一旦undolog日志数据被读取到内存中,它就会以未加密的形式出现。undolog日志数据会使用表空间加密密钥进行加密和解密。

启用innodb_undo_log_encrypt时,磁盘上未加密的undolog日志页将保持未加密状态,并且新的undolog日志页面将以加密的形式写入磁盘。

同样,禁用innodb_endo_log_encorypt后,磁盘上已加密的undolog记录页将保持加密状态,而新的undolog记录页面将以未加密的方式写入磁盘。

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

10.主密钥轮转

主加密密钥应定期轮换,只要怀疑密钥已被泄露。

主密钥旋转是一种原子级实例级操作。

每次轮换主加密密钥时,MySQL实例中的所有表空间密钥都会重新加密并保存回各自的表空间头中。

作为一种原子操作,一旦启动轮转操作,所有表空间密钥的重新加密必须成功。

如果主密钥轮转因服务器故障而中断,InnoDB会在服务器重新启动时向前滚动操作。

有关更多信息,请参阅11节加密和恢复。

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

轮转主加密密钥需要 ENCRYPTION_KEY_ADMIN权限(或不推荐使用的SUPER权限)。

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

mysql> ALTER INSTANCE ROTATE INNODB MASTER KEY;

ALTER INSTANCE ROTATE INNODB MASTER KEY支持并发DML。

但是,它不能与表空间加密操作同时运行,并且采取锁来防止并发执行可能产生的冲突。

如果正在运行ALTER INSTANCE ROTATE INNODB MASTER KEY操作,则必须先完成该操作,然后表空间加密操作才能继续,反之亦然。

11.加密和恢复

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

对于通用表空间,加密操作在后台线程中从最后处理的页面恢复。

如果在主密钥轮转过程中发生服务器故障,InnoDB将在服务器重新启动时继续操作。

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

当InnoDB初始化和恢复开始时,主密钥旋转操作将恢复。

由于服务器故障,一些表空间密钥可能已经使用新的主加密密钥进行了加密。

InnoDB从每个表空间头读取加密数据,如果数据表明表空间密钥是使用旧的主加密密钥加密的,则InnoDB从密钥环中检索旧密钥并使用它来解密表空间密钥。

InnoDB然后使用新的主加密密钥对表空间密钥进行重新加密,并将重新加密的表空间密钥保存回表空间头中。

12.导出加密的表空间

表空间导出仅支持FPT表空间。

当导出加密的表空间时,InnoDB会生成一个传输密钥,用于加密表空间密钥。

加密的表空间密钥和传输密钥存储在tablespace_name.cfp文件中。

这个文件和加密的表空间文件是执行导入操作所必需的。导入时,InnoDB使用传输密钥解密tablespace_name.cfp文件中的表空间密钥。

有关相关信息,请参阅“导入InnoDB表”。

13.加密和复制

只有在源和副本运行支持表空间加密的MySQL版本的复制环境中,才支持ALTER INSTANCE ROTATE INNODB MASTER KEY语句。

成功的ALTER INSTANCE ROTATE INNODB MASTER KEY语句会写入binlog日志,以便在副本上进行复制。

如果ALTER INSTANCE ROTATE INNODB MASTER KEY语句失败,则不会将其记录到binlog日志中,也不会在副本上进行复制。

如果密钥环组件或插件安装在源上,但未安装在副本上,则ALTER INSTANCE ROTATE INNODB MASTER KEY操作的复制将失败。

如果在源和复制副本上都安装了keyring_file或keyring_encrypted_file插件,但复制副本没有keyring数据文件,则复制节点的ALTER INSTANCE ROTATE INNODB MASTER KEY语句会在复制副本上创建keyring数据文件,假设keyring文件数据未缓存在内存中。

ALTER INSTANCE ROTATE INNODB MASTER KEY使用缓存在内存中的密钥环文件数据(如果可用)。

14.识别加密的表空间和库

MySQL 8.0.13中引入的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 TABLE或ALTER TABLE语句中指定ENCRYPTION选项时,它会记录在INFORMATION_SCHEMA库的TABLES表的CREATE_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子句。

15.监视加密进度

您可以使用Performance Schema库来监控通用表空间和mysql系统表空间的加密进度。

stage/innodb/alter表空间(加密)stage事件工具报告用于通用表空间加密操作的WORK_ESTIMATED和WORK_COMPLETED信息。

下面的示例演示了如何启用stage/innodb/alter表空间(加密)stage事件工具和相关的consumer表来监控通用表空间或mysql系统表空间的加密进度。

有关Performance Schema库stage-event-instruments和相关consumers的信息,请参阅“Performance Schema库stage-event表”。

1.启用stage/innodb/alter表空间(加密)工具:

mysql> USE performance_schema;
mysql> UPDATE setup_instruments SET ENABLED = 'YES'
       WHERE NAME LIKE 'stage/innodb/alter tablespace (encryption)';

2.启用stage-event-consumers表,其中包括events_stages\ucurrent、events_stages_history和events_stages_history_long。

mysql> UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';

3.运行表空间加密操作。在本例中,对名为ts1的通用表空间进行了加密。

mysql> ALTER TABLESPACE ts1 ENCRYPTION = 'Y';

4.通过查询Performance Schema库events_stages_current表来检查加密操作的进度。WORK_ESTMATED表示表空间中的页面总数。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 |
+--------------------------------------------+----------------+----------------+

16.加密使用说明

        在使用ENCRYPTION选项更改FPT表空间时应该进行适当的计划。

驻留在FPT表空间中的表使用COPY算法重建。

INPLACE算法用于更改通用表空间或mysql系统表空间的ENCRYPTION属性。

INPLACE算法允许对驻留在通用表空间中的表执行并发DML。并发DDL被阻止。

当一个通用表空间或mysql系统表空间被加密时,驻留在该表空间中的所有表都被加密。

同样,在加密表空间中创建的表也是加密的。

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

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

主密钥轮转会重新加密表空间密钥,但不会更改表空间密钥本身。

要更改表空间密钥,必须禁用并重新启用加密。

对于FPT表空间,重新加密表空间是一个重新构建表的ALGORITHM=COPY操作。

对于通用表空间和mysql系统表空间,这是一个ALGORITHM=INPLACE操作,不需要重新构建位于表空间中的表。

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

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

卸载component_keyring_file或component_keyring _encrypted_file组件不会删除现有的keyring数据文件。

卸载keyring_file或keyring_encrypted_file插件不会删除现有的keyring数据文件。

建议不要将keyring数据文件与表空间数据文件放在同一目录下。

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

InnoDB FULLTEXT索引表支持加密,这些表是在添加FULLTEXT索引时隐式创建的。有关信息,

请参见InnoDB全文索引表。

17.加密限制

高级加密标准(AES)是唯一受支持的加密算法。

InnoDB表空间加密使用电子代码簿(ECB)块加密模式进行表空间密钥加密

使用密码块链接(CBC)块加密方式进行数据加密。

填充不与CBC块加密模式一起使用。

相反,InnoDB确保要加密的文本是块大小的倍数。

加密仅支持FPT表空间、通用表空间和mysql系统表空间。

MySQL 8.0.13中引入了对通用表空间的加密支持。

mysql 8.0.16版本提供了对mysql系统表空间的加密支持。

加密不支持其他表空间类型,包括InnoDB系统表空间。

不能将FPT表空间、通用表空间或mysql系统表空间的加密文件中的表移动或复制到不支持加密的表空间类型。

不能将表从加密表空间移动或复制到未加密表空间。

但是,允许将表从未加密的表空间移动到加密的表。例如,您可以将表从FPT或通用表空间的未加密文件移动或复制到加密的通用表空间。

默认情况下,表空间加密仅适用于表空间中的数据。

通过启用innodb_redo_log_encrypt和innodb_undo_log_excrypt,可以对redolog日志和undolog日志数据进行加密。

请参阅redolog日志加密和undolog日志加密。有关binlog日志文件和relaylog日志文件加密的信息,

请参阅“加密binlog日志文件与relay日志文件”。

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

转载请注明来自码农世界,本文标题:《【MySQL精通之路】InnoDB静态数据加密(13)》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,74人围观)参与讨论

还没有评论,来说两句吧...

Top