Aplicación del cifrado transparente (TDE) en tablas MySQL (versión de Windows)

Actualización de la página :
Fecha de creación de la página :

Entorno operativo

MySQL
  • MySQL 8.0 Edición de la comunidad
Windows
  • Windows 11

Prerrequisitos

MySQL
  • MySQL 8.0 Edición de la comunidad
  • MySQL 8.0 Enterprise Edition
Windows
  • Windows 11
  • Windows 10
Servidor de Windows
  • Windows Server 2022
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2

precondición

  • Se instala una base de datos para MySQL.

Acerca del cifrado transparente

El cifrado de datos transparente empresarial, como su nombre lo indica, es una tecnología de cifrado que es más segura que cualquier otra que no lo sea. Normalmente, al cifrar, a menudo es una carga para el implementador porque es necesario realizar el procesamiento de cifrado y descifrado. El significado de este nombre "transparente" es que se puede cifrar sin que el implementador realice ningún cambio en el proceso. Por lo tanto, si realiza algunos cambios en la configuración al principio, el resto se cifrará sin permiso, por lo que es una medida de seguridad muy efectiva.

Sin embargo, como sugiere la frase "no es necesario cambiar nada", si realmente inicia sesión en la base de datos, puede ver los datos normalmente, y si obtiene el registro de la base de datos del programa, puede ver los datos normalmente. Si los datos adquiridos están encriptados, será necesario cambiar el proceso, por lo que no coincidirá con la redacción "No es necesario cambiar el proceso".

Luego, en MySQL, lo que es exactamente el cifrado transparente está encriptado, los "archivos de base de datos almacenados" o los "archivos de tabla" están sujetos a encriptación. Como comprobaremos más adelante, aunque abras el archivo directamente, solo lo encripta para que no puedas ver el contenido, por lo que es necesario operarlo para que no se inicie sesión en la base de datos en funcionamiento real.

Crea una tabla normalmente y comprueba el contenido

Primero, vamos a crear una tabla y registros normalmente. Puedes crearlo como quieras, pero en este caso, lo crearemos ejecutando SQL en Workbench. En este caso, planeamos establecer un cifrado transparente para la tabla, por lo que crearemos la base de datos normalmente.

CREATE DATABASE `test_database`

La mesa también se hace normalmente. El contenido de la columna puede ser cualquier 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;

También pondré un registro aleatorio para verificar el cifrado.

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

Al crear una base de datos o una tabla, se crea en la siguiente carpeta de forma predeterminada.

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

ProgramData La carpeta está oculta, así que hazla visible en la configuración del Explorador.

Hay una carpeta con el nombre de la base de datos que creaste en la carpeta, así que ábrela.

En su interior hay un archivo tabla por tabla.

Abra este archivo en un editor de texto como el Bloc de notas. Como es un archivo binario, creo que básicamente hay una línea de texto que no entiendo bien. Si observa la parte inferior, verá el texto del registro registrado.

Si no está encriptado de esta manera, se conocerá el contenido del registro incluso si el archivo se abre directamente. No es necesario iniciar sesión en la base de datos para saber qué hay dentro.

Configuración de los ajustes de cifrado transparente

Para habilitar el cifrado transparente, debe instalar un complemento. En primer lugar, compruebe si el complemento está incluido con el comando.

Inícialo seleccionando "MySQL 8.0 Command Line Client" en el menú Inicio.

Después de ingresar su contraseña e iniciar sesión, ingrese el siguiente comando:

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

Como aún no lo ha instalado, debería estar vacío.

Ahora, vamos a configurar el plug-in. En primer lugar, cree las siguientes carpetas: De hecho, no importa dónde lo crees o qué nombre tenga. Especifíquelo como la ubicación en la que desea guardar el archivo de claves más adelante.

  • C:\ProgramData\MySQL\mysql-keyring

A continuación, abra el siguiente archivo en un editor de texto:

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

Agregue el siguiente texto al espacio vacío en la parte inferior y guárdelo. Si no puede guardar con privilegios de administrador, puede guardarlo en otra ubicación y, a continuación, sobrescribir el archivo.

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

Reinicie el servicio MySQL. También puede reiniciarlo con el comando.

Al reiniciar, el archivo se crea automáticamente en la carpeta especificada.

Puede comprobar que el plug-in está instalado ejecutando de nuevo el comando check plug-in.

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

Creación de una tabla cifrada

Ahora vamos a crear una tabla cifrada. Crea una tabla similar a la anterior, pero esta vez añade a las ENCRYPTION='Y' opciones. Esta configuración de cifrado no parece ser posible en la GUI en este momento, por lo que debe establecerse 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;

Por cierto, antes de configurar el complemento, incluso si intenta crear una tabla cifrada, se mostrará el siguiente error.

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

Si no tienes ningún dato, no sabes si está encriptado, así que intentaré poner los mismos datos.

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 Dado que se ha creado el archivo de tabla, comprobemos el contenido.

El archivo se ha cifrado y no se puede verificar el contenido del registro.

Por el momento, ya no tiene que preocuparse de que un tercero lea los registros internos con solo iniciar sesión en el servidor y robar el archivo de la tabla directamente. No hay necesidad de cambiar la implementación en absoluto, por lo que creo que es una configuración de seguridad fácil.

Sin embargo, si inicia sesión en la base de datos, puede ver los datos normalmente. Si desea aumentar el nivel de seguridad, debe administrar bien la cuenta de inicio de sesión de la base de datos e introducir un mecanismo de cifrado separado.

Conviértase en una tabla cifrada a lo largo del camino

Si crea inicialmente una tabla sin cifrar, puede convertirla en una tabla cifrada más adelante. En ese caso, puede convertirlo con el siguiente SQL:

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

ejemplo

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

Sin embargo, tenga en cuenta que llevará tiempo si hay muchos registros porque se reescriben todos los archivos de tabla.