บังคับใช้การเข้ารหัสแบบโปร่งใส (TDE) บนตาราง MySQL (เวอร์ชัน Windows)

ปรับปรุงหน้า :
วันที่สร้างเพจ :

สภาพแวดล้อมในการทํางาน

MySQL
  • MySQL 8.0 รุ่นชุมชน
หน้าต่าง
  • หน้าต่าง 11

เบื้องต้น

MySQL
  • MySQL 8.0 รุ่นชุมชน
  • MySQL 8.0 องค์กร Edition
หน้าต่าง
  • หน้าต่าง 11
  • หน้าต่าง 10
เซิร์ฟเวอร์ Windows
  • เซิร์ฟเวอร์ Windows 2022
  • เซิร์ฟเวอร์ Windows 2019
  • เซิร์ฟเวอร์ Windows 2016
  • R2 Windows Server ๒๐๑๒

เงื่อนไขเบื้องต้น

  • มีการติดตั้งฐานข้อมูลสําหรับ MySQL

เกี่ยวกับการเข้ารหัสแบบโปร่งใส

การเข้ารหัสข้อมูลแบบโปร่งใสขององค์กรตามชื่อหมายถึงเป็นเทคโนโลยีการเข้ารหัสที่ปลอดภัยกว่าสิ่งที่ไม่มี โดยปกติเมื่อเข้ารหัสมักเป็นภาระของผู้ดําเนินการเนื่องจากจําเป็นต้องดําเนินการเข้ารหัสและถอดรหัส ความหมายของชื่อนี้ "โปร่งใส" คือสามารถเข้ารหัสได้โดยไม่ต้องให้ผู้ดําเนินการทําการเปลี่ยนแปลงใด ๆ กับกระบวนการ ดังนั้นหากคุณทําการเปลี่ยนแปลงการตั้งค่าเล็กน้อยในตอนเริ่มต้นส่วนที่เหลือจะถูกเข้ารหัสโดยไม่ได้รับอนุญาตดังนั้นจึงเป็นมาตรการรักษาความปลอดภัยที่มีประสิทธิภาพมาก

อย่างไรก็ตามตามวลีที่" ไม่จําเป็นต้องเปลี่ยนแปลงอะไร" แนะนําหากคุณลงชื่อเข้าใช้ฐานข้อมูลจริงคุณสามารถดูข้อมูลได้ตามปกติและหากคุณได้รับบันทึกฐานข้อมูลจากโปรแกรมคุณสามารถดูข้อมูลได้ตามปกติ หากข้อมูลที่ได้มาถูกเข้ารหัสจําเป็นต้องเปลี่ยนกระบวนการดังนั้นจึงไม่ตรงกับถ้อยคํา "ไม่จําเป็นต้องเปลี่ยนกระบวนการ"

จากนั้นใน MySQL การเข้ารหัสแบบโปร่งใสคืออะไรจะถูกเข้ารหัส "ไฟล์ฐานข้อมูลที่เก็บไว้" หรือ "ไฟล์ตาราง" อาจมีการเข้ารหัส ในขณะที่เราจะตรวจสอบในภายหลังแม้ว่าคุณจะเปิดไฟล์โดยตรง แต่ก็เข้ารหัสเฉพาะเพื่อให้คุณไม่เห็นเนื้อหาดังนั้นจึงจําเป็นต้องใช้งานเพื่อไม่ให้ลงชื่อเข้าใช้ฐานข้อมูลในการใช้งานจริง

สร้างตารางตามปกติและตรวจสอบเนื้อหา

ก่อนอื่นเรามาสร้างตารางและบันทึกตามปกติ คุณสามารถสร้างได้ตามที่คุณต้องการ แต่ในกรณีนี้ เราจะสร้างโดยดําเนินการ SQL ใน Workbench ในกรณีนี้เราวางแผนที่จะตั้งค่าการเข้ารหัสแบบโปร่งใสสําหรับตารางดังนั้นเราจะสร้างฐานข้อมูลตามปกติ

CREATE DATABASE `test_database`

โต๊ะยังทําตามปกติ เนื้อหาของคอลัมน์สามารถเป็นอะไรก็ได้

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;

ฉันจะใส่บันทึกแบบสุ่มเพื่อตรวจสอบการเข้ารหัส

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

เมื่อคุณสร้างฐานข้อมูลหรือตาราง ฐานข้อมูลหรือตารางนั้นจะถูกสร้างขึ้นในโฟลเดอร์ต่อไปนี้ตามค่าเริ่มต้น

  • C : \\ ProgramData \\ MySQL \\ MySQL Server 8.0 \\ ข้อมูล

ProgramData โฟลเดอร์ถูกซ่อนไว้ดังนั้นทําให้มองเห็นได้ในการตั้งค่า Explorer

มีโฟลเดอร์ที่มีชื่อของฐานข้อมูลที่คุณสร้างในโฟลเดอร์ดังนั้นให้เปิด

ข้างในมีแฟ้มแบบตารางต่อโต๊ะ

เปิดไฟล์นี้ในโปรแกรมแก้ไขข้อความ เช่น Notepad เนื่องจากเป็นไฟล์ไบนารีฉันคิดว่าโดยพื้นฐานแล้วมีบรรทัดข้อความที่ฉันไม่เข้าใจดี หากคุณดูที่ด้านล่างคุณจะเห็นข้อความของบันทึกที่ลงทะเบียน

หากไม่ได้เข้ารหัสด้วยวิธีนี้เนื้อหาของเรกคอร์ดจะเป็นที่รู้จักแม้ว่าไฟล์จะถูกเปิดโดยตรง คุณไม่จําเป็นต้องเข้าสู่ระบบฐานข้อมูลเพื่อทราบว่ามีอะไรอยู่ข้างใน

การกําหนดการตั้งค่าการเข้ารหัสแบบโปร่งใส

หากต้องการเปิดใช้งานการเข้ารหัสแบบโปร่งใส คุณต้องติดตั้งปลั๊กอิน ขั้นแรก ให้ตรวจสอบว่าปลั๊กอินรวมอยู่ในคําสั่งหรือไม่

เริ่มต้นด้วยการเลือก "MySQL 8.0 Command Line Client" จากเมนูเริ่ม

หลังจากป้อนรหัสผ่านและเข้าสู่ระบบแล้ว ให้ป้อนคําสั่งต่อไปนี้:

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

เนื่องจากคุณยังไม่ได้ติดตั้ง จึงควรว่างเปล่า

ตอนนี้เรามาตั้งค่าปลั๊กอินกัน ขั้นแรก ให้สร้างโฟลเดอร์ต่อไปนี้: ในความเป็นจริงไม่สําคัญว่าคุณจะสร้างมันขึ้นมาที่ไหนหรือชื่ออะไร ระบุเป็นตําแหน่งที่คุณต้องการบันทึกไฟล์คีย์ในภายหลัง

  • C:\ProgramData\MySQL\mysql-พวงกุญแจ

จากนั้นเปิดไฟล์ต่อไปนี้ในโปรแกรมแก้ไขข้อความ:

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

เพิ่มข้อความต่อไปนี้ลงในพื้นที่ว่างที่ด้านล่างและบันทึก ถ้าคุณไม่สามารถบันทึกด้วยสิทธิ์ของผู้ดูแลระบบ คุณสามารถบันทึกไปยังตําแหน่งอื่นแล้วเขียนทับไฟล์ได้

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

เริ่มบริการ MySQL ใหม่ คุณยังสามารถรีสตาร์ทได้ด้วยคําสั่ง

เมื่อคุณรีสตาร์ทไฟล์จะถูกสร้างขึ้นโดยอัตโนมัติในโฟลเดอร์ที่ระบุ

คุณสามารถตรวจสอบได้ว่ามีการติดตั้งปลั๊กอินแล้ว โดยการเรียกใช้คําสั่งตรวจสอบปลั๊กอินอีกครั้ง

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

การสร้างตารางที่เข้ารหัสลับ

ตอนนี้เรามาสร้างตารางที่เข้ารหัส สร้างตารางที่คล้ายกับตารางก่อนหน้า แต่คราวนี้เพิ่ม ENCRYPTION='Y' ตัวเลือก การตั้งค่าการเข้ารหัสนี้ดูเหมือนจะไม่สามารถทําได้ใน GUI ในขณะนี้ ดังนั้นจึงต้องตั้งค่าด้วยคําสั่ง

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;

อย่างไรก็ตามก่อนที่จะกําหนดค่าปลั๊กอินแม้ว่าคุณจะพยายามสร้างตารางที่เข้ารหัสข้อผิดพลาดต่อไปนี้จะปรากฏขึ้น

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

หากคุณไม่มีข้อมูลใด ๆ คุณไม่รู้ว่ามันถูกเข้ารหัสหรือไม่ดังนั้นฉันจะพยายามใส่ข้อมูลเดียวกัน

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 เนื่องจากไฟล์ตารางถูกสร้างขึ้นมาตรวจสอบเนื้อหากัน

แฟ้มถูกเข้ารหัสลับ และไม่สามารถตรวจสอบเนื้อหาของเรกคอร์ดได้

ในขณะนี้ คุณไม่ต้องกังวลว่าบุคคลที่สามจะอ่านบันทึกภายในอีกต่อไปเพียงแค่ลงชื่อเข้าใช้เซิร์ฟเวอร์และขโมยไฟล์ตารางโดยตรง ไม่จําเป็นต้องเปลี่ยนการใช้งานเลย ดังนั้นฉันคิดว่ามันเป็นการตั้งค่าความปลอดภัยที่ง่าย

อย่างไรก็ตาม หากคุณเข้าสู่ระบบฐานข้อมูล คุณสามารถดูข้อมูลได้ตามปกติ หากคุณต้องการเพิ่มระดับความปลอดภัยคุณต้องจัดการบัญชีเข้าสู่ระบบฐานข้อมูลให้ดีและแนะนํากลไกการเข้ารหัสแยกต่างหาก

แปลงเป็นตารางที่เข้ารหัสไปพร้อมกัน

หากคุณสร้างตารางที่ไม่ได้เข้ารหัสในตอนแรก คุณสามารถแปลงเป็นตารางที่เข้ารหัสได้ในภายหลัง ในกรณีนั้น คุณสามารถแปลงด้วย SQL ต่อไปนี้:

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

ตัวอย่าง

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

อย่างไรก็ตาม โปรดทราบว่าจะใช้เวลาหากมีระเบียนจํานวนมาก เนื่องจากไฟล์ตารางทั้งหมดจะถูกเขียนใหม่