先日、MariaDBでテーブルの暗号化を行ってみたが、今回はそれをGaleraClusterで行ってみる。
前回でも触れたが、この機能はMariaDB 10.1.3以降である必要がある。GaleraClusterの設定方法が10.0系と10.1系で少し違っているので、少し注意しよう。
10.1系でのGaleraClusterの設定については、こちらを参照してもらいたい。

今回はMariaDB 10.1.11、GaleraClusterはすでに構成済として進めていく。

1.鍵ファイルの作成・配布

さて、まずは前回と同じく鍵ファイルを作成、そのファイルを各ノードに配布する。
これについては、以後のメンテナンスを考慮して鍵ファイルをLsyncdで同期させるといいかも知れない。

openssl enc -aes-256-cbc -k パスワード -P -md sha1
[root@test-node ~]# openssl enc -aes-256-cbc -k Password1 -P -md sha1
salt=51C82DA044E0B1F1
key=F1FD7027872C000500DCF9D5FBBDFA624AF88551EA6D419C8922712FB85C97F7
iv =5D9E9DFEC73ACB0E1E4B17A1F058A7D2

上記コマンドの出力結果を元に、「key.txt」を以下の内容・記述で作成する。

暗号化・復号化する際の鍵番号;iv;key

上の例でいうと、以下のようにファイルを作成する。

[root@test-node ~]# cat /opt/key.txt
1;5D9E9DFEC73ACB0E1E4B17A1F058A7D2;F1FD7027872C000500DCF9D5FBBDFA624AF88551EA6D419C8922712FB85C97F7

「key.txt」を作成したら、さらにそれを暗号化した「key.enc」を以下のコマンドで作成する。

openssl enc -aes-256-cbc -md sha1 -k パスワード2 -in /opt/key.txt -out /opt/key.enc
[root@test-node ~]# openssl enc -aes-256-cbc -md sha1 -k Password2 -in /opt/key.txt -out /opt/key.enc
[root@test-node ~]# ls -la /opt/key.enc
-rw-r--r--. 1 root root 128  2月 12 10:55 /opt/key.enc
[root@test-node ~]# file /opt/key.enc
/opt/key.enc: data

鍵ファイルが作成出来たら、「/opt/key.enc」をscpなどで各ノードに配布する。

2.設定ファイルの追記

鍵ファイルの作成ができたら、次はMariaDBの設定ファイル「/etc/my.cnf.d/server.cnf」へ、暗号化について設定を追記する。

[mysqld]
plugin-load-add=file_key_management.so
file_key_management
file_key_management_filename = /PATH/key.enc
file_key_management_filekey = パスワード2
file_key_management_encryption_algorithm=AES_CBC

今回、実際に設定した値がこちら。

MasterNode

[root@BS-PUB-GALERA-01 ~]# cat /etc/my.cnf.d/server.cnf
[mysqld]
bind-address=0.0.0.0
plugin-load-add=file_key_management.so
file_key_management
file_key_management_filename = /opt/key.enc
file_key_management_filekey = Password2
file_key_management_encryption_algorithm=AES_CBC

[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
binlog_format=ROW
wsrep_cluster_address='gcomm://'
wsrep_cluster_name='DBCLUSTER'
wsrep_node_name='DBCLUSTER-NODE1'
wsrep_node_address = IPアドレス

OtherNode

[root@BS-PUB-GALERA-02 ~]# cat /etc/my.cnf.d/server.cnf
[mysqld]
bind-address=0.0.0.0
plugin-load-add=file_key_management.so
file_key_management
file_key_management_filename = /opt/key.enc
file_key_management_filekey = Password2
file_key_management_encryption_algorithm=AES_CBC

[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
binlog_format=ROW
wsrep_cluster_address = gcomm://MasterNodeIp,OtherNodeIp,...
wsrep_cluster_name='DBCLUSTER'
wsrep_node_name='DBCLUSTER-NODE2'
#wsrep_node_address = IPアドレス

後は、各ノードでMariaDBを起動させる。

service mysql start --wsrep-new-cluster # 1台目のノード(MasterNode)
service mysql start # 2台目以降のノード(OtherNode)

3.テーブル作成/設定変更

各ノードが起動したら、実際に暗号化したテーブルを作成してみよう。
どれか一つのノードで、以下のようにCREATE文を実行する。

CREATE TABLE TEST_ENCRIPTION(TEST_ID BIGINT NOT NULL PRIMARY KEY, TEST_VAR VARCHAR(80)) ENGINE=InnoDB  ENCRYPTED=YES ENCRYPTION_KEY_ID=1;
MariaDB [(none)]> use test
Database changed
MariaDB [test]> CREATE TABLE TEST_ENCRIPTION(TEST_ID BIGINT NOT NULL PRIMARY KEY, TEST_VAR VARCHAR(80)) ENGINE=InnoDB  ENCRYPTED=YES ENCRYPTION_KEY_ID=1;
Query OK, 0 rows affected (0.01 sec)

MariaDB [test]> INSERT INTO TEST_ENCRIPTION(TEST_VAR) VALUES("test");
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [test]> INSERT INTO TEST_ENCRIPTION(TEST_ID,TEST_VAR) VALUES(1,"test");
Query OK, 1 row affected (0.01 sec)

MariaDB [test]> SELECT * FROM TEST_ENCRIPTION;
+---------+----------+
| TEST_ID | TEST_VAR |
+---------+----------+
|       0 | test     |
|       1 | test     |
+---------+----------+
2 rows in set (0.00 sec)

正常に鍵ファイルが配置されていれば、他のノードでもテーブルへアクセス出来ることが確認できるだろう。
もちろん、鍵ファイルが無いノードでは中身が読めないので、ノードを追加する際は注意が必要。

[root@BS-PUB-GALERA-02 ~]# mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.1.11-MariaDB MariaDB Server

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [test]> SELECT * FROM TEST_ENCRIPTION;
ERROR 1296 (HY000): Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB

これで、もしDBのバックアップファイルを盗まれたとしても、鍵が無ければ中身を見れないので安心だ。
…普通にバックアップファイルを暗号化すればいいだけじゃないかと言われそうではあるけど。