Impor criptografia transparente (TDE) em tabelas MySQL (versão Windows)

Página atualizada :
Data de criação de página :

Ambiente operacional

MySQL
  • MySQL 8.0 Edição Comunitária
Windows
  • Janelas 11

Pré-requisitos

MySQL
  • MySQL 8.0 Edição Comunitária
  • MySQL 8.0 Enterprise Edition
Windows
  • Janelas 11
  • Janelas 10
Servidor Windows
  • Windows Server 2022
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2

pré-condição

  • Um banco de dados para MySQL está instalado.

Sobre a criptografia transparente

A Enterprise Transparent Data Encryption, como o nome indica, é uma tecnologia de criptografia mais segura do que qualquer outra que não seja. Normalmente, ao criptografar, muitas vezes é um fardo para o implementador, porque é necessário executar o processamento de criptografia e descriptografia. O significado desse nome "transparente" é que ele pode ser criptografado sem que o implementador faça alterações no processo. Portanto, se você fizer algumas alterações nas configurações no início, o resto será criptografado sem permissão, por isso é uma medida de segurança muito eficaz.

No entanto, como a frase "não precisa alterar nada" sugere, se você realmente fizer login no banco de dados, você pode ver os dados normalmente, e se você obter o registro do banco de dados do programa, você pode ver os dados normalmente. Se os dados adquiridos forem criptografados, será necessário alterar o processo, portanto, ele não corresponderá à expressão "Não há necessidade de alterar o processo".

Então, no MySQL, o que exatamente é criptografia transparente é criptografado, "arquivos de banco de dados armazenados" ou "arquivos de tabela" estão sujeitos à criptografia. Como verificaremos mais adiante, mesmo que você abra o arquivo diretamente, ele apenas o criptografa para que você não possa ver o conteúdo, por isso é necessário operá-lo para que ele não esteja logado no banco de dados em operação real.

Crie uma tabela normalmente e verifique o conteúdo

Primeiro, vamos criar uma tabela e registros normalmente. Você pode criá-lo como quiser, mas, neste caso, vamos criá-lo executando SQL no Workbench. Nesse caso, planejamos definir criptografia transparente para a tabela, então criaremos o banco de dados normalmente.

CREATE DATABASE `test_database`

A tabela também é feita normalmente. O conteúdo da coluna pode ser qualquer coisa.

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;

Também vou colocar um registro aleatório para verificar a criptografia.

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 você cria um banco de dados ou tabela, ele é criado na seguinte pasta por padrão.

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

ProgramData A pasta está oculta, portanto, torne-a visível nas configurações do Explorer.

Há uma pasta com o nome do banco de dados que você criou na pasta, então abra-a.

Dentro há um arquivo tabela por tabela.

Abra esse arquivo em um editor de texto, como o bloco de notas. Como é um arquivo binário, acho que há basicamente uma linha de texto que eu não entendo bem. Se você olhar para a parte inferior, verá o texto do registro registrado.

Se ele não for criptografado dessa forma, o conteúdo do registro será conhecido mesmo se o arquivo for aberto diretamente. Você não precisa fazer login no banco de dados para saber o que está dentro.

Definindo configurações de criptografia transparente

Para habilitar a criptografia transparente, você precisa instalar um plug-in. Primeiro, verifique se o plug-in está incluído com o comando.

Inicie-o selecionando "MySQL 8.0 Command Line Client" no menu Iniciar.

Depois de digitar sua senha e fazer login, digite o seguinte comando:

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

Como você ainda não o instalou, ele deve estar vazio.

Agora, vamos configurar o plug-in. Primeiro, crie as seguintes pastas: Na verdade, não importa onde você o cria ou qual nome é. Especifique-o como o local onde você deseja salvar o arquivo de chave mais tarde.

  • C:\ProgramData\MySQL\mysql-chaveiro

Em seguida, abra o seguinte arquivo em um editor de texto:

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

Adicione o seguinte texto ao espaço vazio na parte inferior e salve-o. Se não for possível salvar com privilégios de administrador, você poderá salvá-lo em outro local e substituir o arquivo.

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

Reinicie o serviço MySQL. Você também pode reiniciá-lo com o comando.

Quando você reinicia, o arquivo é criado automaticamente na pasta especificada.

Você pode verificar se o plug-in está instalado executando o comando check plug-in novamente.

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

Criando uma tabela criptografada

Agora vamos criar uma tabela criptografada. Crie uma tabela semelhante à anterior, mas desta vez adicione às ENCRYPTION='Y' opções. Essa configuração de criptografia não parece ser possível na GUI no momento, portanto, ela deve ser definida com um 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 propósito, antes que o plug-in seja configurado, mesmo se você tentar criar uma tabela criptografada, o seguinte erro será exibido.

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

Se você não tem nenhum dado, você não sabe se ele está criptografado, então vou tentar colocar os mesmos dados.

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 Como o arquivo de tabela foi criado, vamos verificar o conteúdo.

O arquivo foi criptografado e o conteúdo do registro não pode ser verificado.

Por enquanto, você não precisa mais se preocupar com um terceiro lendo os registros dentro apenas fazendo login no servidor e roubando o arquivo de tabela diretamente. Não há necessidade de alterar a implementação, então acho que é uma configuração de segurança fácil.

No entanto, se você fizer logon no banco de dados, poderá ver os dados normalmente. Se você quiser aumentar o nível de segurança, precisará gerenciar bem a conta de login do banco de dados e introduzir um mecanismo de criptografia separado.

Converter em uma tabela criptografada ao longo do caminho

Se você criar inicialmente uma tabela não criptografada, poderá convertê-la em uma tabela criptografada posteriormente. Nesse caso, você pode convertê-lo com o seguinte SQL:

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

exemplo

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

No entanto, observe que levará tempo se houver muitos registros, porque todos os arquivos de tabela são reescritos.