MySQL 5.7.11 представил прозрачное шифрование табличного пространства InnoDB, которое включило поддержку табличных пространств файлов на таблицы, и эта функция обсуждается в этом блоге.
Позже в MySQL 8.0.13 было введено шифрование для общего табличного пространства.
Чтобы улучшить удобство обработки шифрования, MySQL 8.0.16 добавил несколько функций для включения, отключения и применения шифрования таблиц для таблиц в схеме, общем табличном пространстве или во всей системе MySQL. Это позволяет более детально управлять администраторами баз данных. В следующих разделах обсуждаются некоторые из этих функций с примерами.
MySQL шифрует таблицы на уровне хранилища, шифруя содержимое блоков файловой системы. Табличное пространство не может иметь смесь зашифрованных и незашифрованных блоков. Таким образом, табличное пространство является либо незашифрованным, либо зашифрованным. Для пользовательских таблиц MySQL поддерживает два типа табличного пространства. По умолчанию используются табличные пространства файлов на таблицы, где каждая таблица хранится в отдельном табличном пространстве. Второй тип – это общее табличное пространство, где несколько таблиц могут храниться в одном табличном пространстве. Из этого следует, что обычные табличные пространства не могут иметь смесь незашифрованных и зашифрованных таблиц.
Мы хотим, чтобы все таблицы в нашей системе были зашифрованы. Этого легко добиться с помощью общесистемного параметра конфигурации default_table_encryption. Если вы настроите default_table_encryption = ‘y’, все новые таблицы будут зашифрованы. На рисунке выше это будет конфигурация на системном уровне. См. Раздел 2 о том, как это проверить.
У нас есть схема, где мы хотим, чтобы все наши таблицы были зашифрованы. При создании схемы можно установить атрибут шифрования по умолчанию. Все таблицы, созданные в схеме, будут наследовать этот параметр шифрования схемы по умолчанию. Если посмотреть на рисунок выше, если шифрование настроено для ‘db1’, все таблицы будут зашифрованы как для табличных пространств файлов на таблицы, например, для ‘ts1’, так и для общих табличных пространств, таких как ‘ts2’. Смотрите разделы 3 и 4 для более подробной информации.
Мы используем общие табличные пространства и хотим, чтобы все таблицы в табличном пространстве были зашифрованы. Мы знаем, что общее табличное пространство может содержать только те таблицы, которые зашифрованы или не зашифрованы. Глядя на рисунок выше, мы хотим, чтобы ‘ts2’ был зашифрован. Поэтому мы создаем табличное пространство и настраиваем его для шифрования. Таблица ‘t2’ из схемы ‘db1’ будет затем создана и сохранена в ‘ts2’ в зашифрованном виде, поскольку ‘db1’ создана с установленным шифрованием по умолчанию. При создании «ts1» в «db2» необходимо добавить условие шифрования, чтобы успешно создать таблицу, которая будет храниться в «ts2». Смотрите раздел 4 для более подробной информации.
Есть пункты, чтобы переопределить настройки шифрования по умолчанию. мы хотим запретить любое изменение этих настроек. Глядя на рисунок выше, для «db1» установлено шифрование по умолчанию, для «db2» шифрование по умолчанию не установлено, а «ts2» создается как зашифрованное табличное пространство, мы хотим запретить создание «t1» из «db2» в “t2”. Мы можем добиться этого с помощью параметра конфигурации – table_encryption_privilege_check = true, который попросит сервер запретить переопределение параметра шифрования. Пользователи с привилегией TABLE_ENCRYPTION_ADMIN всегда могут переопределить любую проверку. Смотрите раздел 5 для более подробной информации.
MySQL 8.0.16 предоставляет системную переменную сервера default_table_encryption, которая по умолчанию имеет значение «n» при запуске сервера. Создание схемы или общего табличного пространства унаследует этот параметр. Например, с – default_table_encryption = true
$ CREATE SCHEMA db1; $ SHOW CREATE SCHEMA db1; |Database |Create Database |- |db1 |CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='Y' */
$ CREATE TABLESPACE ts2 ADD DATAFILE 'df1.ibd'; $ SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME LIKE 'ts2'; |NAME |ENCRYPTION |- |ts2 |Y
Эта переменная позволяет создавать зашифрованные таблицы во всей системе MySQL. Конечно, мы можем переопределить наследование настройки, явно указав тип шифрования, как показано в разделах 3. и 4. ниже.
Шифрование по умолчанию для схемы устанавливается с использованием нового предложения DEFAULT ENCRYPTION, введенного в MySQL 8.0.16 при создании или изменении схемы. Например:
CREATE SCHEMA db1 DEFAULT ENCRYPTION='y';
Любая таблица, созданная в схеме ‘db1’, будет наследовать параметр предложения схемы DEFAULT ENCRYPTION.
Например:
$ CREATE TABLE db1.t1 (f1 int); $ SHOW CREATE TABLE db1.t1; |Table |Create Table |- |t1 |CREATE TABLE `t1` ( `f1` int DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ENCRYPTION='Y' $ SELECT TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1'; |TABLE_NAME |CREATE_OPTIONS |- |t1 |ENCRYPTION='Y'
Мы можем переопределить таблицу ENCRYPTION по умолчанию, явно указав ее в своем операторе CREATE. Попытки создать незашифрованную таблицу в схеме с DEFAULT ENCRYPTION = ‘Y’ вызовут предупреждение. Например:
$ CREATE TABLE db1.t4 (f1 int) ENCRYPTION='n'; # Предупреждения: # Предупреждение 3824 Создание незашифрованной таблицы в базе данных # с включенным шифрованием по умолчанию.
Предположим, у нас есть схема ‘db1’ с DEFAULT ENCRYPTION, установленной в ‘Y’, и мы хотим создать таблицу с использованием общего табличного пространства в ‘db1’. MySQL ожидает, что пользователи будут использовать зашифрованное общее табличное пространство. Например:
$ CREATE TABLESPACE ts2 ADD DATAFILE 'df1.ibd' ENCRYPTION='y'; $ CREATE SCHEMA db1 DEFAULT ENCRYPTION='y'; $ CREATE TABLE db1.t2 (f1 int) TABLESPACE=ts2; $ SHOW CREATE TABLE db1.t2; |Table |Create Table |- |t2 |CREATE TABLE `t2` ( `f1` int DEFAULT NULL ) /*!50100 TABLESPACE `ts2` */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!80016 ENCRYPTION='Y' * $ SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME LIKE 'ts2'; |NAME |ENCRYPTION |- |ts2 |Y
Можно создать таблицу, используя незашифрованное общее табличное пространство, явно указав предложение ENCRYPTION в CREATE TABLE. Это сгенерирует предупреждение. Например:
$ CREATE TABLESPACE ts4 ADD DATAFILE 'df1.ibd' ENCRYPTION='n'; $ CREATE SCHEMA db1 DEFAULT ENCRYPTION='y'; $ CREATE TABLE db1.t1 (f1 int) TABLESPACE=ts4 ENCRYPTION='n'; # Предупреждения: # Предупреждение 3824 создание незашифрованной таблицы в базе данных # с включенным шифрованием по умолчанию.
Вы, возможно, заметили выше, что мы разрешаем переопределить настройку шифрования по умолчанию, явно предоставив условие DEFAULT ENCRYPTION для схемы и предложение ENCRYPTION при создании таблиц. Однако некоторые пользователи/администраторы хотят, чтобы строгое соблюдение правил не нарушало настройки по умолчанию. MySQL 8.0.16 предоставляет новую системную переменную сервера с именем table_encryption_privilege_check, которую можно использовать для применения настроек шифрования по умолчанию.
MySQL 8.0.16 предоставляет новую привилегию с именем TABLE_ENCRYPTION_ADMIN, которая должна быть предоставлена пользователям, которым необходимо переопределить параметры шифрования по умолчанию, когда включена опция table_encryption_privilege_check .
Переменная ‘table_encryption_privilege_check’ может быть изменена во время выполнения пользователями, которые владеют привилегией SUPER.
Предположим, сервер запущен с – table_encryption_privilege_check = true и – default_table_encryption = true. И пользователю не предоставляется привилегия TABLE_ENCRYPTION_ADMIN.
а) Попытка создать схему с DEFAULT ENCRYPTION = ‘N’ приведет к ошибке.
$ CREATE SCHEMA db1 DEFAULT ENCRYPTION='n'; # ERROR HY000: Database default encryption differ # из настроек 'default_table_encryption' # пользователь не имеет достаточных привилегий.
б) Попытка создать таблицу с типом шифрования, который не соответствует схеме шифрования, также приведет к аналогичной ошибке. Например:
$ CREATE SCHEMA db1; -- Uses DEFAULT ENCRYPTION='y' because -- 'default_table_encryption' is true $ CREATE TABLE db1.t1 (f1 int) ENCRYPTION='n'; # ERROR HY000: Шифрование таблиц отличается от шифрования # базы данных по умолчанию, и пользователь не имеет # достаточных привилегий.
c) Попытка создать общее табличное пространство с ENCRYPTION = ‘N’ приведет к ошибке.
$ CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd' ENCRYPTION='n'; # ERROR HY000: Шифрование табличного пространства отличается от настройки # 'default_table_encryption', и пользователь # не имеет достаточных привилегий.
С – table_encryption_privilege_check = true и – default_table_encryption = false, мы увидим подобное принудительное запрещение зашифрованных таблиц в MySQL. Например, если пользователь пытается создать базу данных с DEFAULT ENCRYPTION = ‘Y’ или создать таблицу с ENCRYPTION = ‘Y’, команда завершится ошибкой с соответствующими сообщениями об ошибках. Пользователь, которому принадлежит привилегия TABLE_ENCRYPTION_ADMIN, сможет выполнять вышеуказанные операторы, отменяя проверки привилегий.