Transparent Encryption (TDE) per le tabelle MySQL (Windows)

Data di creazione della pagina :

Ambiente di conferma dell'operazione

MySQL
  • MySQL 8.0 Edizione comunitaria
Finestre
  • finestre 11

Ambiente richiesto

MySQL
  • MySQL 8.0 Edizione comunitaria
  • MySQL 8.0 Edizione Enterprise
Finestre
  • finestre 11
  • finestre 10
Windows Server
  • Windows Server 2022
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2

precondizione

  • Il database MySQL deve essere installato

Informazioni su Transparent Encryption

Transparent Data Encryption (Enterprise Transparent Data Encryption) è una tecnologia che crittografa come suggerisce il nome, ed è più sicura che non farlo. Normalmente, quando viene eseguita la crittografia, è spesso un onere per l'implementatore perché è necessario eseguire l'elaborazione della crittografia e della decrittografia. Il significato di questo "trasparente" è che può essere crittografato senza che l'implementatore apporti modifiche all'elaborazione. Pertanto, è una misura di sicurezza molto efficace perché viene crittografata da sola dopo solo una piccola modifica delle impostazioni all'inizio.

Tuttavia, come suggerisce la frase "non è necessario apportare modifiche", se si accede effettivamente al database, è possibile visualizzare i dati normalmente, mentre se si ottengono i record del database dal programma, è possibile visualizzare i dati normalmente. Se i dati ottenuti sono crittografati, sarà necessario apportare modifiche al trattamento, in modo che non corrispondano all'affermazione "non sono necessarie modifiche al trattamento".

Quindi, cos'è esattamente la crittografia trasparente in MySQL e i "file di database memorizzati" o i "file di tabella" sono crittografati. Come controllerò in seguito, anche se apri direttamente il file, è solo crittografato in modo che il contenuto non possa essere visto, quindi è necessario utilizzarlo in modo che non acceda al database in funzionamento effettivo.

Crea una tabella normalmente e controlla il contenuto

Innanzitutto, creiamo normalmente una tabella e un record. Puoi crearlo come vuoi, ma questa volta eseguirò SQL in Workbench per crearlo. Questa volta, prevediamo di impostare la crittografia trasparente per la tabella, quindi creeremo un database normalmente.

CREATE DATABASE `test_database`

Faccio anche una tabella normalmente. Qualunque sia il contenuto della colonna, può esserlo.

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;

Tieni un registro per controllare la crittografia.

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

Per impostazione predefinita, quando si crea un database o una tabella, questa viene creata nelle cartelle seguenti:

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

ProgramData La cartella è una cartella nascosta, quindi assicurati che sia visibile nelle impostazioni di Esplora file.

All'interno della cartella c'è una cartella con il nome del database che hai creato, quindi aprila.

All'interno ci sono file a livello di tabella.

Apri questo file in un editor di testo come Blocco note. Trattandosi di un file binario, penso che ci sia fondamentalmente del testo che non capisco bene. Se guardi in basso, vedrai il testo del record registrato.

Se non è crittografato in questo modo, è possibile conoscere il contenuto del record semplicemente aprendo direttamente il file. Non è necessario accedere al database per sapere cosa c'è dentro.

Configurare la crittografia trasparente

Per abilitare la crittografia trasparente, è necessario installare un plug-in. Innanzitutto, controlla il comando per vedere se il plug-in è incluso.

Seleziona MySQL 8.0 Command Line Client dal menu Start per avviarlo.

Una volta inserita la password e effettuato l'accesso, immettere il seguente comando:

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

Non l'ho ancora installato, quindi dovrebbe essere vuoto.

Ora configuriamo il plugin. Innanzitutto, crea le seguenti cartelle: In effetti, il luogo o il nome che crei va bene. Specificarlo come percorso per salvare il file della chiave in un secondo momento.

  • C:\ProgramData\MySQL\mysql-keyring

Quindi apri il seguente file in un editor di testo.

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

Aggiungi il seguente testo nello spazio inferiore e salvalo. Se non è possibile salvare con i privilegi di amministratore, è possibile salvarlo in un'altra posizione e quindi sovrascrivere il file.

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

Riavvia il servizio MySQL. È possibile riavviarlo con un comando.

Dopo il riavvio, il file verrà creato automaticamente nella cartella specificata.

È possibile eseguire nuovamente il comando Check Plugin per verificare che il plug-in sia installato.

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

Creazione di una tabella di crittografia

Ora creiamo una tabella crittografata. Crea una tabella simile a quella che avevamo prima, ma ora aggiungi alle opzioni ENCRYPTION='Y' . Al momento, questa impostazione di crittografia non sembra essere configurabile nell'interfaccia grafica, pertanto deve essere impostata tramite comando.

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;

A proposito, prima di configurare il plugin, anche se provi a creare una tabella di crittografia, riceverai il seguente errore.

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

Se non hai dati, non sai se sono crittografati, quindi cercherò di inserire dati simili.

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 È stato creato un file tabellare, quindi controlliamo il contenuto.

Il file è stato crittografato e il contenuto del record non può essere verificato.

Per il momento, non devo più preoccuparmi di poter leggere i record all'interno semplicemente accedendo al server con una terza parte e rubando direttamente il file della tabella. Penso che sia un'impostazione di sicurezza semplice perché non è necessario modificare affatto l'implementazione.

Tuttavia, se si accede al database, è possibile visualizzare i dati normalmente. Se si desidera aumentare il livello di sicurezza, è necessario gestire gli account di accesso al database e introdurre un meccanismo di crittografia separato.

Converti in tabelle crittografate lungo il percorso

Se si crea una tabella non crittografata in primo luogo, è possibile convertirla in una tabella crittografata in un secondo momento. In tal caso, è possibile convertirlo con il seguente SQL:

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

esempio

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

Tuttavia, fai attenzione a non riscrivere tutti i file della tabella, poiché ci vorrà molto tempo se ci sono troppi record.