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_CTR

innodb_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=【鍵番号】;

 

6. 参考