Menerapkan Enkripsi Transparan (TDE) pada Tabel MySQL (versi Windows)

Halaman Diperbarui :
Tanggal pembuatan halaman :

Lingkungan operasi

MySQL
  • MySQL 8.0 Edisi Komunitas
Windows
  • jendela 11

Prasyarat

MySQL
  • MySQL 8.0 Edisi Komunitas
  • MySQL 8.0 Enterprise Edition
Windows
  • jendela 11
  • jendela 10
Windows Server
  • Windows Server 2022
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2

Prasyarat

  • Database untuk MySQL diinstal.

Tentang Enkripsi Transparan

Enterprise Transparent Data Encryption, sesuai namanya, adalah teknologi enkripsi yang lebih aman daripada yang tidak. Biasanya, ketika mengenkripsi, sering menjadi beban bagi pelaksana karena perlu untuk melakukan enkripsi dan pemrosesan dekripsi. Arti dari nama ini "transparan" adalah bahwa hal itu dapat dienkripsi tanpa pelaksana membuat perubahan pada proses. Oleh karena itu, jika Anda membuat beberapa perubahan pada pengaturan di awal, sisanya akan dienkripsi tanpa izin, jadi ini adalah tindakan pengamanan yang sangat efektif.

Namun, seperti yang disarankan oleh frasa "tidak perlu mengubah apa pun", jika Anda benar-benar masuk ke database, Anda dapat melihat data secara normal, dan jika Anda mendapatkan catatan database dari program, Anda dapat melihat data secara normal. Jika data yang diperoleh dienkripsi, perlu untuk mengubah proses, sehingga tidak akan cocok dengan kata-kata "Tidak perlu mengubah proses".

Kemudian, di MySQL, apa sebenarnya enkripsi transparan dienkripsi, "file database tersimpan" atau "file tabel" tunduk pada enkripsi. Seperti yang akan kita periksa nanti, bahkan jika Anda membuka file secara langsung, itu hanya mengenkripsinya sehingga Anda tidak dapat melihat isinya, jadi perlu untuk mengoperasikannya sehingga tidak masuk ke database dalam operasi yang sebenarnya.

Membuat tabel secara normal dan memeriksa isinya

Pertama, mari kita buat tabel dan catatan secara normal. Anda dapat membuatnya sesuka Anda, tetapi dalam kasus ini, kami akan membuatnya dengan menjalankan SQL di Workbench. Dalam hal ini, kami berencana untuk mengatur enkripsi transparan untuk tabel, jadi kami akan membuat database secara normal.

CREATE DATABASE `test_database`

Meja juga dibuat normal. Isi kolom bisa apa saja.

CREATE TABLE `plain_user` (
  `id` int NOT NULL,
  `name` varchar(32) ,
  `age` int ,
  `address` varchar(256) ,
  `phone` varchar(32) ,
  `email` varchar(128) ,
  `remarks` varchar(1024) ,
  `height` decimal(5, 2) ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

Saya juga akan memasukkan catatan acak untuk memeriksa enkripsi.

INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('1','名前1','11','宮城県仙台市1','000-0000-0001','example1@example.com','備考1','170.00');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('2','名前2','12','宮城県仙台市2','000-0000-0002','example2@example.com','備考2','171.01');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('3','名前3','13','宮城県仙台市3','000-0000-0003','example3@example.com','備考3','172.02');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('4','名前4','14','宮城県仙台市4','000-0000-0004','example4@example.com','備考4','173.03');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('5','名前5','15','宮城県仙台市5','000-0000-0005','example5@example.com','備考5','174.04');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('6','名前6','16','宮城県仙台市6','000-0000-0006','example6@example.com','備考6','175.05');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('7','名前7','17','宮城県仙台市7','000-0000-0007','example7@example.com','備考7','176.06');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('8','名前8','18','宮城県仙台市8','000-0000-0008','example8@example.com','備考8','177.07');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('9','名前9','19','宮城県仙台市9','000-0000-0009','example9@example.com','備考9','178.08');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('10','名前10','20','宮城県仙台市10','000-0000-0010','example10@example.com','備考10','179.09');

Ketika Anda membuat database atau tabel, itu dibuat di folder berikut secara default.

  • C:\ProgramData\MySQL\MySQL Server 8.0\Data

ProgramData Folder disembunyikan, jadi buat terlihat di pengaturan Explorer.

Ada folder dengan nama database yang Anda buat di folder tersebut, jadi bukalah.

Di dalamnya ada file tabel demi tabel.

Buka file ini di editor teks seperti Notepad. Karena ini adalah file biner, saya pikir pada dasarnya ada sebaris teks yang saya tidak mengerti dengan baik. Jika Anda melihat di bagian bawah, Anda akan melihat teks dari catatan terdaftar.

Jika tidak dienkripsi dengan cara ini, isi catatan akan diketahui meskipun file dibuka secara langsung. Anda tidak perlu masuk ke database untuk mengetahui apa yang ada di dalamnya.

Mengonfigurasi Pengaturan Enkripsi Transparan

Untuk mengaktifkan enkripsi transparan, Anda perlu menginstal plug-in. Pertama, periksa apakah plug-in disertakan dengan perintah.

Mulai dengan memilih "MySQL 8.0 Command Line Client" dari menu Start.

Setelah memasukkan kata sandi Anda dan masuk, masukkan perintah berikut:

SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';

Karena Anda belum menginstalnya, itu harus kosong.

Sekarang, mari kita siapkan plug-in. Pertama, buat folder berikut: Bahkan, tidak masalah di mana Anda membuatnya atau apa namanya. Tentukan sebagai lokasi tempat Anda ingin menyimpan file kunci nanti.

  • C:\ProgramData\MySQL\mysql-keyring

Selanjutnya, buka file berikut di editor teks:

  • C:\ProgramData\MySQL\MySQL Server 8.0\my.ini

Tambahkan teks berikut ke ruang kosong di bagian bawah dan simpan. Jika Anda tidak dapat menyimpan dengan hak administrator, Anda dapat menyimpannya ke lokasi lain lalu menimpa file.

early-plugin-load=keyring_file.dll
keyring_file_data=C:\ProgramData\MySQL\mysql-keyring\keyring

Mulai ulang layanan MySQL. Anda juga dapat memulai ulang dengan perintah.

Ketika Anda me-restart, file secara otomatis dibuat dalam folder tertentu.

Anda dapat memverifikasi bahwa plug-in diinstal dengan menjalankan perintah check plug-in lagi.

SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';

Membuat Tabel Terenkripsi

Sekarang mari kita buat tabel terenkripsi. Buat tabel yang mirip dengan yang sebelumnya, tapi kali ini tambahkan ke ENCRYPTION='Y' opsi. Pengaturan enkripsi ini tampaknya tidak dimungkinkan di GUI saat ini, jadi harus diatur dengan perintah.

CREATE TABLE `encrypt_user` (
  `id` int NOT NULL,
  `name` varchar(32) ,
  `age` int ,
  `address` varchar(256) ,
  `phone` varchar(32) ,
  `email` varchar(128) ,
  `remarks` varchar(1024) ,
  `height` decimal(5, 2) ,
PRIMARY KEY (`id`)
) ENCRYPTION='Y' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

Omong-omong, sebelum plug-in dikonfigurasi, bahkan jika Anda mencoba membuat tabel terenkripsi, kesalahan berikut akan ditampilkan.

Can't find master key from keyring, please check in the server log if a keyring is loaded and initialized successfully.
キーリングからマスターキーが見つかりません。キーリングが正常にロードされ、初期化されているかどうかをサーバーログで確認してください。

Jika Anda tidak memiliki data apa pun, Anda tidak tahu apakah itu dienkripsi, jadi saya akan mencoba memasukkan data yang sama.

INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('1','名前1','11','宮城県仙台市1','000-0000-0001','example1@example.com','備考1','170.00');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('2','名前2','12','宮城県仙台市2','000-0000-0002','example2@example.com','備考2','171.01');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('3','名前3','13','宮城県仙台市3','000-0000-0003','example3@example.com','備考3','172.02');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('4','名前4','14','宮城県仙台市4','000-0000-0004','example4@example.com','備考4','173.03');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('5','名前5','15','宮城県仙台市5','000-0000-0005','example5@example.com','備考5','174.04');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('6','名前6','16','宮城県仙台市6','000-0000-0006','example6@example.com','備考6','175.05');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('7','名前7','17','宮城県仙台市7','000-0000-0007','example7@example.com','備考7','176.06');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('8','名前8','18','宮城県仙台市8','000-0000-0008','example8@example.com','備考8','177.07');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('9','名前9','19','宮城県仙台市9','000-0000-0009','example9@example.com','備考9','178.08');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('10','名前10','20','宮城県仙台市10','000-0000-0010','example10@example.com','備考10','179.09');

encrypt_user Karena file tabel telah dibuat, mari kita periksa isinya.

File telah dienkripsi, dan konten catatan tidak dapat diverifikasi.

Untuk saat ini, Anda tidak perlu lagi khawatir pihak ketiga membaca catatan di dalamnya hanya dengan masuk ke server dan mencuri file tabel secara langsung. Tidak perlu mengubah implementasi sama sekali, jadi saya pikir ini adalah pengaturan keamanan yang mudah.

Namun, jika Anda masuk ke database, Anda dapat melihat data secara normal. Jika Anda ingin meningkatkan tingkat keamanan, Anda perlu mengelola akun login database dengan baik dan memperkenalkan mekanisme enkripsi terpisah.

Konversi ke tabel terenkripsi di sepanjang proses

Jika awalnya Anda membuat tabel yang tidak terenkripsi, Anda dapat mengonversinya menjadi tabel terenkripsi nanti. Dalam hal ini, Anda dapat mengonversinya dengan SQL berikut:

use <データベース名>;
ALTER TABLE <テーブル名> ENCRYPTION='Y';

contoh

use test_database;
ALTER TABLE plain_user ENCRYPTION='Y';

Namun, perlu diketahui bahwa akan memakan waktu lama jika ada banyak catatan karena semua file tabel ditulis ulang.