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_file
或component_keyring_encrypted_file
组件,或keyring_file
或keyring_encrypted_file
插件,在创建第一个加密表空间之后,在主密钥旋转之前和主密钥旋转之后立即创建密匙环数据文件的备份。对于每个组件,其配置文件指示数据文件位置。的keyring_file_data
配置选项定义密钥环数据文件的位置keyring_file
插件。的keyring_encrypted_file_data
配置选项定义密钥环数据文件的位置keyring_encrypted_file
插件。如果您使用keyring_okv
或keyring_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
在创建或更改模式或通用表空间时设置,或在创建或更改表时偏离默认模式加密。此特权不允许在创建或修改表时偏离通用表空间的加密。一个表必须具有与其所在的通用表空间相同的加密设置。
从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
特权。看到为模式和通用表空间定义加密默认值.
MySQL 8.0.23版本提供了对doublewrite文件的加密支持。InnoDB
自动加密属于加密表空间的doublewrite文件页。无需执行该操作。使用关联表空间的加密密钥对双写文件页面进行加密。写入表空间数据文件的加密页也会写入doublewrite文件。属于未加密表空间的Doublewrite文件页仍然未加密。
在恢复期间,加密的双写文件页将不加密并检查是否损坏。
的加密支持mysql
MySQL 8.0.16版本的系统表空间可用。
的mysql
系统表空间包含mysql
系统数据库和MySQL数据字典表。默认不加密。启用加密mysql
系统表空间,指定表空间名称和加密
的选项修改表空间
声明。
mysql> ALTER TABLESPACE mysql ENCRYPTION = 'Y';
禁用加密mysql
系统表空间,set加密= ' 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日志数据加密已使用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表空间的信息,请参见截断Undo表空间.
主加密密钥应该定期旋转,只要您怀疑密钥已被泄露。
主键旋转是一个原子的实例级操作。每次旋转主加密密钥时,MySQL实例中的所有表空间密钥都被重新加密并保存回各自的表空间头文件中。作为原子操作,一旦启动旋转操作,所有表空间密钥的重新加密必须成功。如果主密钥旋转因服务器故障而中断,InnoDB
在服务器重新启动时前滚操作。有关更多信息,请参见加密与恢复.
旋转主加密密钥只会更改主加密密钥并重新加密表空间密钥。它不解密或重新加密关联的表空间数据。
旋转主加密密钥需要ENCRYPTION_KEY_ADMIN
特权(或已弃用的超级
特权)。
旋转主密钥,使用命令:
修改INNODB的主键
旋转innodb主键
支持并发DML。但是,它不能与表空间加密操作并发运行,并且使用锁来防止并发执行可能产生的冲突。如果一个旋转innodb主键
操作正在运行,那么它必须在表空间加密操作进行之前完成,反之亦然。
如果在加密操作期间发生服务器故障,则在服务器重新启动时前滚该操作。对于一般表空间,加密操作在最后一个处理的页面的后台线程中恢复。
如果在旋转主键期间发生服务器故障,InnoDB
继续对服务器重新启动的操作。
必须在存储引擎初始化之前加载密匙环组件或插件,以便可以在初始化之前从表空间头中检索解密表空间数据页所需的信息InnoDB
初始化和恢复活动访问表空间数据。(见加密的先决条件.)
当InnoDB
初始化和恢复开始,主键旋转操作恢复。由于服务器故障,一些表空间密钥可能已经使用新的主加密密钥进行了加密。InnoDB
从每个表空间头读取加密数据,如果数据表明表空间密钥使用旧的主加密密钥加密,InnoDB
从密匙环检索旧密匙,并使用它解密表空间密匙。InnoDB
然后使用新的主加密密钥重新加密表空间密钥,并将重新加密的表空间密钥保存回表空间头。
表空间导出只支持每个表文件的表空间。
导出加密表空间时,InnoDB
生成一个转移的关键用于加密表空间密钥。加密的表空间密钥和传输密钥存储在
文件。执行导入操作需要该文件和加密的表空间文件。进口,tablespace_name
.cfpInnoDB
文件中的表空间密钥使用传输密钥解密
文件。相关信息请参见第15.6.1.3节“导入InnoDB表”.tablespace_name
.cfp
的
旋转innodb主键
语句只在源和副本运行支持表空间加密的MySQL版本的复制环境中被支持。成功的
旋转innodb主键
语句被写入二进制日志,以便在副本上复制。如果一个
旋转innodb主键
语句失败,它不会被记录到二进制日志中,也不会在副本上复制。复制
旋转innodb主键
如果密匙环组件或插件安装在源上而没有安装在副本上,则操作失败。如果
keyring_file
或keyring_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 WHERE NAME='test/t1';+-------+---------+------------+ | 空间名字| | SPACE_TYPE | +-------+---------+------------+ | 3 |测试/ t1 |单身 | +-------+---------+------------+
方法可以识别启用加密的模式INFORMATION_SCHEMA。图式
表格
mysql> SELECT SCHEMA_NAME, DEFAULT_ENCRYPTION FROM INFORMATION_SCHEMA。default_encryption =' yes ';+-------------+--------------------+ | SCHEMA_NAME | DEFAULT_ENCRYPTION | +-------------+--------------------+ | 测试|是的 | +-------------+--------------------+
显示创建模式
还显示默认加密
条款。
可以监视一般表空间和mysql
系统表空间加密进度使用性能模式.
的/innodb/alter表空间加密
舞台事件仪器报告WORK_ESTIMATED
而且WORK_COMPLETED
用于一般表空间加密操作的信息。
下面的示例演示如何启用/innodb/alter表空间加密
启动事件工具和相关使用者表来监视一般表空间或mysql
系统表空间加密进度。有关性能模式阶段事件工具和相关使用者的信息,请参见第27.12.5节“性能方案阶段事件表”.
启用
/innodb/alter表空间加密
仪器:mysql>使用性能模式;mysql> UPDATE setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/alter tablespace (encryption)';
启用阶段事件使用者表,其中包括
events_stages_current
,events_stages_history
,events_stages_history_long
.mysql> UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
执行表空间加密操作。在本例中,通用表空间名为
壹空间
是加密的。修改表空间ts1加密= 'Y';
通过查询“性能架构”可以查看加密操作的进度
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_data
或keyring_encrypted_file_data
)为空或缺失时,第一次执行旋转innodb主键
创建主加密密钥。卸载
component_keyring_file
或component_keyring_encrypted_file
组件不删除现有的密匙环数据文件。卸载keyring_file
或keyring_encrypted_file
插件不删除现有的密匙环数据文件。建议不要将密匙环数据文件与表空间数据文件放在同一目录下。
修改
keyring_file_data
或keyring_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引入了对通用表空间的加密支持。的加密支持mysql
MySQL 8.0.16版本的系统表空间可用。的其他表空间类型不支持加密InnoDB
系统表空间.无法从加密的file-per-table表空间,一般表空间,或
mysql
将系统表空间设置为不支持加密的表空间类型。不能将表从加密表空间移动或复制到未加密表空间。但是,允许将表从未加密的表空间移动到加密的表空间。例如,可以从未加密的表中移动或复制表file-per-table或一般表空间到加密的通用表空间。
缺省情况下,表空间加密功能只对表空间中的数据生效。通过启用,可以对重做日志和撤消日志数据进行加密
innodb_redo_log_encrypt
而且innodb_undo_log_encrypt
.看到重做日志加密,取消日志加密.有关二进制日志文件和中继日志文件加密的信息,请参见第17.3.2节“加密二进制日志文件和中继日志文件”.不允许更改位于或以前位于加密表空间中的表的存储引擎。