最近、何かと情報流出のニュースって多いですよね。
基本的にはサーバに不正侵入させないのが第一ではあるのですが、攻撃が巧妙化してくると、なかなか簡単には防御できないこともあり得ます。
そういう場合も想定して、万が一サーバに第三者が不正に侵入してきたときの保険として、データそのものを暗号化してしまう方法があります。
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のように、暗号化する仕組みをはじめから備えていて、簡単に設定できる環境も増えてきています。
これからもし情報が洩れてはいけないようなサービスを作ろうと考えられている方がいましたら、是非参考になれば幸いです。