作者:Gopal Shankar 译:徐轶韬
MySQL 5.7.11引入了InnoDB表空间加密,该加密启用了对每表文件表空间的支持,此博客中将讨论此功能。
在MySQL 8.0.13中, 引入了通用表空间的加密。
为了提高加密处理的可用性,MySQL 8.0.16添加了几个功能,对模式,通用表空间或整个MySQL系统中的表启用,禁用和强制执行表加密。这些功能允许数据库管理员进行更精细的控制。以下各节通过示例讨论其中一些功能
1.加密发生在表空间级别
MySQL通过加密文件系统块,对表在存储级别进行加密。表空间不能混合使用加密和未加密的块。因此,表空间是未加密的或已加密的。MySQL对用户表支持两种类型的表空间。缺省值为file-per-table,每个表存储在单独的表空间中。第二种类型是通用表空间,可以在一个表空间中存储多个表。因此,通用表空间不能同时包含未加密表和已加密表。
在MySQL系统中,可以在多个级别上控制加密。加密发生在存储层。
用例1:我希望对系统中的所有表进行加密
我希望对系统中的所有表进行加密。这可以通过系统范围的配置设置default_table_encryption轻松实现。如果配置default_table_encryption ='y',所有新表都将被加密。在上图中,将在系统级别进行配置。有关如何检查的信息,请参见第2节。
用例2:我希望对模式中的所有表进行加密
我有一个模式,希望对模式中所有表进行加密。创建模式时,可以设置默认的加密属性。之后在模式中创建的所有表都将继承该模式的默认加密设置。从上图可以看出,如果为“ db1”配置了加密,则所有表都将对“file-per-table”表空间(例如“ ts1”)和通用表空间(例如“ ts2”)进行加密。有关更多详细信息,请参见第3和第4节。
用例3:我有一个通用表空间,并希望对其进行加密
我正在使用通用表空间,并且希望对表空间中的所有表进行加密。我们知道,通用表空间只能保存已加密或未加密的表。查看上图,我们希望对“ ts2”进行加密。因此,我们创建表空间并将其配置为加密。然后将创建模式“ db1”中的表“ t2”,并将其存储在“ ts2”中,因为已使用默认加密创建了“ db1”。在'db2'中创建'ts1'时,必须使用加密语句创建将存储在'ts2'中的表。有关更多详细信息,请参见第4节。
用例4:我想阻止覆盖默认加密设置
有一些子句可以覆盖默认的加密设置。我想禁止这种行为。从上图可以看出,'db1'设置了默认加密,'db2'未设置默认加密,并且'ts2'被创建为加密表空间,我想禁止在“ ts2”中创建一个来自'db2'的't1'。我们可以通过配置设置table_encryption_privilege_check = true 来实现这一点,它将要求服务器禁止覆盖加密设置。具有TABLE_ENCRYPTION_ADMIN权限的用户始终可以覆盖任何检查。有关更多详细信息,请参见第5节。
2. MySQL系统范围内的默认加密
MySQL 8.0.16提供了一个服务器系统变量default_table_encryption,在服务器启动时默认将其设置为“ n”。创建模式或通用表空间将继承此设置。例如,使用— default_table_encryption = true
通过此变量,可以在MySQL系统范围内创建加密表。当然,我们可以通过显式设置加密类型来覆盖继承设置,如下面的第3和4节所示。
注意:拥有SYSTEM_VARIABLES_ADMIN和TABLE_ENCRYPTION_ADMIN权限或SUPER权限的用户可以在运行时更改变量“ default_table_encryption”设置。
3.模式范围的加密默认值
创建或更改模式时,使用MySQL 8.0.16中引入的新的DEFAULT ENCRYPTION子句为模式设置默认的加密。例如:
在模式“ db1”下创建的任何表都将继承模式DEFAULT ENCRYPTION子句设置。
例如:
]我们可以通过在CREATE语句中显式设置默认表ENCRYPTION来覆盖它。尝试在使用DEFAULT ENCRYPTION ='Y'的模式下创建未加密表将生成警告。例如:
让我们假设我们已将模式'db1'与DEFAULT ENCRYPTION设置为'Y',并且我们想使用'db1'中的通用表空间创建一个表。MySQL希望用户使用加密的通用表空间。例如:
通过在CREATE TABLE中显式提供ENCRYPTION子句,可以使用未加密的通用表空间创建表。这将产生警告。例如:
5.强制表加密
上面您可能已经注意到,通过在创建表时为模式和ENCRYPTION子句明确提供DEFAULT ENCRYPTION子句,我们允许覆盖默认的加密设置。但是,某些用户/管理员希望严格执行加密以避免覆盖默认设置。MySQL 8.0.16提供了一个名为table_encryption_privilege_check的新服务器系统变量,可用于实施默认的加密设置。
MySQL的8.0.16提供了一个名为TABLE_ENCRYPTION_ADMIN的新权限,当用户启用table_encryption_privilege_check覆盖默认的加密设置时,需要使用该权限。
拥有SUPER权限的用户可以在运行时更改变量'table_encryption_privilege_check'。
让我们假设服务器使用— table_encryption_privilege_check = true和— default_table_encryption = true启动。并且未授予用户TABLE_ENCRYPTION_ADMIN权限。
a)尝试使用DEFAULT ENCRYPTION ='N'创建模式将引发错误。
b)尝试创建一个加密类型与模式加密不匹配的表也将导致类似的错误。例如:
c)尝试使用ENCRYPTION ='N'创建通用表空间将引发错误。
使用— table_encryption_privilege_check = true和— default_table_encryption = false,我们将看到强制实施禁止MySQL中的加密表。例如,如果用户尝试使用DEFAULT ENCRYPTION ='Y'创建数据库或使用ENCRYPTION ='Y'创建表,则命令将失败,并显示相应的错误消息。拥有TABLE_ENCRYPTION_ADMIN权限的用户将能够执行上面的语句。
关于加密控制的内容到此为止!请参考以下文档以获取更多信息。
https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-additionshttps://dev.mysql.com/doc/refman/8.0/en/innodb-tablespace-encryption.html
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_table_encryption
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_table_encryption_privilege_check
https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_table-encryption-admin
https://dev.mysql.com/doc/refman/8.0/en/create-database.html
https://dev.mysql.com/doc/refman/8.0/en/alter-database.html
https://dev.mysql.com/doc/refman/8.0/en/create-tablespace.html
https://dev.mysql.com/doc/refman/8.0/en/alter-tablespace.html
https://dev.mysql.com/doc/refman/8.0/en/create-table.html
https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
https://dev.mysql.com/doc/refman/8.0/en/schemata-table.html
https://dev.mysql.com/doc/refman/8.0/en/tables-table.html
感谢您使用MySQL!