رمزگذاری شفاف (TDE) برای جداول MySQL (ویندوز)
محیط تایید عملیات
- Mysql
-
- MySQL 8.0 نسخه انجمن
- ویندوز
-
- ویندوز 11
محیط مورد نیاز
- Mysql
-
- MySQL 8.0 نسخه انجمن
- MySQL 8.0 نسخه سازمانی
- ویندوز
-
- ویندوز 11
- ویندوز 10
- ویندوز سرور
-
- ویندوز سرور 2022
- ویندوز سرور 2019
- ویندوز سرور 2016
- ویندوز سرور 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');
هنگامی که یک پایگاه داده یا جدول ایجاد می کنید، به طور پیش فرض در پوشه های زیر ایجاد می شود:
- ج:\ProgramData\MySQL\MySQL Server 8.0\Data
ProgramData
این پوشه یک پوشه مخفی است، بنابراین مطمئن شوید که در تنظیمات File Explorer قابل مشاهده است.
در داخل پوشه پوشه ای با نام پایگاه داده ای که ایجاد کرده اید وجود دارد، بنابراین آن را باز کنید.
در داخل فایل های سطح جدول وجود دارد.
این فایل را در یک ویرایشگر متنی مانند Notepad باز کنید. از آنجایی که این یک فایل باینری است، فکر می کنم اساسا متنی وجود دارد که من آن را به خوبی درک نمی کنم. اگر به پایین نگاه کنید، متن رکورد ثبت شده را مشاهده خواهید کرد.
اگر به این روش رمزگذاری نشده باشد، فقط با باز کردن مستقیم فایل می توانید محتویات رکورد را بدانید. لازم نیست وارد پایگاه داده شوید تا بدانید چه چیزی در داخل آن وجود دارد.
رمزگذاری شفاف را تنظیم کنید
برای فعال کردن رمزگذاری شفاف، باید یک افزونه نصب کنید. ابتدا دستور را بررسی کنید تا ببینید آیا افزونه گنجانده شده است یا خیر.
MySQL 8.0 Command Line Client را از منوی Start انتخاب کنید تا راه اندازی شود.
پس از وارد کردن رمز عبور و ورود به سیستم، دستور زیر را وارد کنید:
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
من هنوز آن را نصب نکرده ام، بنابراین باید خالی باشد.
حالا بیایید افزونه را پیکربندی کنیم. ابتدا پوشه های زیر را ایجاد کنید: در واقع، مکان یا نامی که ایجاد می کنید خوب است. آن را به عنوان مکانی برای ذخیره فایل کلید بعدا مشخص کنید.
- C:\ProgramData\MySQL\mysql-keyring
سپس فایل زیر را در یک ویرایشگر متن باز کنید.
- ج:\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';
با این حال، مراقب باشید که همه فایل های جدول را بازنویسی نکنید، زیرا اگر رکوردهای زیادی وجود داشته باشد، زمان زیادی طول می کشد.