Διαφανής κρυπτογράφηση (TDE) για πίνακες MySQL (Windows)
Περιβάλλον επιβεβαίωσης λειτουργίας
- MySQL
-
- MySQL 8.0 Κοινότητα Edition
- παράθυρα
-
- Παράθυρα 11
Απαιτούμενο περιβάλλον
- MySQL
-
- MySQL 8.0 Κοινότητα Edition
- MySQL 8.0 Enterprise Edition
- παράθυρα
-
- Παράθυρα 11
- Παράθυρα 10
- Διακομιστής των Windows
-
- Τα Windows Server 2022
- Τα Windows Server 2019
- Τα Windows Server 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
Ο φάκελος είναι ένας κρυφός φάκελος, επομένως βεβαιωθείτε ότι είναι ορατός στις ρυθμίσεις της Εξερεύνησης αρχείων.
Μέσα στο φάκελο υπάρχει ένας φάκελος με το όνομα της βάσης δεδομένων που δημιουργήσατε, οπότε ανοίξτε τον.
Στο εσωτερικό υπάρχουν αρχεία σε επίπεδο πίνακα.
Ανοίξτε αυτό το αρχείο σε ένα πρόγραμμα επεξεργασίας κειμένου όπως το Σημειωματάριο (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. Μπορείτε να το επανεκκινήσετε με μια εντολή.
Μετά την επανεκκίνηση, το αρχείο θα δημιουργηθεί αυτόματα στον καθορισμένο φάκελο.
Μπορείτε να εκτελέσετε ξανά την εντολή Check Plugin για να επαληθεύσετε ότι η προσθήκη είναι εγκατεστημένη.
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';
Ωστόσο, προσέξτε να μην ξαναγράψετε όλα τα αρχεία πίνακα, καθώς θα χρειαστεί πολύς χρόνος εάν υπάρχουν πάρα πολλές εγγραφές.