Impor criptografia transparente (TDE) em tabelas MySQL (versão Windows)
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.