TDE (Transparent Encryption) para tabelas MySQL (Windows)

Data de criação de página :

Ambiente de confirmação de operação

O MySQL
  • MySQL 8.0 Community Edition
Windows
  • janelas 11

Ambiente necessário

O MySQL
  • MySQL 8.0 Community Edition
  • MySQL 8.0 Edição Empresarial
Windows
  • janelas 11
  • janelas 10
Servidor Windows
  • Servidor Windows 2022
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2

pré-condição

  • O banco de dados MySQL deve ser instalado

Sobre a criptografia transparente

Transparent Data Encryption (Enterprise Transparent Data Encryption) é uma tecnologia que criptografa como o nome sugere e é mais segura do que não fazer isso. Normalmente, quando a criptografia é executada, geralmente é um fardo para o implementador, pois é necessário executar o processamento de criptografia e descriptografia. O significado desse "transparente" é que ele pode ser criptografado sem que o implementador faça nenhuma alteração no processamento. Portanto, é uma medida de segurança muito eficaz porque é criptografada por conta própria após apenas alguns ajustes nas configurações no início.

No entanto, como sugere a frase "não há necessidade de fazer alterações", se você realmente fizer login no banco de dados, poderá ver os dados normalmente e, se obtiver os registros do banco de dados do programa, poderá ver os dados normalmente. Se os dados obtidos forem criptografados, será necessário fazer alterações no processamento, portanto, não corresponderá à afirmação "nenhuma alteração é necessária no processamento".

Então, o que exatamente é criptografia transparente no MySQL, e "arquivos de banco de dados armazenados" ou "arquivos de tabela" são criptografados. Como verificarei mais tarde, mesmo que você abra o arquivo diretamente, ele é criptografado apenas para que o conteúdo não possa ser visto, por isso é necessário operá-lo para que ele não faça login no banco de dados em operação real.

Crie uma tabela normalmente e verifique o conteúdo

Primeiro, vamos criar uma tabela e um registro normalmente. Você pode criá-lo como quiser, mas desta vez vou executar SQL no Workbench para criá-lo. Desta vez, planejamos configurar a criptografia transparente para a tabela, portanto, criaremos um banco de dados normalmente.

CREATE DATABASE `test_database`

Eu também faço uma tabela normalmente. Seja qual for o conteúdo da coluna, pode ser.

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;

Mantenha um registro 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 nas seguintes pastas por padrão:

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

ProgramData A pasta é uma pasta oculta, portanto, certifique-se de que ela esteja visível nas configurações do Explorador de Arquivos.

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

Dentro estão os arquivos de nível de tabela.

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

Se não estiver criptografado dessa forma, você poderá saber o conteúdo do registro apenas abrindo o arquivo diretamente. Você não precisa fazer login no banco de dados para saber o que está dentro.

Configurar a criptografia transparente

Para habilitar a Criptografia Transparente, você precisa instalar um plug-in. Primeiro, verifique o comando para ver se o plug-in está incluído.

Selecione MySQL 8.0 Command Line Client no menu Iniciar para iniciá-lo.

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

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

Ainda não o instalei, então deve estar vazio.

Agora vamos configurar o plugin. Primeiro, crie as seguintes pastas: Na verdade, o lugar ou nome que você cria é bom. Especifique-o como um local para salvar o arquivo de chave mais tarde.

  • C: \ ProgramData \ MySQL \ mysql-keyring

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 inferior e salve-o. Se você não puder salvar com privilégios de administrador, 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ê pode reiniciá-lo com um comando.

Após a reinicialização, o arquivo será criado automaticamente na pasta especificada.

Você pode executar o comando Verificar plug-in novamente para verificar se o plug-in está instalado.

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

Criando uma tabela de criptografia

Agora vamos criar uma tabela criptografada. Crie uma tabela semelhante à que tínhamos antes, mas agora adicione às opções ENCRYPTION='Y' . Essa configuração de criptografia não parece ser configurável na GUI no momento, portanto, deve ser definida por 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 de configurar o plug-in, mesmo que você tente criar uma tabela de criptografia, receberá o seguinte erro.

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 dados, não sabe se eles estão criptografados, então tentarei colocar dados semelhantes.

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

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

Por enquanto, não preciso mais me preocupar em ler os registros internos apenas fazendo login no servidor com terceiros e roubando o arquivo da tabela diretamente. Acho que é uma configuração de segurança fácil porque não há necessidade de alterar a implementação.

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

Converta em tabelas criptografadas ao longo do caminho

Se você criar uma tabela não criptografada em primeiro lugar, 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, tome cuidado para não reescrever todos os arquivos da tabela, pois levará muito tempo se houver muitos registros.