MySQL道普請便り

第174回MySQLのデータ暗号化いろいろ

MySQLでは、テーブルやredoログといったさまざまなファイルのデータ暗号化をサポートしています。特にMySQL 8.0以降はInnoDBに関するデータ暗号化の機能が多く追加されました。今回は、暗号化可能なファイルについてと、その対応バージョンなどを紹介したいと思います。

はじめに

MySQLで対応しているデータ暗号化と、その対応バージョンは以下のとおりです(注意:対応しているバージョンについてはMySQL 5.6を起点としています⁠⁠。

ターゲット スコープ MySQL バージョン
暗号化関数 MySQL全体 MySQL 5.6以降
テーブル InnoDB MySQL 5.7以降
redoログ(innodb_log_file) InnoDB MySQL 8.0.1以降
undoログ InnoDB MySQL 8.0.1以降
一般テーブルスペース InnoDB MySQL 8.0.13以降
バイナリログ・リレーログ MySQL全体 MySQL 8.0.14以降
mysqlスキーマ InnoDB MySQL 8.0.16以降
ダブルライトバッファ InnoDB MySQL 8.0.23以降

概要

これらの暗号化についての概要を簡単に説明したいと思います。

前提

暗号化関数以外のデータ暗号化方式は、事前にキーリングプラグインをインストールしておく必要があります。詳しくは6.4.4 MySQL キーリングをご確認ください。

MySQL設定ファイル(my.cnf)のパラメータearly-plugin-loadkeyring_file.soを設定します。

early-plugin-load=keyring_file.so

マスター暗号化キーとテーブルスペースキーで構成される2層暗号化キーアーキテクチャを使用します。アプリケーションがデータにアクセスする場合、マスター暗号化キーを使用してテーブルスペースキーを復号化します。そのため、マスター暗号化キーの管理が必要になります。マスター暗号化キーが失われた場合、暗号化されたファイルのデータはリカバリできなくなりますので、お気をつけください。

また、マスター暗号化キーは定期的またはキーの漏洩の疑いがある場合にローテーションする必要があります。

ローテーションするためのコマンド例
mysql> ALTER INSTANCE ROTATE BINLOG MASTER KEY;

mysql> ALTER INSTANCE ROTATE INNODB MASTER KEY;

詳しくは、マスターキーのローテーション17.3.2.3 バイナリログマスターキーのローテーションをご確認ください。

暗号化関数

  • AES_ENCRYPT関数 …データの暗号化
  • AES_DECRYPT関数 …データの復号化

MySQL 8.0以降では、これらの関数にてAES (Advanced Encryption Standard) アルゴリズムを使用したデータの暗号化、および復号化が使用できます。

MySQL 5.7以前では、DES_ENCRYPT関数,DES_DECRYPT関数やENCRYPT関数といった暗号化関数もサポートされていましたが、MySQL 8.0では削除されています。そのため、ENCRYPT関数の場合はSHA2関数を、DES_ENCRYPT関数、DES_DECRYPT関数はAES_ENCRYPT関数、AES_DECRYPT関数を使用することが推奨されています。

InnoDBテーブル

InnoDBのテーブル暗号化はTDE(透過的データベース暗号化)と呼ばれ、MySQL 5.7以降でサポートされています。暗号化を有効化するには、新規テーブルではCREATE TABLE構文、既存テーブルではALTER TABLE構文にENCRYPTION=Yを指定します。

mysql> CREATE TABLE t (col INT KEY) ENCRYPTION='Y';

mysql> ALTER TABLE t ENCRYPTION='N';

また、MySQL 8.0.16以降ではデータベースにENCRYPTION=Yを指定をすることで、ENCRYPTION句がなくてもテーブルが作成されるデータベースのデフォルトの暗号化を継承することができます。

mysql> CREATE DATABASE db1 ENCRYPTION='Y';

redoログとundoログ

redoログとundoログはMySQL 8.0リリース時からサポートされています。redoログはパラメータinnodb_redo_log_encryptをONに変更することで有効になります。デフォルトはOFFです。undoログはパラメータinnodb_undo_log_encryptをONに変更することで有効になります。デフォルトはOFFです。

一般テーブルスペース、mysqlスキーマ

一般テーブルスペースとmysqlスキーマの暗号化についても、ENCRYPTION=Yを指定することで設定可能です。

一般テーブルスペース

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' ENCRYPTION = 'Y' Engine=InnoDB;

また、パラメータdefault_table_encryptionをONに変更することで、ENCRYPTION句が明示的に指定されていない場合でも、暗号化されたスキーマ、および一般テーブルスペースを作成します。

mysqlスキーマ

mysqlシステムデータベース、およびMySQLデータディクショナリテーブルが含まれます。 デフォルトでは暗号化されていません。暗号化を有効にするには、ALTER TABLESPACEステートメントでENCRYPTION=Yを指定します。

mysql> ALTER TABLESPACE mysql ENCRYPTION = 'Y';

バイナリーログとリレーログ

バイナリーログとリレーログの暗号化は、MySQL 8.0.14からサポートされました。パラメータbinlog_encryptionをONに変更することで有効になります。デフォルトはOFFです。これによりバイナリログとリレーログともに暗号化されます。

ダブルライトバッファ

ダブルライトバッファの暗号化は、MySQL 8.0.23からサポートされました。特に設定は必要ありません。前述のテーブル暗号化またはテーブルスペース暗号化を設定している場合は、ダブルライトバッファも自動的に暗号化されるようになっています。それが暗号化されていない場合は、ダブルライトバッファも暗号化されないままです。

まとめ

今回は、MySQLのデータ暗号化についての概要を紹介しました。今回の記事は以下のドキュメントを元に進めました。詳しく知りたい方は以下のドキュメントをご確認ください。

おすすめ記事

記事・ニュース一覧