Wymuszanie przezroczystego szyfrowania (TDE) w tabelach MySQL (wersja dla systemu Windows)

Strona zaktualizowana :
Data utworzenia strony :

Środowisko pracy

Baza danych MySQL
  • MySQL 8.0 Community Edition
Windows
  • Okna 11

Warunki wstępne

Baza danych 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

  • Zainstalowano bazę danych dla MySQL.

Informacje o szyfrowaniu Transparent

Enterprise Transparent Data Encryption, jak sama nazwa wskazuje, to technologia szyfrowania, która jest bezpieczniejsza niż wszystko, co jej nie ma. Zwykle podczas szyfrowania często jest to obciążenie dla implementatora, ponieważ konieczne jest wykonanie szyfrowania i odszyfrowywania. Znaczenie tej nazwy "przezroczysty" polega na tym, że można go zaszyfrować bez wprowadzania jakichkolwiek zmian w procesie przez implementatora. Dlatego jeśli na początku wprowadzisz kilka zmian w ustawieniach, reszta zostanie zaszyfrowana bez pozwolenia, więc jest to bardzo skuteczny środek bezpieczeństwa.

Jednak, jak sugeruje fraza "nie musisz niczego zmieniać", jeśli faktycznie zalogujesz się do bazy danych, możesz normalnie zobaczyć dane, a jeśli otrzymasz rekord bazy danych z programu, możesz normalnie zobaczyć dane. Jeśli pozyskane dane zostaną zaszyfrowane, konieczna będzie zmiana procesu, więc nie będzie on pasował do sformułowania "Nie ma potrzeby zmiany procesu".

Następnie w MySQL szyfrowane jest to, co dokładnie jest przezroczystym szyfrowaniem, szyfrowane są "przechowywane pliki bazy danych" lub "pliki tabel". Jak sprawdzimy później, nawet jeśli otworzysz plik bezpośrednio, szyfruje go tylko tak, abyś nie mógł zobaczyć zawartości, dlatego konieczne jest jego obsługa, aby nie był zalogowany do bazy danych w rzeczywistym działaniu.

Utwórz tabelę normalnie i sprawdź zawartość

Najpierw utwórzmy tabelę i rekordy normalnie. Możesz go utworzyć w dowolny sposób, ale w tym przypadku utworzymy go, wykonując SQL w Workbench. W takim przypadku planujemy ustawić przezroczyste szyfrowanie dla tabeli, więc bazę danych utworzymy normalnie.

CREATE DATABASE `test_database`

Stół jest również wykonany normalnie. Zawartość kolumny może być dowolna.

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;

Wstawię również losowy zapis, 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ącym folderze.

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

ProgramData Folder jest ukryty, więc uwidocznij go w ustawieniach Eksploratora.

W folderze znajduje się folder z nazwą utworzonej bazy danych, więc otwórz go.

Wewnątrz znajduje się plik tabela po tabeli.

Otwórz ten plik w edytorze tekstu, takim jak Notatnik. Ponieważ jest to plik binarny, myślę, że w zasadzie jest tam linia tekstu, której nie rozumiem dobrze. Jeśli spojrzysz na dół, zobaczysz tekst zarejestrowanego rekordu.

Jeśli nie zostanie zaszyfrowany w ten sposób, zawartość rekordu będzie znana, nawet jeśli plik zostanie otwarty bezpośrednio. Nie musisz logować się do bazy danych, aby wiedzieć, co jest w środku.

Konfigurowanie ustawień przezroczystego szyfrowania

Aby włączyć przezroczyste szyfrowanie, musisz zainstalować wtyczkę. Najpierw sprawdź, czy wtyczka jest dołączona do polecenia.

Uruchom go, wybierając "MySQL 8.0 Command Line Client" z menu Start.

Po wprowadzeniu hasła i zalogowaniu wprowadź następujące polecenie:

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

Ponieważ jeszcze go nie zainstalowałeś, powinien być pusty.

Teraz skonfigurujmy wtyczkę. Najpierw utwórz następujące foldery: W rzeczywistości nie ma znaczenia, gdzie go stworzysz ani jaka to nazwa. 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 do pustego miejsca na dole i zapisz go. Jeśli nie możesz zapisać z uprawnieniami administratora, możesz zapisać plik w innej lokalizacji, a następnie nadpisać plik.

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

Uruchom ponownie usługę MySQL. Możesz także ponownie uruchomić go za pomocą polecenia.

Po ponownym uruchomieniu plik zostanie automatycznie utworzony w określonym folderze.

Aby sprawdzić, czy wtyczka jest zainstalowana, należy ponownie uruchomić polecenie check plug-in.

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

Tworzenie zaszyfrowanej tabeli

Teraz utwórzmy zaszyfrowaną tabelę. Utwórz tabelę podobną do poprzedniej, ale tym razem dodaj do ENCRYPTION='Y' opcji. To ustawienie szyfrowania nie wydaje się być obecnie możliwe w graficznym interfejsie użytkownika, dlatego 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 skonfigurowaniem wtyczki, nawet jeśli spróbujesz utworzyć zaszyfrowaną tabelę, zostanie wyświetlony 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 żadnych danych, nie wiesz, czy są zaszyfrowane, więc postaram się umieścić te same 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 Ponieważ plik tabeli został utworzony, sprawdźmy jego zawartość.

Plik został zaszyfrowany i nie można zweryfikować zawartości rekordu.

Na razie nie musisz się już martwić, że osoba trzecia odczyta zapisy w środku, po prostu logując się na serwer i bezpośrednio kradnąc plik tabeli. Nie ma potrzeby w ogóle zmieniać implementacji, więc myślę, że jest to łatwe ustawienie bezpieczeństwa.

Jeśli jednak zalogujesz się do bazy danych, możesz normalnie zobaczyć dane. Jeśli chcesz zwiększyć poziom bezpieczeństwa, musisz dobrze zarządzać kontem logowania do bazy danych i wprowadzić osobny mechanizm szyfrowania.

Po drodze konwertuj na zaszyfrowaną tabelę

Jeśli początkowo utworzysz tabelę niezaszyfrowaną, możesz ją później przekonwertować na tabelę zaszyfrowaną. W takim przypadku możesz go przekonwertować 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 pamiętać, że zajmie to trochę czasu, jeśli istnieje wiele rekordów, ponieważ wszystkie pliki tabel są przepisywane.