MySQL Enterprise Edition には TDE (Transparent Data Encryption) が搭載されていますが、
Community Edition でも keyring_file
プラグインを利用することで、テーブルデータを暗号化することが可能です。
以下では、MySQL 8.0 + Debian 系OSを想定した手順を紹介します。
1. 設定ファイルに追記
/etc/mysql/mysql.conf.d/mysqld.cnf
などの [mysqld]
セクションに以下を追加します。
[mysqld]
early-plugin-load=keyring_file.so
keyring_file_data=/var/lib/mysql-keyring/keyring
-
early-plugin-load
: MySQL 起動時にプラグインをロード -
keyring_file_data
: 暗号鍵を保存するファイルのパス
2. プラグインをインストール(初回のみ)
INSTALL PLUGIN keyring_file SONAME 'keyring_file.so';
確認:
SHOW PLUGINS WHERE Name LIKE 'keyring%';
出力例:
+--------------+--------+---------+-----------------+
| Name | Status | Type | Library |
+--------------+--------+---------+-----------------+
| keyring_file | ACTIVE | KEYRING | keyring_file.so |
+--------------+--------+---------+-----------------+
4. テーブル暗号化を有効化
新規テーブルの場合
CREATE TABLE customers (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255)
) ENGINE=InnoDB ENCRYPTION='Y';
既存テーブルを暗号化
ALTER TABLE customers ENCRYPTION='Y';
確認:
SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS
FROM information_schema.tables
WHERE TABLE_NAME = 'customers';
出力例:
+--------------+------------+----------------+
| TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |
+--------------+------------+----------------+
| DB名 | customers | ENCRYPTION="Y" |
+--------------+------------+----------------+
5. 実際に暗号化されているか確認
OSレベルで .ibd
ファイルを直接調べてみましょう。
cat /var/lib/mysql/DB名/customers.ibd | grep '札幌市'
- 何も出なければ暗号化成功
- 出てしまう場合 → ENCRYPTION='Y' が効いていない
6. デフォルトで暗号化を有効化(任意)
今後作成するテーブルを自動で暗号化したい場合:
SET GLOBAL innodb_encrypt_tables = ON;
SET PERSIST innodb_encrypt_tables = ON;
注意点
- 暗号化されるのは InnoDB テーブルのデータファイル(.ibd)
- binlog / エラーログ / スローログ は暗号化されません
-
keyring
ファイルの権限管理が非常に重要(漏れたら復号される)
まとめ
- Enterprise Edition でしかできないと思われがちな TDE ですが、
Community Edition でもkeyring_file
を使えば 無料でテーブル暗号化 が可能です。 - ただし「binlog暗号化」や「KMIP連携」などの高度な機能は Enterprise 限定です。
👉 実際に .ibd
ファイルから平文が見えなくなった時の安心感は大きいです。
バックアップ・リストア時も暗号化は維持されるので、要件次第では十分使えるはずです。