やること
MySQLの実際のデータが収められているファイルは暗号化されていない。これを暗号化してLaravelのcreate_tableで暗号化テーブルとして作成する記述をする。
任意のデータベースにcoffeesテーブルが存在しているとして話を進める。
- 追記: apt update ; apt upgrade でMySQLのデータベースが壊れた。要注意。
MySQL側の設定
select * from coffees;
+----+---------------------+-------+--------+------------+------------+
| id | name | price | memo | created_at | updated_at |
+----+---------------------+-------+--------+------------+------------+
| 1 | ブレンド | 320 | <null> | <null> | <null> |
| 2 | アイス | 320 | <null> | <null> | <null> |
| 3 | カプチーノ | 500 | <null> | <null> | <null> |
| 4 | Hot Chocolate | 500 | <null> | <null> | <null> |
| 5 | Caramel Apple Spice | 500 | <null> | <null> | <null> |
| 6 | Vanilla Crème | 500 | <null> | <null> | <null> |
+----+---------------------+-------+--------+------------+------------+
6 rows in set
coffeesテーブルが収められているファイルを見てみると、文字列がそのまま入っている。
## strings /var/lib/mysql/coffees.ibd
infimum
supremum
Hot Chocolate
Caramel Apple Spice
Vanilla Cr
このファイルを暗号化する。
MySQL keyring_file.so のインストール
MySQLで以下のSQLを実行。
install plugin keyring_file soname 'keyring_file.so';
my.cnfを変更
/etc/mysql/my.cnf の [mysqld]以下に追記
early-plugin-load=keyring_file.so
keyring_file_data=/var/lib/mysql/mysql-keyring/keyring
mysqlを再起動(Ubuntu)
systemctl restart mysql.service
Laravelでのcreate_tableの記述
ALTER TABLE coffees ENCRYPTION='Y'
を実行する記述を追加。
class CreateCoffeesTable extends Migration
{
public function up()
{
Schema::create('coffees', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->integer('price');
$table->string('memo')->nullable();
$table->timestamps();
});
'price' => 500]);
DB::table('coffees')->insert(['name' => 'Hot Chocolate', 'price' => 500]);
DB::table('coffees')->insert(['name' => 'Caramel Apple Spice', 'price' => 500]);
DB::table('coffees')->insert(['name' => 'Vanilla Crème', 'price' => 500]);
DB::statement("ALTER TABLE coffees ENCRYPTION='Y'"); // ←ーー暗号化 ココ
}
}
暗号化されているか確認
# strings coffees.ibd
f8cd72f3-155c-11ea-8341-080027c2e88e.
;r^Z
%qc%
+Uy2C
sgA
c1B!u\
XS_W
lO"Jhi!
/#6)
&yyQ9
|[t(>
暗号化されている。
これで情報漏洩リスクを下げられる。
要注意
ubuntuでMySQL関連のアップデートがあると自動アップデートできない。
暗号化されたデータベースが壊れたので、
apt update
apt upgrade
を行うときには必ず
mysqldumpで全データベースのバックアップを取る。
OSのアップデートが終わるとMYSQLのデータベースが壊れた状態になるので、dumpしたSQLからデータベースの回復を行う。