10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

MySQL 8.0参考手册/InnoDB存储引擎/ InnoDB数据静止加密

15.13 InnoDB数据静止加密

InnoDB支持静态数据加密file-per-table表空间,一般表空间,mysql系统表空间、重做日志和撤消日志。

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

InnoDB本节中的以下主题将描述静止数据加密特性和功能。

对数据加密

InnoDB使用两层加密密钥体系结构,由主加密密钥和表空间密钥组成。当表空间被加密时,表空间密钥被加密并存储在表空间头中。当应用程序或经过身份验证的用户希望访问加密的表空间数据时,InnoDB使用主加密密钥解密表空间密钥。表空间密钥的解密版本永远不会改变,但是主加密密钥可以根据需要改变。此操作称为万能钥匙旋转

静止数据加密特性依赖于密匙环组件或插件进行主加密密钥管理。

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

MySQL企业版提供了额外的密匙环组件和插件:

  • component_keyring_encrypted_file:将密匙环数据保存在服务器主机本地的一个加密的、有密码保护的文件中。

  • keyring_encrypted_file:将密匙环数据保存在服务器主机本地的一个加密的、有密码保护的文件中。

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

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

  • keyring_hashicorp:与HashiCorp Vault通信,提供后端存储。

警告

对于加密密钥管理,需要使用component_keyring_file而且component_keyring_encrypted_file组件,keyring_file而且keyring_encrypted_file插件并不打算作为法规遵从性解决方案。诸如PCI、FIPS等安全标准要求使用密钥管理系统来保护、管理和保护密钥库或硬件安全模块(hms)中的加密密钥。

安全而健壮的加密密钥管理解决方案对于安全和遵从各种安全标准至关重要。当静止数据加密特性使用集中密钥管理解决方案时,该特性称为MySQL企业透明数据加密(TDE)

数据静止加密特性支持AES (Advanced encryption Standard)基于块的加密算法。表空间密钥加密采用ECB (Electronic Codebook)块加密方式,数据加密采用CBC (Cipher block chainaining)块加密方式。

有关静止数据加密特性的常见问题,请参见A.17节“MySQL 8.0常见问题:InnoDB Data-at-Rest加密”

加密的先决条件

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

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

    重要的

    一旦在MySQL实例中创建了加密表空间,在创建加密表空间时加载的密匙环组件或插件必须在启动时继续加载。如果不这样做,就会在启动服务器时和启动过程中出错InnoDB复苏。

  • 在对生产数据进行加密时,请确保采取措施防止主加密密钥丢失。如果主加密密钥丢失,存储在加密表空间文件中的数据将无法恢复。如果您使用component_keyring_filecomponent_keyring_encrypted_file组件,或keyring_filekeyring_encrypted_file插件,在创建第一个加密表空间之后,在主密钥旋转之前和主密钥旋转之后立即创建密匙环数据文件的备份。对于每个组件,其配置文件指示数据文件位置。的keyring_file_data配置选项定义密钥环数据文件的位置keyring_file插件。的keyring_encrypted_file_data配置选项定义密钥环数据文件的位置keyring_encrypted_file插件。如果您使用keyring_okvkeyring_aws插件,确保您已经执行了必要的配置。说明,请参阅第6.4.4节“MySQL Keyring”

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

从MySQL 8.0.16开始,default_table_encryption系统变量定义模式和通用表空间的默认加密设置。创建表空间而且创建模式业务应用default_table_encryption设置当一个加密子句没有明确指定。

改变模式而且修改表空间操作不应用default_table_encryption设置。一个加密子句必须显式指定,以更改现有模式或通用表空间的加密。

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

SET GLOBAL default_table_encryption=ON;

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

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

如果默认加密子句在创建模式时没有指定default_table_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在创建或更改模式或通用表空间时设置,或在创建或更改表时偏离默认模式加密。此特权不允许在创建或修改表时偏离通用表空间的加密。一个表必须具有与其所在的通用表空间相同的加密设置。

File-Per-Table表空间加密

从MySQL 8.0.16开始,每个表一个文件的表空间继承了创建表的模式的默认加密,除非加密子句中明确指定创建表声明。在MySQL 8.0.16之前,加密子句必须指定才能启用加密。

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

要更改现有的“逐表文件”表空间的加密,可以使用加密子句必须指定。

ALTER TABLE t1 ENCRYPTION = 'Y';

从MySQL 8.0.16开始,如果table_encryption_privilege_check变量,指定一个加密子句的设置与默认模式加密不同,需要TABLE_ENCRYPTION_ADMIN特权。看到为模式和通用表空间定义加密默认值

一般的表空间加密

从MySQL 8.0.16开始,default_table_encryption变量确定新创建的通用表空间的加密,除非加密子句在创建表空间声明。在MySQL 8.0.16之前,一个加密子句必须指定才能启用加密。

创建表空间“ts1”,添加数据文件“ts1”。ibd' ENCRYPTION = 'Y' Engine=InnoDB;

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

修改表空间ts1加密= 'Y';

从MySQL 8.0.16开始,如果table_encryption_privilege_check变量,指定一个加密子句的设置不同于default_table_encryption设置要求TABLE_ENCRYPTION_ADMIN特权。看到为模式和通用表空间定义加密默认值

Doublewrite文件加密

MySQL 8.0.23版本提供了对doublewrite文件的加密支持。InnoDB自动加密属于加密表空间的doublewrite文件页。无需执行该操作。使用关联表空间的加密密钥对双写文件页面进行加密。写入表空间数据文件的加密页也会写入doublewrite文件。属于未加密表空间的Doublewrite文件页仍然未加密。

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

mysql系统表空间加密

的加密支持mysqlMySQL 8.0.16版本的系统表空间可用。

mysql系统表空间包含mysql系统数据库和MySQL数据字典表。默认不加密。启用加密mysql系统表空间,指定表空间名称和加密选择在一个修改表空间声明。

mysql> ALTER TABLESPACE mysql ENCRYPTION = 'Y';

禁用加密mysql系统表空间、设置加密= ' N '使用一个修改表空间声明。

mysql表空间加密= 'N';

启用或禁用加密mysql系统表空间要求创建表空间实例中所有表上的特权(CREATE TABLESPACE on *.*)

重做日志加密

重做日志数据加密使用innodb_redo_log_encrypt配置选项。重做日志加密默认是禁用的。

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

innodb_redo_log_encrypt启用时,磁盘上未加密的重做日志页将保持不加密状态,新的重做日志页将以加密形式写入磁盘。同样地,当innodb_redo_log_encrypt禁用时,磁盘上的加密重做日志页将保持加密,新的重做日志页将以不加密的形式写入磁盘。

重做日志加密元数据,包括表空间加密密钥,存储在第一个重做日志文件(ib_logfile0).如果删除此文件,则禁用重做日志加密。

一旦启用重做日志加密,没有密匙环组件或插件或没有加密密钥的正常重启是不可能的InnoDB必须能够在启动过程中扫描重做日志页,如果重做日志页是加密的,这是不可能的。没有keyring组件或插件或加密密钥,只有没有重做日志的强制启动(SRV_FORCE_NO_LOG_REDO)是可能的。看到第15.21.2节“强制InnoDB恢复”

Undo日志加密

Undo日志数据加密已使用innodb_undo_log_encrypt配置选项。“Undo日志加密”应用于“Undo日志”撤消表空间.看到第15.6.3.4节“撤消表空间”.缺省情况下,取消日志数据加密功能。

与表空间数据一样,在将undo日志数据写入磁盘时进行undo日志数据加密,在从磁盘读取undo日志数据时进行解密。一旦将undo日志数据读入内存,它就是未加密的形式。Undo日志数据使用表空间加密密钥加密和解密。

innodb_undo_log_encrypt启用时,磁盘上未加密的撤消日志页将保持不加密,并且新的撤消日志页将以加密的形式写入磁盘。同样地,当innodb_undo_log_encrypt禁用时,磁盘上存在的加密的撤消日志页将保持加密,新的撤消日志页将以不加密的形式写入磁盘。

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

请注意

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

万能钥匙旋转

主加密密钥应该定期旋转,只要您怀疑密钥已被泄露。

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

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

旋转主加密密钥需要ENCRYPTION_KEY_ADMIN特权(或已弃用的超级特权)。

旋转主密钥,使用命令:

修改INNODB的主键

旋转innodb主键支持并发DML。但是,它不能与表空间加密操作并发运行,并且使用锁来防止并发执行可能产生的冲突。如果一个旋转innodb主键操作正在运行,那么它必须在表空间加密操作进行之前完成,反之亦然。

加密和恢复

如果在加密操作期间发生服务器故障,则在服务器重新启动时前滚该操作。对于一般表空间,加密操作在最后一个处理的页面的后台线程中恢复。

如果在旋转主键期间发生服务器故障,InnoDB继续对服务器重新启动的操作。

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

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

出口加密的表空间

表空间导出只支持每个表文件的表空间。

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

加密和复制

  • 旋转innodb主键语句只在源和副本运行支持表空间加密的MySQL版本的复制环境中被支持。

  • 成功的旋转innodb主键语句被写入二进制日志,以便在副本上复制。

  • 如果一个旋转innodb主键语句失败,它不会被记录到二进制日志中,也不会在副本上复制。

  • 复制一个旋转innodb主键如果密匙环组件或插件安装在源上而没有安装在副本上,则操作失败。

  • 如果keyring_filekeyring_encrypted_file插件安装在源文件和副本上,但是副本没有密匙环数据文件旋转innodb主键语句在副本上创建密匙环数据文件,假设密匙环文件数据没有缓存在内存中。旋转innodb主键使用缓存在内存中的密匙环文件数据(如果可用)。

识别加密的表空间和模式

INFORMATION_SCHEMA。INNODB_TABLESPACES表,在MySQL 8.0.13中引入了加密列,可用于标识加密的表空间。

SELECT SPACE, NAME, SPACE_TYPE, ENCRYPTION FROM INFORMATION_SCHEMA。INNODB_TABLESPACES加密= ' Y ' \ G  *************************** 1。行  *************************** 空间:4294967294姓名:mysql SPACE_TYPE:一般加密:Y  *************************** 2。行  *************************** 空间:2名:测试/ t1 SPACE_TYPE:单一加密:Y  *************************** 3所示。行  *************************** 空间:3名:壹空间SPACE_TYPE:一般加密:Y

加密选项中指定创建表ALTER TABLE语句,它被记录在CREATE_OPTIONS列的INFORMATION_SCHEMA。表.可以查询此列以识别驻留在加密的“每表文件”表空间中的表。

mysql> SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA。表中create_options如'% encryption %';+--------------+------------+----------------+ | TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS  | +--------------+------------+----------------+ | 测试| t1 |加密= " Y " | +--------------+------------+----------------+

查询INFORMATION_SCHEMA。INNODB_TABLESPACES检索有关与特定模式和表相关联的表空间的信息。

SELECT SPACE, NAME, SPACE_TYPE FROM information - schema。INNODB_TABLESPACES NAME = '测试/ t1 ';+-------+---------+------------+ | 空间名字| | SPACE_TYPE  | +-------+---------+------------+ | 3 |测试/ t1 |单身  | +-------+---------+------------+

方法可以识别启用加密的模式INFORMATION_SCHEMA。图式表格

mysql> SELECT SCHEMA_NAME, DEFAULT_ENCRYPTION FROM INFORMATION_SCHEMA。图式在DEFAULT_ENCRYPTION = '是的';+-------------+--------------------+ | SCHEMA_NAME | DEFAULT_ENCRYPTION  | +-------------+--------------------+ | 测试|是的  | +-------------+--------------------+

显示创建模式也显示了默认加密条款。

加密监测进展

可以监视一般表空间和mysql系统表空间加密进度使用性能模式

阶段/ innodb /更改表空间(加密)舞台事件仪器报告WORK_ESTIMATED而且WORK_COMPLETED用于一般表空间加密操作的信息。

下面的示例演示如何启用阶段/ innodb /更改表空间(加密)启动事件工具和相关使用者表来监视一般表空间或mysql系统表空间加密进度。有关性能模式阶段事件工具和相关使用者的信息,请参见第27.12.5节“性能方案阶段事件表”

  1. 启用阶段/ innodb /更改表空间(加密)仪器:

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

    mysql> UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
  3. 执行表空间加密操作。在本例中,通用表空间名为壹空间是加密的。

    修改表空间ts1加密= 'Y';
  4. 通过查询“性能架构”可以查看加密操作的进度events_stages_current表格WORK_ESTIMATED报告表空间中的页总数。WORK_COMPLETED报告已处理的页数。

    SELECT EVENT_NAME, WORK_ESTIMATED, WORK_COMPLETED FROM events_stages_current;+--------------------------------------------+----------------+----------------+ | EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED  | +--------------------------------------------+----------------+----------------+ | 阶段/ innodb /更改表空间(加密)| 1056 | 1407  | +--------------------------------------------+----------------+----------------+

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

    SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_history;+--------------------------------------------+----------------+----------------+ | EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED  | +--------------------------------------------+----------------+----------------+ | 阶段/ innodb /更改表空间(加密)| 1407 | 1407  | +--------------------------------------------+----------------+----------------+

加密使用笔记

  • 类修改现有的单文件表空间时,应进行适当的计划加密选择。方法重新构建表中文件表空间中的表复制算法。的原地算法在修改加密属性的通用表空间mysql系统表空间。的原地算法允许在通用表空间中的表上并发DML。并发DDL被阻塞。

  • 一般表空间或mysql系统表空间是加密的,所有表空间中的表都是加密的。同样,在加密表空间中创建的表也是加密的。

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

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

  • 主键旋转会重新加密表空间键,但不会改变表空间键本身。要更改表空间密钥,必须先禁用加密,然后重新启用加密。对于每个表文件的表空间,重新加密表空间是一个算法=复制重构表的操作。对于一般表空间和mysql系统表空间,它是一个算法=原地操作,该操作不需要重建驻留在表空间中的表。

  • 属性创建一个表压缩而且加密选项,在加密表空间数据之前执行压缩。

  • 如果密匙环数据文件(由keyring_file_datakeyring_encrypted_file_data)为空或缺失时,第一次执行旋转innodb主键创建主加密密钥。

  • 卸载component_keyring_filecomponent_keyring_encrypted_file组件不删除现有的密匙环数据文件。卸载keyring_filekeyring_encrypted_file插件不删除现有的密匙环数据文件。

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

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

  • 控件支持加密InnoDB全文类时隐式创建的索引全文索引,但只有当全文索引是在位于加密通用表空间中的表上创建的。在这种情况下,全文索引表在相同的加密通用表空间中创建。相关信息请参见InnoDB全文索引表

加密的局限性

  • 目前只支持AES (Advanced Encryption Standard)加密算法。InnoDB表空间加密使用ECB (Electronic Codebook)块加密方式对表空间密钥进行加密,使用CBC (Cipher block chainaining)块加密方式对数据进行加密。填充不用于CBC块加密模式。相反,InnoDB确保要加密的文本是块大小的倍数。

  • 加密只支持file-per-table表空间,一般表空间,mysql系统表空间。MySQL 8.0.13引入了对通用表空间的加密支持。的加密支持mysqlMySQL 8.0.16版本的系统表空间可用。的其他表空间类型不支持加密InnoDB系统表空间

  • 无法从加密的file-per-table表空间,一般表空间或mysql将系统表空间设置为不支持加密的表空间类型。

  • 不能将表从加密表空间移动或复制到未加密表空间。但是,允许将表从未加密的表空间移动到加密的表空间。例如,可以从未加密的表中移动或复制表file-per-table一般表空间到加密的通用表空间。

  • 缺省情况下,表空间加密功能只对表空间中的数据生效。通过启用,可以对重做日志和撤消日志数据进行加密innodb_redo_log_encrypt而且innodb_undo_log_encrypt.看到重做日志加密,Undo日志加密.有关二进制日志文件和中继日志文件加密的信息,请参见第17.3.2节“加密二进制日志文件和中继日志文件”

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