Przezroczyste szyfrowanie (TDE) dla tabel MySQL (Windows)
Środowisko potwierdzenia operacji
- Język MySQL
-
- MySQL 8.0 Community Edition
- Windows
-
- Okna 11
Wymagane środowisko
- Język MySQL
-
- MySQL 8.0 Community Edition
- MySQL 8.0 Enterprise Edition
- Windows
-
- Okna 11
- Okna 10
- Serwer z systemem Windows
-
- Windows Server 2022
- Windows Server 2019
- Windows Server 2016
- Windows Server 2012 R2
Warunek wstępny
- Baza danych MySQL musi być zainstalowana
Informacje o szyfrowaniu transparentnym
Transparent Data Encryption (Enterprise Transparent Data Encryption) to technologia, która szyfruje, jak sama nazwa wskazuje, i jest bezpieczniejsza niż jej brak. Zwykle, gdy szyfrowanie jest wykonywane, często jest to obciążenie dla implementatora, ponieważ konieczne jest przeprowadzenie szyfrowania i odszyfrowywania. Znaczenie tego "transparentu" polega na tym, że można go zaszyfrować bez wprowadzania przez realizatora jakichkolwiek zmian w przetwarzaniu. Dlatego jest to bardzo skuteczny środek bezpieczeństwa, ponieważ jest szyfrowany samodzielnie po niewielkim dostosowaniu ustawień na początku.
Jednak, jak sugeruje fraza "nie ma potrzeby wprowadzania żadnych zmian", jeśli faktycznie zalogujesz się do bazy danych, możesz normalnie zobaczyć dane, a jeśli otrzymasz rekordy bazy danych z programu, możesz je normalnie zobaczyć. W przypadku, gdy pozyskane dane są zaszyfrowane, konieczne będzie dokonanie zmian w przetwarzaniu, a więc nie będzie ono zgodne ze stwierdzeniem "nie są wymagane żadne zmiany w przetwarzaniu".
Czym dokładnie jest przezroczyste szyfrowanie w MySQL, a "przechowywane pliki bazy danych" lub "pliki tabel" są szyfrowane. Jak sprawdzę później, nawet jeśli otworzysz plik bezpośrednio, jest on tylko zaszyfrowany, aby nie było widać zawartości, dlatego konieczne jest jego operowanie tak, aby nie logował się do bazy danych w rzeczywistym działaniu.
Utwórz tabelę normalnie i sprawdź zawartość
Najpierw utwórzmy normalnie tabelę i rekord. Możesz go stworzyć w dowolny sposób, ale tym razem uruchomię SQL w Workbench, aby go utworzyć. Tym razem planujemy skonfigurować przezroczyste szyfrowanie tabeli, więc normalnie utworzymy bazę danych.
CREATE DATABASE `test_database`
Normalnie też robię stół. Niezależnie od zawartości kolumny, może tak być.
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;
Prowadź rejestr, aby sprawdzić szyfrowanie.
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');
Podczas tworzenia bazy danych lub tabeli jest ona domyślnie tworzona w następujących folderach:
- C:\ProgramData\MySQL\MySQL Server 8.0\Dane
ProgramData
Folder jest folderem ukrytym, więc upewnij się, że jest widoczny w ustawieniach Eksploratora plików.
Wewnątrz folderu znajduje się folder z nazwą utworzonej bazy danych, więc otwórz go.
Wewnątrz znajdują się pliki na poziomie tabeli.
Otwórz ten plik w edytorze tekstu, takim jak Notatnik. Ponieważ jest to plik binarny, myślę, że w zasadzie jest tam tekst, którego dobrze nie rozumiem. Jeśli spojrzysz na dół, zobaczysz tekst zarejestrowanego rekordu.
Jeśli nie jest zaszyfrowany w ten sposób, możesz poznać zawartość rekordu, po prostu otwierając plik bezpośrednio. Nie musisz logować się do bazy danych, aby wiedzieć, co jest w środku.
Konfigurowanie przezroczystego szyfrowania
Aby włączyć Transparent Encryption, musisz zainstalować wtyczkę. Najpierw sprawdź polecenie, aby zobaczyć, czy wtyczka jest dołączona.
Wybierz MySQL 8.0 Command Line Client z menu Start, aby go uruchomić.
Po wprowadzeniu hasła i zalogowaniu się wprowadź następujące polecenie:
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
Jeszcze go nie zainstalowałem, więc powinien być pusty.
Teraz skonfigurujmy wtyczkę. Najpierw utwórz następujące foldery: W rzeczywistości miejsce lub nazwa, którą tworzysz, jest w porządku. Określ go jako lokalizację, w której chcesz później zapisać plik klucza.
- C:\ProgramData\MySQL\mysql-keyring
Następnie otwórz następujący plik w edytorze tekstu.
- C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
Dodaj następujący tekst w dolnym miejscu i zapisz go. Jeśli nie możesz zapisać pliku z uprawnieniami administratora, możesz zapisać go w innej lokalizacji, a następnie zastąpić plik.
early-plugin-load=keyring_file.dll
keyring_file_data=C:\ProgramData\MySQL\mysql-keyring\keyring
Uruchom ponownie usługę MySQL. Możesz go ponownie uruchomić za pomocą polecenia.
Po ponownym uruchomieniu plik zostanie automatycznie utworzony w określonym folderze.
Możesz ponownie uruchomić polecenie Sprawdź wtyczkę, aby sprawdzić, czy wtyczka jest zainstalowana.
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
Tworzenie tabeli szyfrowania
Teraz utwórzmy zaszyfrowaną tabelę.
Utwórz tabelę podobną do tej, którą mieliśmy wcześniej, ale teraz dodaj do opcji ENCRYPTION='Y'
.
Wydaje się, że to ustawienie szyfrowania nie jest obecnie konfigurowalne w graficznym interfejsie użytkownika, więc należy je ustawić za pomocą polecenia.
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;
Nawiasem mówiąc, przed zainstalowaniem wtyczki, nawet jeśli spróbujesz utworzyć tabelę szyfrowania, otrzymasz następujący błąd.
Can't find master key from keyring, please check in the server log if a keyring is loaded and initialized successfully. キーリングからマスターキーが見つかりません。キーリングが正常にロードされ、初期化されているかどうかをサーバーログで確認してください。
Jeśli nie masz danych, nie wiesz, czy są one zaszyfrowane, więc postaram się umieścić podobne dane.
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
Plik tabeli został utworzony, więc sprawdźmy jego zawartość.
Plik został zaszyfrowany i nie można zweryfikować jego zawartości.
Na razie nie muszę się już martwić o to, czy będę w stanie odczytać zapisy w środku, po prostu logując się do serwera za pomocą osoby trzeciej i bezpośrednio kradnąc plik tabeli. Myślę, że jest to łatwe ustawienie bezpieczeństwa, ponieważ nie ma potrzeby w ogóle zmieniać implementacji.
Jeśli jednak zalogujesz się do bazy danych, możesz normalnie zobaczyć dane. Jeśli chcesz zwiększyć poziom bezpieczeństwa, musisz zarządzać kontami logowania do bazy danych i wprowadzić osobny mechanizm szyfrowania.
Konwertuj na zaszyfrowane tabele po drodze
Jeśli najpierw utworzysz niezaszyfrowaną tabelę, możesz ją później przekonwertować na zaszyfrowaną tabelę. W takim przypadku możesz przekonwertować go za pomocą następującego kodu SQL:
use <データベース名>;
ALTER TABLE <テーブル名> ENCRYPTION='Y';
przykład
use test_database;
ALTER TABLE plain_user ENCRYPTION='Y';
Należy jednak uważać, aby nie przepisywać wszystkich plików tabeli, ponieważ zajmie to dużo czasu, jeśli jest zbyt wiele rekordów.