MySQL 테이블에 대한 TDE(투명 암호화)(Windows)

페이지 생성 날짜 :

동작 확인 환경

MySQL
  • MySQL 8.0 커뮤니티 에디션
윈도우
  • 윈도우 11

필요한 환경

MySQL
  • MySQL 8.0 커뮤니티 에디션
  • MySQL 8.0 엔터프라이즈 에디션
윈도우
  • 윈도우 11
  • 윈도우 10
윈도우 서버
  • 윈도우 서버 2022
  • 윈도우 서버 2019
  • 윈도우 서버 2016
  • 윈도우 서버 2012 R2

전제 조건

  • MySQL 데이터베이스를 설치해야 합니다.

투명 암호화 정보

Transparent Data Encryption(Enterprise Transparent Data Encryption)은 이름에서 알 수 있듯이 암호화하는 기술로, 이를 하지 않는 것보다 더 안전합니다. 일반적으로 암호화를 수행할 때 암호화 및 복호화 처리를 수행해야 하기 때문에 구현자에게 부담이 되는 경우가 많다. 이 "투명한"의 의미는 구현자가 처리를 변경하지 않고도 암호화할 수 있다는 것입니다. 따라서 처음에 설정을 조금만 조정하면 자체적으로 암호화되기 때문에 매우 효과적인 보안 조치입니다.

그러나 "변경할 필요가 없다"는 말처럼 실제로 데이터베이스에 로그인하면 정상적으로 데이터를 볼 수 있고, 프로그램에서 데이터베이스 기록을 가져오면 정상적으로 데이터를 볼 수 있습니다. 얻은 데이터가 암호화된 경우 처리를 변경해야 하므로 "처리에 변경이 필요하지 않습니다"라는 문구와 일치하지 않습니다.

그렇다면 MySQL에서 투명한 암호화는 정확히 무엇이며 "저장된 데이터베이스 파일" 또는 "테이블 파일"은 암호화됩니다. 나중에 확인하겠습니다만, 파일을 직접 열어도 내용이 보이지 않도록 암호화되어 있을 뿐이므로 실제 조작에서는 데이터베이스에 로그인하지 않도록 조작할 필요가 있습니다.

정상적으로 테이블을 만들고 내용을 확인합니다.

먼저 정상적으로 테이블과 레코드를 만들어 봅시다. 원하는 대로 만들 수 있지만 이번에는 Workbench에서 SQL을 실행하여 생성하겠습니다. 이번에는 테이블에 투명 암호화를 설정할 예정이므로 정상적으로 데이터베이스를 만들 것입니다.

CREATE DATABASE `test_database`

나도 보통으로 테이블을 만듭니다. 열 내용이 무엇이든 될 수 있습니다.

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;

암호화를 확인하기 위해 기록을 보관하십시오.

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

데이터베이스 또는 테이블을 만들 때 기본적으로 다음 폴더에 만들어집니다.

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

ProgramData 폴더는 숨겨진 폴더이므로 파일 탐색기 설정에 표시되는지 확인하십시오.

폴더 안에는 생성한 데이터베이스 이름이 적힌 폴더가 있으므로 엽니다.

내부에는 테이블 수준 파일이 있습니다.

메모장과 같은 텍스트 편집기에서 이 파일을 엽니다. 바이너리 파일이기 때문에 기본적으로 잘 모르는 텍스트가 있다고 생각합니다. 하단을 보면 등록된 레코드의 텍스트가 표시됩니다.

이런 식으로 암호화되지 않은 경우 파일을 직접 열어도 기록의 내용을 알 수 있습니다. 안에 무엇이 있는지 알기 위해 데이터베이스에 로그인할 필요가 없습니다.

투명한 암호화 설정

투명 암호화를 활성화하려면 플러그인을 설치해야 합니다. 먼저 명령을 확인하여 플러그인이 포함되어 있는지 확인합니다.

시작 메뉴에서 MySQL 8.0 명령줄 클라이언트를 선택하여 시작합니다.

비밀번호를 입력하고 로그인한 후 다음 명령을 입력합니다.

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

아직 설치하지 않았기 때문에 비어 있어야 합니다.

이제 플러그인을 구성해 보겠습니다. 먼저 다음 폴더를 만듭니다. 사실 당신이 만든 장소나 이름은 괜찮습니다. 나중에 키 파일을 저장할 위치로 지정합니다.

  • C : \ ProgramData \ MySQL \ mysql-keyring

그런 다음 텍스트 편집기에서 다음 파일을 엽니다.

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

하단 공간에 다음 텍스트를 추가하고 저장합니다. 관리자 권한으로 저장할 수 없는 경우 다른 위치에 저장한 다음 파일을 덮어쓸 수 있습니다.

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

MySQL 서비스를 다시 시작합니다. 명령을 사용하여 다시 시작할 수 있습니다.

다시 시작하면 지정된 폴더에 파일이 자동으로 생성됩니다.

플러그인 확인 명령을 다시 실행하여 플러그인이 설치되었는지 확인할 수 있습니다.

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

암호화 테이블 작성

이제 암호화된 테이블을 만들어 보겠습니다. 이전에 가지고 있던 것과 유사한 테이블을 만들지만 이제 옵션 ENCRYPTION='Y' 에 추가 . 이 암호화 설정은 현재 GUI에서 구성할 수 없는 것 같으므로 명령으로 설정해야 합니다.

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;

덧붙여서, 플러그인을 설정하기 전에 암호화 테이블을 만들려고 해도 다음과 같은 오류가 발생합니다.

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

데이터가 없으면 암호화되어 있는지 모르기 때문에 비슷한 데이터를 넣으려고 합니다.

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 표 파일이 만들어졌으니 내용을 확인합시다.

파일이 암호화되어 레코드의 내용을 확인할 수 없습니다.

우선 제3자로 서버에 로그인하고 테이블 파일을 직접 훔치는 것만으로 내부의 기록을 읽을 수 있다는 걱정은 더 이상 없습니다. 구현을 변경할 필요가 전혀 없기 때문에 쉬운 보안 설정이라고 생각합니다.

그러나 데이터베이스에 로그인하면 데이터를 정상적으로 볼 수 있습니다. 보안 수준을 높이려면 데이터베이스 로그인 계정을 관리하고 별도의 암호화 메커니즘을 도입해야 합니다.

도중에 암호화된 테이블로 변환

처음에 암호화되지 않은 테이블을 만든 경우 나중에 암호화된 테이블로 변환할 수 있습니다. 이 경우 다음 SQL로 변환할 수 있습니다.

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

본보기

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

그러나 레코드가 너무 많으면 시간이 오래 걸리므로 모든 테이블 파일을 다시 작성하지 않도록 주의하십시오.