การเข้ารหัสแบบโปร่งใส (TDE) สําหรับตาราง MySQL (Windows)
สภาพแวดล้อมการยืนยันการทํางาน
- MySQL
-
- MySQL 8.0 รุ่นชุมชน
- หน้าต่าง
-
- หน้าต่าง 11
สภาพแวดล้อมที่ต้องการ
- MySQL
-
- MySQL 8.0 รุ่นชุมชน
- MySQL 8.0 รุ่น Enterprise
- หน้าต่าง
-
- หน้าต่าง 11
- หน้าต่าง 10
- เซิร์ฟเวอร์ Windows
-
- หน้าต่างเซิร์ฟเวอร์ 2022
- วินโดวส์เซิร์ฟเวอร์ 2019
- วินโดวส์ เซิร์ฟเวอร์ 2016
- Windows Server 2012 R2
เงื่อนไขเบื้องต้น
- ต้องติดตั้งฐานข้อมูล MySQL
เกี่ยวกับการเข้ารหัสแบบโปร่งใส
การเข้ารหัสข้อมูลที่โปร่งใส (Enterprise Transparent Data Encryption) เป็นเทคโนโลยีที่เข้ารหัสตามชื่อที่แนะนํา และปลอดภัยกว่าการไม่ทําเช่นนี้ โดยปกติเมื่อทําการเข้ารหัสมักจะเป็นภาระของผู้ใช้งานเนื่องจากจําเป็นต้องดําเนินการเข้ารหัสและถอดรหัส ความหมายของ "โปร่งใส" นี้คือสามารถเข้ารหัสได้โดยไม่ต้องทําการเปลี่ยนแปลงใด ๆ กับการประมวลผล ดังนั้นจึงเป็นมาตรการรักษาความปลอดภัยที่มีประสิทธิภาพมากเนื่องจากมีการเข้ารหัสด้วยตัวเองหลังจากปรับแต่งการตั้งค่าเพียงเล็กน้อยในตอนเริ่มต้น
อย่างไรก็ตามตามวลี "ไม่จําเป็นต้องทําการเปลี่ยนแปลงใด ๆ " แนะนําหากคุณลงชื่อเข้าใช้ฐานข้อมูลจริงคุณจะเห็นข้อมูลได้ตามปกติและหากคุณได้รับบันทึกฐานข้อมูลจากโปรแกรมคุณจะเห็นข้อมูลได้ตามปกติ หากข้อมูลที่ได้รับถูกเข้ารหัส จําเป็นต้องทําการเปลี่ยนแปลงการประมวลผล ดังนั้นจึงไม่ตรงกับข้อความ "ไม่จําเป็นต้องเปลี่ยนแปลงการประมวลผล"
ดังนั้นการเข้ารหัสแบบโปร่งใสใน 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\Data
ProgramData
โฟลเดอร์เป็นโฟลเดอร์ที่ซ่อนอยู่ ดังนั้นตรวจสอบให้แน่ใจว่ามองเห็นได้ในการตั้งค่า File Explorer
ภายในโฟลเดอร์มีโฟลเดอร์ที่มีชื่อของฐานข้อมูลที่คุณสร้างขึ้นดังนั้นให้เปิด
ข้างในเป็นไฟล์ระดับตาราง
เปิดแฟ้มนี้ในโปรแกรมแก้ไขข้อความ เช่น แผ่นจดบันทึก เนื่องจากเป็นไฟล์ไบนารี ฉันคิดว่ามีข้อความที่ฉันไม่เข้าใจดี หากคุณดูที่ด้านล่างคุณจะเห็นข้อความของบันทึกที่ลงทะเบียน
หากไม่ได้เข้ารหัสด้วยวิธีนี้คุณสามารถทราบเนื้อหาของบันทึกได้เพียงแค่เปิดไฟล์โดยตรง คุณไม่จําเป็นต้องลงชื่อเข้าใช้ฐานข้อมูลเพื่อทราบว่ามีอะไรอยู่ข้างใน
ตั้งค่าการเข้ารหัสแบบโปร่งใส
หากต้องการเปิดใช้งานการเข้ารหัสแบบโปร่งใส คุณต้องติดตั้งปลั๊กอิน ขั้นแรก ให้ตรวจสอบคําสั่งเพื่อดูว่ามีปลั๊กอินรวมอยู่ด้วยหรือไม่
เลือก MySQL 8.0 Command Line Client จากเมนู Start เพื่อเปิดใช้งาน
เมื่อคุณป้อนรหัสผ่านและเข้าสู่ระบบแล้ว ให้ป้อนคําสั่งต่อไปนี้:
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
ฉันยังไม่ได้ติดตั้ง ดังนั้นมันควรจะว่างเปล่า
ตอนนี้เรามากําหนดค่าปลั๊กอินกัน ขั้นแรก ให้สร้างโฟลเดอร์ต่อไปนี้: ในความเป็นจริงสถานที่หรือชื่อที่คุณสร้างขึ้นนั้นใช้ได้ ระบุเป็นตําแหน่งเพื่อบันทึกไฟล์คีย์ในภายหลัง
- C:\ProgramData\MySQL\mysql-keyring
จากนั้นเปิดไฟล์ต่อไปนี้ในโปรแกรมแก้ไขข้อความ
- 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';
อย่างไรก็ตาม โปรดระวังอย่าเขียนไฟล์ตารางทั้งหมดใหม่ เนื่องจากจะใช้เวลานานหากมีระเบียนมากเกินไป