本記事は広告が含まれる場合があります。
いつもブログをご覧くださりありがとうございます。
今回は、機会が少ないのですが、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
連絡先:050-5050-2860