1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Laravel で MySQLのテーブルを暗号化して使う

Last updated at Posted at 2020-05-06

やること

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からデータベースの回復を行う。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?