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-load
にkeyring_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のデータ暗号化についての概要を紹介しました。今回の記事は以下のドキュメントを元に進めました。詳しく知りたい方は以下のドキュメントをご確認ください。