MySQL「Transparent Data Encryption(TDE)」機能を使ってみる

本記事は広告が含まれる場合があります。

いつもブログをご覧くださりありがとうございます。

今回は、機会が少ないのですが、MySQL「Transparent Data Encryption(TDE)」機能を使った時の記録を残しておきたいと思います。

「Transparent Data Encryption(TDE)」とは?

MySQL5.7以降にはTDE(Transparent Data Encryption)というデータ暗号化機能があります。 アプリケーション 側で暗号化をしなくても、テーブルファイルなどを暗号化してくれます。
データファイルや物理メディア(HDDなど)の窃取・盗難対策に有効です。
一方で、アプリケーション側にSQLインジェクションなどの脆弱性がある場合には、何の保護にもなりません。

MySQL以外のデータベースでも同等の機能を持っていることが多いようです。

MySQLデータベースの暗号化手順

前提条件

  • MySQL 5.7.12 以上
  • MySQL root 権限があること

1-1. my.cnfを開く

# vi /etc/my.cnf

1-2.以下を追記します。

innodb_file_per_table=1 
early-plugin-load=keyring_file.so 
keyring_file_data=/usr/local/mysql/mysql-keyring/keyring

1行目:テーブル単位で.ibdファイル生成
2行目:キーリングプラグインとして、ファイルベースのプラグインを使用
3行目:キーリングファイルの置き場所を指定
追記したら保存。

2.キーリングファイルの置き場所(ディレクトリ)を作成

# mkdir -p /usr/local/mysql/mysql-keyring
# chown -R mysql.mysql /usr/local/mysql
# chmod 750 /usr/local/mysql/mysql-keyring

3.サービスの再起動

# service mysqld restart

4-1.テーブルの暗号化

ターミナルでMySQLにログインし、以下のコマンドで暗号化します。

mysql> ALTER TABLE テーブル名 ENCRYPTION='Y';

データベースとアプリ側での暗号化の比較

ここでは、PHPアプリケーションを想定し、それぞれのメリット/デメリットを比較してみたいと思います。

方式データベースPHP側
実装方法TDEを利用するプログラム改修
格納されたデータ暗号化されている暗号化されている
復号化の方法アプリ側で復号化する必要なしアプリ側で復号化する必要がある
復号化の範囲DB or テーブル単位テーブル単位
暗号化と復号化のタイミングMySQLの機能で暗号化/復号化データを入れる時に暗号化、DBからデータを呼び出して表示させる時に復号化
仕様変更の必要性復号化の処理は特に必要なし必要あり
拡張する時の工数特になし暗号化したテーブルを利用する時には、暗号化/復号化の処理が必要
汎用性MySQLのroot権限が必要。
レンタルサーバーなどでは利用できないと思われる
アプリ側に依存する
鍵の管理別途管理PHPで鍵の管理機能を作る必要あり
開発工数低い高い
メンテナンス工数低い(通常のDBの管理と同じ)高い
安全性アプリを狙った攻撃、例えばSQLインジェクションには無効。アプリ側の攻撃時にも暗号化で保護されている。ただし管理画面を突破するような攻撃時には無効。
ただし、これはどちらにも言えること
そのほか復号化の処理に失敗すれば、データが閲覧できない

参考記事

  • https://qiita.com/hmatsu47/items/476d446887244de17ae4
  • https://it-trend.jp/encryption/article/64-0074

お問い合わせはこちらから

南大阪を中心に活動しているシステムエンジニアです。これまでの経験から、ビジネス課題について一緒になって考え、課題解決のためにサポートさせていただきます。些細なご相談でも構いません。当方に期待することやご相談内容についてお聞かせください。初回のご相談はオンラインで無償対応いたします。

連絡先:050-5050-2860