הצפנה שקופה (TDE) עבור טבלאות MySQL (Windows)

תאריך יצירת דף :

סביבת אישור פעולה

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

סביבה נדרשת

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

תנאי מוקדם

  • יש להתקין מסד נתונים MySQL

מידע על הצפנה שקופה

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

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

אז מהי בעצם הצפנה שקופה ב- 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 Plugin כדי לוודא שהתוסף מותקן.

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

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