Cifrado transparente (TDE) para tablas MySQL (Windows)

Fecha de creación de la página :

Entorno de confirmación de operaciones

MySQL
  • Edición comunitaria de MySQL 8.0
Windows
  • Windows 11

Entorno requerido

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

precondición

  • La base de datos MySQL debe estar instalada

Acerca del cifrado transparente

El cifrado de datos transparente (Enterprise Transparent Data Encryption) es una tecnología que encripta como su nombre indica, y es más seguro que no hacerlo. Normalmente, cuando se realiza el cifrado, a menudo es una carga para el implementador porque es necesario realizar el procesamiento de cifrado y descifrado. El significado de este "transparente" es que se puede cifrar sin que el implementador realice ningún cambio en el procesamiento. Por lo tanto, es una medida de seguridad muy efectiva porque se encripta por sí sola después de un pequeño ajuste de la configuración al principio.

Sin embargo, como sugiere la frase "no es necesario realizar ningún cambio", si realmente inicia sesión en la base de datos, puede ver los datos normalmente, y si obtiene los registros de la base de datos del programa, puede ver los datos normalmente. Si los datos obtenidos están encriptados, será necesario realizar cambios en el tratamiento, por lo que no coincidirán con la afirmación "no se requieren cambios en el tratamiento".

Entonces, ¿qué es exactamente el cifrado transparente en MySQL, y los "archivos de base de datos almacenados" o "archivos de tabla" están encriptados? Como comprobaré más adelante, aunque abra el archivo directamente, solo está encriptado para que no se pueda ver el contenido, por lo que es necesario operarlo para que no 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 un registro normalmente. Puede crearlo como quiera, pero esta vez ejecutaré SQL en Workbench para crearlo. Esta vez, planeamos configurar un cifrado transparente para la tabla, por lo que crearemos una base de datos normalmente.

CREATE DATABASE `test_database`

También hago una tabla normalmente. Cualquiera que sea el contenido de la columna, puede serlo.

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;

Mantenga un registro 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');

Cuando se crea una base de datos o una tabla, se crea en las siguientes carpetas de forma predeterminada:

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

ProgramData La carpeta es una carpeta oculta, así que asegúrese de que esté visible en la configuración del Explorador de archivos.

Dentro de la carpeta hay una carpeta con el nombre de la base de datos que creó, así que ábrala.

Dentro hay archivos a nivel de tabla.

Abra este archivo en un editor de texto como el Bloc de notas. Dado que es un archivo binario, creo que básicamente hay texto que no entiendo bien. Si miras en la parte inferior, verás el texto del registro registrado.

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

Configurar un cifrado transparente

Para habilitar el cifrado transparente, debe instalar un complemento. Primero, verifique el comando para ver si el complemento está incluido.

Seleccione MySQL 8.0 Command Line Client en el menú Inicio para iniciarlo.

Una vez que haya ingresado su contraseña e iniciado sesión, ingrese el siguiente comando:

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

Todavía no lo he instalado, por lo que debería estar vacío.

Ahora configuremos el plugin. Primero, cree las siguientes carpetas: De hecho, el lugar o el nombre que creas está bien. Especifíquelo como ubicación para guardar el archivo de claves más adelante.

  • C: \ ProgramData \ MySQL \ mysql-keyring

Luego abra el siguiente archivo en un editor de texto.

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

Agregue el siguiente texto al espacio 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. Puede reiniciarlo con un comando.

Después de reiniciar, el archivo se creará automáticamente en la carpeta especificada.

Puede ejecutar el comando Comprobar complemento de nuevo para verificar que el complemento esté instalado.

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

Creación de una tabla de cifrado

Ahora vamos a crear una tabla cifrada. Crea una tabla similar a la que teníamos antes, pero ahora añade a las opciones ENCRYPTION='Y' . Esta configuración de cifrado no parece ser configurable en la GUI en este momento, por lo que debe establecerse mediante 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 plugin, incluso si intentas crear una tabla de cifrado, recibirás 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 datos, no sabes si están encriptados, así que intentaré poner datos similares.

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 Se ha creado un archivo de tabla, así que vamos a comprobar el contenido.

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

Por el momento, ya no tengo que preocuparme por poder leer los registros que contiene simplemente iniciando sesión en el servidor con un tercero y robando el archivo de la tabla directamente. Creo que es una configuración de seguridad fácil porque no hay necesidad de cambiar la implementación en absoluto.

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 las cuentas de inicio de sesión de la base de datos e introducir un mecanismo de cifrado independiente.

Conversión a tablas cifradas en el camino

Si crea una tabla sin cifrar en primer lugar, 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 cuidado de no volver a escribir todos los archivos de tabla, ya que llevará mucho tiempo si hay demasiados registros.