Шифрование хранимых данных в MySQL 5.7

Для защиты конфиденциальных данных в MySQL 5.7 появилась функция шифрования данных при помощи движка InnoDB. В данной статье я объясню принципы шифрования баз данных, используя конкретные примеры.

Шифрование на уровне базы данных

Шифрование всей системы может быть неоправданно дорогим, когда необходимо защитить лишь часть данных. Также не возможно настроить код и разработать механизм шифрования на уровне приложения. В таких случаях важно использовать шифрование на уровне базы.

Шифрование данных в MySQL 5,7 имеет в себя следующие преимущества:

  • Надежное шифрование AES-256 для таблиц InnoDB;
  • Прозрачное для приложений. Отсутствие кода для приложения, схемы. Нет необходимости изменять тип данных;
  • Прозрачное для администраторов баз данных. Ключи не управляются администраторами баз данных;
  • Управление ключами. Ключи можно легко безопасно хранить отдельно от данных, а смена ключей будет простой.

MySQL 5.7 свойственно шифрование только таблиц InnoDB, при этом остаются открытыми следующие файлы: binlogs, redo logs, relay logs, slow log, error log, general log, и audit log.

Ещё один заслуживающий внимания фактор — защита главного ключа внутри ключевого файла. Если главный ключ будет составным, то механизм безопасности данных открыт для утечек. Решить проблему можно поместив файл ключа в раздел, который может быть отключен при запуске MySQL(каталог, подключаемый только во время запуска базы данных). Важно не потерять ключевой файл вместе с главным ключом, поскольку не будут осуществлено шифрование базы данных MySQL.

Пример

Начнем с того, что разрешим шифрование MySQL, добавив следующие настройки в файл конфигурации my.cnf.

[mysqld]early-plugin-load=keyring_file.sokeyring_file_data=/var/lib/mysql/keyring

Следующим шагом будет запуск службы и проверка активности плагина.

mysql> SELECT plugin_name, plugin_statusFROM INFORMATION_SCHEMA.PLUGINSWHERE plugin_name LIKE 'keyring%';+--------------+---------------+| plugin_name | plugin_status |+--------------+---------------+| keyring_file | ACTIVE |+--------------+---------------+

Мы также можем проверить параметра шифрования баз данных.

mysql> show global variables like '%keyring%';+-------------------+------------------------+| Variable_name | Value |+-------------------+------------------------+| keyring_file_data | /var/lib/mysql/keyring |+-------------------+------------------------+

Чтобы зашифровать таблицы в InnoDB, следует убедиться в том, что настройка innodb_file_per_table включен( ON).

mysql> show global variables like 'innodb_file_per_table';+-----------------------+-------+| Variable_name         | Value |+-----------------------+-------+| innodb_file_per_table | ON    |+-----------------------+-------+

Если этот настройка выключен(OFF), необходимо добавить следующие настройки для файла конфигурации my.cnf, и перезапустить службу.

[mysqld]innodb_file_per_table=ON

Рассмотрим шифрование базы данных MySQL в действии. Создадим таблицу для хранения конфиденциальных данных.

mysql> CREATE TABLE sample_db.sensitive_data_tb( id int primary key auto_increment, payload varchar(256)) engine=innodb;

Добавляем строку к таблице.

mysql> INSERT INTO sample_db.sensitive_data_tb(payload)VALUES('Private sensitive data');

Используем команду strings, чтобы извлечь каждую строку символов в двоичном файле, который относится к таблице sensitive_data_tb.

$ strings /var/lib/mysql/sample_db/sensitive_data_tb.ibdinfimumsupremumPrivate sensitive data

Также можно проверить, что ключевой файл пуст(нет главного ключа).

$ cat /var/lib/mysql/keyring

Чтобы использовать шифрование баз данных в таблице sensitive_data_tb, необходимо сменить таблицу.

mysql> ALTER TABLE sample_db.sensitive_data_tb encryption='Y';

Если мы попытаемся вывести таблицу sensitive_data_tb, то увидим, что сейчас данные зашифрованы, и их невозможно увидеть из файловой системы.

$ strings /var/lib/mysql/sample_db/sensitive_data_tb.ibdbbf7aee4-a14a-11e6-8d4c-080027001884{i<|4wRMt_

Хотя мы не можем видеть данные из файловой системы, их можно без труда увидеть из MySQL, используя традиционный оператор SQL.

mysql> SELECT * FROM sample_db.sensitive_data_tb;+----+------------------------+| id | payload                |+----+------------------------+|  1 | Private sensitive data |+----+------------------------+

Также можно проверить, что главный ключ генерируется в MySQL.

$ cat /var/lib/mysql/keyringKeyring file version:1 XXXX

Можно легко сменить главный ключ шифрования базы данных MySQL, выполнив инструкцию alter instance.

mysql> alter instance rotate innodb master key;

Можно легко верифицировать смены ключа, проверив временную отметку ключевого файла.

$ ls -al /var/lib/mysql/keyring

Просмотреть список зашифрованных таблиц, можно выполнив запрос.

mysql> SELECT *FROM information_schema.tablesWHERE create_options LIKE '%ENCRYPTION="Y"%';

Заключение

В данной статье я объяснил принципы шифрования данных на уровне базы в новой версии MySQL. Также я продемонстрировал их на реальных примерах. Сейчас вы можете без труда применять данные принципы и приведенные примеры для защиты конфиденциальной информации.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *