Enkripsi Transparan (TDE) untuk Tabel MySQL (Windows)

Tanggal pembuatan halaman :

Lingkungan konfirmasi operasi

MySQL
  • Edisi Komunitas MySQL 8.0
Windows
  • Jendela 11

Lingkungan yang diperlukan

MySQL
  • Edisi Komunitas MySQL 8.0
  • MySQL 8.0 Edisi Perusahaan
Windows
  • Jendela 11
  • Jendela 10
Windows Server
  • Windows Server 2022
  • Windows Server 2019
  • Server Windows 2016
  • Windows Server 2012 R2

Prasyarat

  • Database MySQL harus diinstal

Tentang Enkripsi Transparan

Enkripsi Data Transparan (Enterprise Transparent Data Encryption) adalah teknologi yang mengenkripsi seperti namanya, dan lebih aman daripada tidak melakukan ini. Biasanya, ketika enkripsi dilakukan, seringkali menjadi beban bagi pelaksana karena perlu melakukan pemrosesan enkripsi dan dekripsi. Arti dari "transparan" ini adalah dapat dienkripsi tanpa pelaksana membuat perubahan apa pun pada pemrosesan. Oleh karena itu, ini adalah tindakan keamanan yang sangat efektif karena dienkripsi sendiri setelah hanya sedikit penyesuaian pengaturan di awal.

Namun, seperti yang disarankan oleh frasa "tidak perlu membuat perubahan 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 dilakukan perubahan pada pemrosesan, sehingga tidak akan cocok dengan pernyataan "tidak diperlukan perubahan pada pemrosesan".

Jadi, apa sebenarnya enkripsi transparan di MySQL, dan "file database tersimpan" atau "file tabel" dienkripsi. Seperti yang akan saya periksa nanti, meskipun Anda membuka file secara langsung, itu hanya dienkripsi agar isinya tidak dapat dilihat, sehingga perlu untuk mengoperasikannya agar tidak masuk ke database dalam operasi yang sebenarnya.

Buat tabel secara normal dan periksa isinya

Pertama, mari kita buat tabel dan catatan secara normal. Anda dapat membuatnya sesuka Anda, tetapi kali ini saya akan menjalankan SQL di Workbench untuk membuatnya. Kali ini, kami berencana untuk menyiapkan enkripsi transparan untuk tabel, jadi kami akan membuat database secara normal.

CREATE DATABASE `test_database`

Saya juga membuat meja secara normal. Apa pun isi kolomnya, itu bisa jadi.

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;

Simpan catatan 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');

Saat Anda membuat database atau tabel, itu dibuat di folder berikut secara default:

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

ProgramData Folder adalah folder tersembunyi, jadi pastikan folder tersebut terlihat di pengaturan File Explorer.

Di dalam folder terdapat folder dengan nama database yang Anda buat, jadi buka.

Di dalamnya terdapat file tingkat tabel.

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

Jika tidak dienkripsi dengan cara ini, Anda dapat mengetahui isi catatan hanya dengan membuka file secara langsung. Anda tidak perlu masuk ke database untuk mengetahui apa yang ada di dalamnya.

Menyiapkan enkripsi transparan

Untuk mengaktifkan Enkripsi Transparan, Anda perlu menginstal plugin. Pertama, periksa perintah untuk melihat apakah plugin disertakan.

Pilih Klien Baris Perintah MySQL 8.0 dari menu Mulai untuk meluncurkannya.

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

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

Saya belum menginstalnya, jadi seharusnya kosong.

Sekarang mari kita konfigurasikan plugin. Pertama, buat folder berikut: Padahal, tempat atau nama yang Anda buat baik-baik saja. Tentukan sebagai lokasi untuk menyimpan file kunci nanti.

  • C:\ProgramData\MySQL\mysql-keyring

Kemudian buka file berikut di editor teks.

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

Tambahkan teks berikut ke ruang bawah dan simpan. Jika Anda tidak dapat menyimpan dengan hak administrator berhak asuh, 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 dapat memulai ulang dengan perintah.

Setelah memulai ulang, file akan dibuat secara otomatis di folder yang ditentukan.

Anda dapat menjalankan perintah Check Plugin lagi untuk memverifikasi bahwa plugin telah diinstal.

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

Membuat tabel enkripsi

Sekarang mari kita buat tabel terenkripsi. Buat tabel yang mirip dengan yang kita miliki sebelumnya, tetapi sekarang tambahkan ke opsi ENCRYPTION='Y' . Pengaturan enkripsi ini tampaknya tidak dapat dikonfigurasi 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;

Ngomong-ngomong, sebelum menyiapkan plugin, bahkan jika Anda mencoba membuat tabel enkripsi, Anda akan menerima kesalahan berikut.

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, Anda tidak tahu apakah itu dienkripsi, jadi saya akan mencoba menempatkan data serupa.

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 File tabel telah dibuat, jadi mari kita periksa isinya.

File telah dienkripsi dan isi catatan tidak dapat diverifikasi.

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

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

Konversi ke tabel terenkripsi di sepanjang jalan

Jika Anda membuat tabel yang tidak terenkripsi sejak awal, 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, berhati-hatilah untuk tidak menulis ulang semua file tabel, karena akan memakan waktu lama jika ada terlalu banyak catatan.