Applicare Transparent Encryption (TDE) sulle tabelle MySQL (versione Windows)

Pagina aggiornata :
Data di creazione della pagina :

Ambiente operativo

MySQL
  • MySQL 8.0 Edizione comunitaria
Finestre
  • finestre 11

Prerequisiti

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

precondizione

  • È installato un database per MySQL.

Informazioni su Transparent Encryption

Enterprise Transparent Data Encryption, come suggerisce il nome, è una tecnologia di crittografia più sicura di qualsiasi altra che non lo sia. Normalmente, durante la crittografia, è spesso un onere per l'implementatore perché è necessario eseguire l'elaborazione della crittografia e della decrittografia. Il significato di questo nome "trasparente" è che può essere crittografato senza che l'implementatore apporti modifiche al processo. Pertanto, se apporti alcune modifiche alle impostazioni all'inizio, il resto verrà crittografato senza autorizzazione, quindi è una misura di sicurezza molto efficace.

Tuttavia, come suggerisce la frase "non c'è bisogno di modificare nulla", se si accede effettivamente al database, è possibile visualizzare i dati normalmente e se si ottiene il record del database dal programma, è possibile visualizzare i dati normalmente. Se i dati acquisiti sono crittografati, sarà necessario modificare il processo, quindi non corrisponderà alla dicitura "Non è necessario modificare il processo".

Quindi, in MySQL, ciò che è esattamente la crittografia trasparente è crittografato, i "file di database memorizzati" o i "file di tabella" sono soggetti a crittografia. Come vedremo in seguito, anche se apri direttamente il file, lo crittografa solo in modo che tu non possa vedere il contenuto, quindi è necessario farlo funzionare in modo che non sia loggato nel database durante il funzionamento effettivo.

Crea una tabella normalmente e controlla il contenuto

Innanzitutto, creiamo una tabella e dei record normalmente. Puoi crearlo come vuoi, ma in questo caso lo creeremo eseguendo SQL in Workbench. In questo caso, si prevede di impostare la crittografia trasparente per la tabella, quindi verrà creato il database normalmente.

CREATE DATABASE `test_database`

Anche il tavolo è fatto normalmente. Il contenuto della colonna può essere qualsiasi cosa.

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;

Inserirò anche un record casuale 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');

Quando si crea un database o una tabella, per impostazione predefinita viene creato nella cartella seguente.

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

ProgramData La cartella è nascosta, quindi rendila visibile nelle impostazioni di Explorer.

C'è una cartella con il nome del database che hai creato nella cartella, quindi aprila.

All'interno c'è un file tabella per tabella.

Aprire questo file in un editor di testo, ad esempio Blocco note. Dato che si tratta di un file binario, penso che ci sia fondamentalmente una riga di testo che non capisco bene. Se guardi in basso, vedrai il testo del record registrato.

Se non è crittografato in questo modo, il contenuto del record sarà noto anche se il file viene aperto direttamente. Non è necessario accedere al database per sapere cosa c'è dentro.

Configurazione delle impostazioni di Transparent Encryption

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

Avvialo selezionando "MySQL 8.0 Command Line Client" dal menu Start.

Dopo aver inserito la password e aver effettuato l'accesso, inserisci il seguente comando:

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

Dal momento che non l'hai ancora installato, dovrebbe essere vuoto.

A questo punto, configuriamo il plug-in. Innanzitutto, crea le seguenti cartelle: In effetti, non importa dove lo crei o quale nome abbia. Specificarlo come percorso in cui si desidera salvare il file di 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 vuoto in basso e salvalo. Se non è possibile salvare con 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. Puoi anche riavviarlo con il comando.

Al riavvio, il file viene creato automaticamente nella cartella specificata.

È possibile verificare che il plug-in sia installato eseguendo nuovamente il comando check plug-in.

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

Creazione di una tabella crittografata

A questo punto creiamo una tabella crittografata. Crea una tabella simile alla precedente, ma questa volta aggiungi alle ENCRYPTION='Y' opzioni. Questa impostazione di crittografia non sembra essere possibile nella GUI in questo momento, quindi deve essere impostata con un 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 che il plug-in venga configurato, anche se si tenta di creare una tabella crittografata, verrà visualizzato 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 gli stessi dati.

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 Dal momento che il file della tabella è stato creato, controlliamo il contenuto.

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

Per il momento, non devi più preoccuparti che una terza parte legga i record all'interno semplicemente accedendo al server e rubando direttamente il file della tabella. Non c'è bisogno di modificare l'implementazione, quindi penso che sia un'impostazione di sicurezza semplice.

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

Eseguire la conversione in una tabella crittografata lungo il percorso

Se inizialmente si crea una tabella non crittografata, è 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, tieni presente che ci vorrà del tempo se ci sono molti record perché tutti i file della tabella vengono riscritti.