MariaDBでDBをテーブル単位で暗号化する方法

takahashi 著者:takahashi

MariaDBでDBをテーブル単位で暗号化する方法

最近、何かと情報流出のニュースって多いですよね。
基本的にはサーバに不正侵入させないのが第一ではあるのですが、攻撃が巧妙化してくると、なかなか簡単には防御できないこともあり得ます。
そういう場合も想定して、万が一サーバに第三者が不正に侵入してきたときの保険として、データそのものを暗号化してしまう方法があります。

Webサービスなどでは、データの保存先としてよくデータベースを利用しますが、最近このDBエンジン自体が暗号化機能を持っているものが出てきました。

今回はMariaDBというMySQL互換のDBエンジンで暗号化設定をしてみました。
(使用OS:CentOS 7)

まずはmariaDBをインストールします。
mariaDB自体はCentOSのepelリポジトリにも存在しているのですが、実はepel版MariaDBはバージョン5系のものとなっており、暗号化がサポートされるのが10.1からとなっています。
そのため、公式リポジトリのMariaDBでは暗号化することができません。

バージョン10.1以上のMariaDBはMariaDB公式のリポジトリから入手できるので、今回はこちらを使います。

折角なら最新版をということで、現時点の安定板の最新版 v10.3 をインストールします。

sudo vi /etc/yum.repos.d/mariadb.repo

などどして、下記の内容でMariadbのリポジトリファイルを作成します。

# MariaDB 10.3 CentOS repository list - created 2018-07-04 11:06 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.3/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

ファイルを作成したらyumでmariadbをインストールします。

#MariaDBをインストール
sudo yum install MariaDB-server MariaDB-client

MariaDBを立ち上げる前に、暗号化の設定を先に行っておきます。
まずは暗号化に使うキーを生成します。

openssl enc -aes-256-cbc -k パスワード -P -md sha1

下記のような内容が表示されます。

salt=英数字
key=英数字
iv =英数字

新しくファイルを作成し、表示された英数字を次のように記載します。

暗号化・復号化する際の鍵番号(1以上の数字を任意に指定);ivの値;keyの値

鍵ファイルを暗号化します。

openssl enc -aes-256-cbc -md sha1 -k パスワード2 -in 先程つくった鍵ファイルのパス -out 暗号化後ファイルの保存先

/etc/my.cnf.d/server.cnf
を管理者権限で開き、[mysqld]セクションのすぐ下に、下記の設定を追記します。

plugin-load-add=file_key_management.so
file_key_management
file_key_management_filename = 先程作成した鍵ファイルのパス
file_key_management_filekey = 鍵ファイルにかけたパスワード
file_key_management_encryption_algorithm=AES_CBC

これで準備ができたので、早速MariaDBを立ち上げます。

sudo systemctl start mariadb #mariadb起動
sudo systemctl enable mariadb #mariadbの自動起動を有効化

これで暗号化が有効になったはずです。
それでは早速、暗号化されたテーブルを作ってみます。

CREATE DATABASE hoge;
use hoge;
CREATE TABLE test (id INT) ENCRYPTED=YES ENCRYPTION_KEY_ID=先程の鍵に指定した鍵id;

テーブルにデータを入れます。

#例
INSERT INTO hoge(id) VALUES (1);

この状態でselectをかけると通常通りデータが出力されますが、最初に編集した
/etc/my.cnf.d/server.cnf
の今回の変更部分をすべてコメントアウトした状態でmariaDBを再起動、再びhogeテーブルをSELECTすると…

ERROR 1932 (42S02): Table 'hoge.test' doesn't exist in engine

のように表示され、中のデータが見れなくなっていることがわかるかと思います。

このようにしておけば、MariaDBのデータ本体を抜かれても、キーファイルが漏れていても、そのパスワードが漏れなければデータの中身を見られる心配はありません。
ただし、/etc/my.cnf.d/server.cnfにパスワードを直書きしてしまっているので、このファイルを漏れないように気を配る必要はありそうです。

今回のMariaDBのように、暗号化する仕組みをはじめから備えていて、簡単に設定できる環境も増えてきています。
これからもし情報が洩れてはいけないようなサービスを作ろうと考えられている方がいましたら、是非参考になれば幸いです。

  • この記事いいね! (0)

著者について

takahashi

takahashi administrator

Webエンジニア。 趣味で自宅サーバーを稼働中。 ファンタジーが好き。