mariadb10.3/CentOS8 透過的データ暗号化
CentOS8上のmariadbの透過的データ暗号化設定
説明上のファイルと、例の中のファイル名は以下ように対応する。
鍵ファイル | /etc/my.cnf.d/keyfile.txt |
暗号文字列ファイル | /etc/my.cnf.d/password.txt |
暗号化鍵ファイル | /etc/my.cnf.d/keyfile.enc |
1. 透過的暗号化で使う鍵ファイルを作成する
1.1. 鍵ファイルを生成する
openssl rand -hex 32
として、ランダムな英数文字列を生成する。
生成されたランダムな英数文字列を使用して、鍵ファイルを作成する。
鍵ファイルの行の書式は、以下の通り。セミコロンは一つ。
鍵番号;鍵文字列
鍵番号は1以上の整数。鍵文字列は、英数字の文字列を指定。
複数行を使って、複数の鍵を登録できる。
鍵ファイル例:
# cat /etc/my.cnf.d/keyfile.txt
1;9a8cc46f1452e21a76a6ffe88a3abf337d04ba0b8dd8bccfe7a0a09bd63c1586
1.2. 鍵ファイルを暗号化する
暗号化のための文字列を生成し、暗号文字列ファイルに保存。
openssl rand -hex 128 > /etc/my.cnf.d/password.txt
暗号文字列ファイルを使って鍵ファイルから、暗号化鍵ファイルを生成する。
openssl enc -aes-256-cbc -md sha1 \
-pass file:/etc/my.cnf.d/password.txt \
-in /etc/my.cnf.d/keyfile.txt \
-out /etc/my.cnf.d/keyfile.enc
以下の警告がでるが、これらのオプションを使用しない。(mariadbで読めなくなる?)
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
2. mariadbに透過的暗号化を設定する。
2.1. 設定ファイルの編集
- /etc/my.conf.d/mariadb-server.cnf
[server]
plugin-load-add=file_key_management
file_key_management
loose_file_key_management_filename = /etc/my.cnf.d/keyfile.enc
loose_file_key_management_filekey = FILE:/etc/my.cnf.d/password.txt
loose_file_key_management_encryption_algorithm = AES_CTRinnodb_encrypt_tables = ON
innodb_encrypt_temporary_tables = ON
innodb_encrypt_log = ON
innodb_encryption_threads = 4
innodb_encryption_rotate_key_age = 100
2.2. 設定の反映
systemctl restart mariadb
3. 特定のテーブルが暗号化できているか調べる。
mysqlコンソールから
select NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID from
information_schema.INNODB_TABLESPACES_ENCRYPTION
WHERE NAME='【データベース】/【テーブル】';
実行例:
MariaDB [(none)]> select NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID from
-> information_schema.INNODB_TABLESPACES_ENCRYPTION
-> WHERE NAME='test/prefecture';
+-----------------+-------------------+----------------+
| NAME | ENCRYPTION_SCHEME | CURRENT_KEY_ID |
+-----------------+-------------------+----------------+
| test/prefecture | 1 | 1 |
+-----------------+-------------------+----------------+
1 row in set (0.005 sec)
4. 特定のテーブルの暗号化を解く。
mysqlコンソールから
ALTER TABLE 【テーブル名】 ENCRYPTED=NO;
5. 特定のテーブルの暗号化をする。
mysqlコンソールから
ALTER TABLE 【テーブル名】 ENCRYPTED=YES ENCRYPTION_KEY_ID=【鍵番号】;