אכוף הצפנה שקופה (TDE) בטבלאות MySQL (גירסת Windows)

עודכן דף :
תאריך יצירת דף :

סביבת הפעלה

MySQL
  • MySQL 8.0 מהדורת קהילה
חלונות
  • חלונות 11

דרישות מוקדמות

MySQL
  • MySQL 8.0 מהדורת קהילה
  • MySQL 8.0 Enterprise Edition
חלונות
  • חלונות 11
  • חלונות 10
שרת Windows
  • שרת Windows 2022
  • שרת Windows 2019
  • שרת Windows 2016
  • Windows Server 2012 R2

תנאי מקדים

  • מותקן מסד נתונים עבור MySQL.

אודות הצפנה שקופה

הצפנת נתונים שקופה ארגונית, כפי שהשם מרמז, היא טכנולוגיית הצפנה מאובטחת יותר מכל דבר שאינו עושה זאת. בדרך כלל, בעת הצפנה, זה לעתים קרובות נטל על מיישם כי יש צורך לבצע הצפנה ועיבוד פענוח. משמעות השם "שקוף" היא שניתן להצפין אותו מבלי שהמיישם יבצע שינויים כלשהם בתהליך. לכן, אם תבצע כמה שינויים בהגדרות בהתחלה, השאר יוצפן ללא רשות, ולכן זהו אמצעי אבטחה יעיל מאוד.

עם זאת, כפי שעולה מהביטוי "אין צורך לשנות דבר", אם אתה באמת נכנס למסד הנתונים, אתה יכול לראות את הנתונים כרגיל, ואם אתה מקבל את רשומת מסד הנתונים מהתוכנית, אתה יכול לראות את הנתונים כרגיל. אם הנתונים שנרכשו מוצפנים, יהיה צורך לשנות את התהליך, כך שהוא לא יתאים לניסוח "אין צורך לשנות את התהליך".

לאחר מכן, ב- MySQL, מה בדיוק הצפנה שקופה מוצפן, "קבצי מסד נתונים מאוחסנים" או "קבצי טבלה" כפופים להצפנה. כפי שנבדוק בהמשך, גם אם תפתח את הקובץ ישירות, הוא רק מצפין אותו כך שלא תוכל לראות את התוכן, ולכן יש צורך להפעיל אותו כך שהוא לא מחובר למסד הנתונים בפעולה בפועל.

יצירת טבלה כרגיל ובדיקת התוכן

ראשית, בוא ניצור טבלה ורשומות כרגיל. באפשרותך ליצור אותו בכל דרך שתרצה, אך במקרה זה, ניצור אותו על-ידי הפעלת SQL ב- Workbench. במקרה זה, אנו מתכננים להגדיר הצפנה שקופה עבור הטבלה, כך שניצור את מסד הנתונים כרגיל.

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. באפשרותך גם להפעיל אותו מחדש באמצעות הפקודה.

בעת הפעלה מחדש, הקובץ נוצר באופן אוטומטי בתיקיה שצוינה.

באפשרותך לוודא שהתוסף מותקן על-ידי הפעלה חוזרת של הפקודה check plug-in.

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

יצירת טבלה מוצפנת

עכשיו בואו ניצור טבלה מוצפנת. צור טבלה דומה לקודמתה, אך הפעם הוסף לאפשרויות ENCRYPTION='Y' . נראה כי הגדרת הצפנה זו אינה אפשרית בממשק המשתמש הגרפי בשלב זה, ולכן יש להגדיר אותה באמצעות פקודה.

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 מאז נוצר קובץ הטבלה, בוא נבדוק את התוכן.

הקובץ הוצפן ולא ניתן לאמת את תוכן הרשומה.

לעת עתה, אתה כבר לא צריך לדאוג שצד שלישי יקרא את הרשומות בפנים רק על ידי כניסה לשרת וגניבת קובץ הטבלה ישירות. אין צורך לשנות את היישום בכלל, ולכן אני חושב שזו הגדרת אבטחה קלה.

עם זאת, אם תיכנס למסד הנתונים, תוכל לראות את הנתונים כרגיל. אם ברצונך להגדיל את רמת האבטחה, עליך לנהל היטב את חשבון הכניסה למסד הנתונים ולהציג מנגנון הצפנה נפרד.

המרה לטבלה מוצפנת לאורך הדרך

אם תיצור תחילה טבלה לא מוצפנת, תוכל להמיר אותה לטבלה מוצפנת מאוחר יותר. במקרה כזה, תוכל להמיר אותו באמצעות SQL הבא:

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

דוגמה

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

עם זאת, שים לב שייקח זמן אם יש רשומות רבות מכיוון שכל קבצי הטבלה משוכתבים.