MySQL Tabloları için Saydam Şifreleme (TDE) (Windows)
İşlem onay ortamı
- MySQL (MySQL Bilişim
-
- MySQL 8.0 Topluluk Sürümü
- Windows
-
- pencereler 11
Gerekli ortam
- MySQL (MySQL Bilişim
-
- MySQL 8.0 Topluluk Sürümü
- MySQL 8.0 Kurumsal Sürüm
- Windows
-
- pencereler 11
- pencereler 10
- Windows Sunucusu
-
- Windows Sunucusu 2022
- Windows Sunucusu 2019
- Windows Sunucusu 2016
- Windows Sunucusu 2012 R2
önkoşul
- MySQL veritabanı kurulmalıdır
Şeffaf Şifreleme Hakkında
Transparent Data Encryption (Kurumsal Şeffaf Veri Şifreleme), adından da anlaşılacağı gibi şifreleyen bir teknolojidir ve bunu yapmamaktan daha güvenlidir. Normalde, şifreleme gerçekleştirildiğinde, şifreleme ve şifre çözme işleminin gerçekleştirilmesi gerektiğinden, genellikle uygulayıcı üzerinde bir yüktür. Bu "şeffaf" ın anlamı, uygulayıcı işlemede herhangi bir değişiklik yapmadan şifrelenebilmesidir. Bu nedenle, çok etkili bir güvenlik önlemidir çünkü başlangıçta ayarlarda biraz değişiklik yapıldıktan sonra kendi kendine şifrelenir.
Ancak, "herhangi bir değişiklik yapmanıza gerek yok" ifadesinden de anlaşılacağı gibi, veritabanına gerçekten giriş yaparsanız, verileri normal şekilde görebilir ve veritabanı kayıtlarını programdan alırsanız, verileri normal şekilde görebilirsiniz. Elde edilen veriler şifrelenirse, işlemede değişiklik yapılması gerekecektir, bu nedenle "işlemede herhangi bir değişiklik gerekli değildir" ifadesiyle eşleşmeyecektir.
Peki, MySQL'de şeffaf şifreleme tam olarak nedir ve "depolanan veritabanı dosyaları" veya "tablo dosyaları" şifrelenir. Daha sonra kontrol edeceğim gibi, dosyayı doğrudan açsanız bile, yalnızca içeriğin görülmemesi için şifrelenir, bu nedenle gerçek işlemde veritabanına giriş yapmaması için çalıştırılması gerekir.
Normal bir tablo oluşturun ve içeriğini kontrol edin
İlk olarak, normal olarak bir tablo ve bir kayıt oluşturalım. İstediğiniz gibi oluşturabilirsiniz ancak bu sefer ben oluşturmak için Workbench'te SQL çalıştıracağım. Bu sefer tablo için şeffaf şifreleme kurmayı planlıyoruz, bu yüzden normal bir veritabanı oluşturacağız.
CREATE DATABASE `test_database`
Ben de normalde bir masa yaparım. Sütun içeriği ne olursa olsun, olabilir.
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;
Şifrelemeyi kontrol etmek için bir kayıt tutun.
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');
Bir veritabanı veya tablo oluşturduğunuzda, varsayılan olarak aşağıdaki klasörlerde oluşturulur:
- C:\ProgramData\MySQL\MySQL Sunucusu 8.0\Veri
ProgramData
Klasör gizli bir klasördür, bu nedenle Dosya Gezgini ayarlarında görünür olduğundan emin olun.
Klasörün içinde, oluşturduğunuz veritabanının adına sahip bir klasör bulunur, bu yüzden açın.
İçinde tablo düzeyinde dosyalar var.
Bu dosyayı Not Defteri gibi bir metin düzenleyicisinde açın. İkili bir dosya olduğu için temelde iyi anlamadığım bir metin olduğunu düşünüyorum. Alt tarafa bakarsanız, kayıtlı kaydın metnini göreceksiniz.
Bu şekilde şifrelenmemişse, sadece dosyayı doğrudan açarak kaydın içeriğini öğrenebilirsiniz. İçinde ne olduğunu öğrenmek için veritabanına giriş yapmanız gerekmez.
Saydam şifrelemeyi ayarlayın
Şeffaf Şifrelemeyi etkinleştirmek için bir eklenti yüklemeniz gerekir. İlk olarak, eklentinin dahil olup olmadığını görmek için komutu kontrol edin.
Başlatmak için Başlat menüsünden MySQL 8.0 Komut Satırı İstemcisi'ni seçin.
Şifrenizi girdikten ve giriş yaptıktan sonra aşağıdaki komutu girin:
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
Henüz yüklemedim, bu yüzden boş olmalı.
Şimdi eklentiyi yapılandıralım. İlk olarak, aşağıdaki klasörleri oluşturun: Aslında, oluşturduğunuz yer veya isim gayet iyi. Anahtar dosyasını daha sonra kaydetmek için bir konum olarak belirtin.
- C:\ProgramData\MySQL\mysql-anahtarlık
Ardından aşağıdaki dosyayı bir metin düzenleyicide açın.
- C:\ProgramData\MySQL\MySQL Sunucusu 8.0\my.ini
Aşağıdaki metni alt boşluğa ekleyin ve kaydedin. Yönetici ayrıcalıklarıyla kaydedemiyorsanız, başka bir konuma kaydedebilir ve ardından dosyanın üzerine yazabilirsiniz.
early-plugin-load=keyring_file.dll
keyring_file_data=C:\ProgramData\MySQL\mysql-keyring\keyring
MySQL hizmetini yeniden başlatın. Bir komutla yeniden başlatabilirsiniz.
Yeniden başlattıktan sonra, dosya belirtilen klasörde otomatik olarak oluşturulacaktır.
Eklentinin yüklendiğini doğrulamak için Check Plugin (Eklentiyi Denetle) komutunu yeniden çalıştırabilirsiniz.
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
Şifreleme tablosu oluşturma
Şimdi şifreli bir tablo oluşturalım.
Daha önce sahip olduğumuza benzer bir tablo oluşturun, ancak şimdi seçeneklere ENCRYPTION='Y'
ekleyin .
Bu şifreleme ayarı şu anda GUI'de yapılandırılabilir gibi görünmüyor, bu nedenle komutla ayarlanması gerekiyor.
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;
Bu arada, eklentiyi kurmadan önce, bir şifreleme tablosu oluşturmaya çalışsanız bile, aşağıdaki hatayı alacaksınız.
Can't find master key from keyring, please check in the server log if a keyring is loaded and initialized successfully. キーリングからマスターキーが見つかりません。キーリングが正常にロードされ、初期化されているかどうかをサーバーログで確認してください。
Verileriniz yoksa, şifreli olup olmadığını bilemezsiniz, bu yüzden benzer verileri koymaya çalışacağım.
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
Bir tablo dosyası oluşturuldu, o yüzden içeriğini kontrol edelim.
Dosya şifrelenmiştir ve kaydın içeriği doğrulanamamaktadır.
Şimdilik, sadece üçüncü bir tarafla sunucuya giriş yaparak ve doğrudan tablo dosyasını çalarak içerideki kayıtları okuyabilme konusunda endişelenmeme gerek yok. Bunun kolay bir güvenlik ayarı olduğunu düşünüyorum çünkü uygulamayı değiştirmeye hiç gerek yok.
Ancak, veritabanına giriş yaparsanız, verileri normal şekilde görebilirsiniz. Güvenlik seviyesini artırmak istiyorsanız, veritabanı oturum açma hesaplarını yönetmeniz ve ayrı bir şifreleme mekanizması uygulamanız gerekir.
Yol boyunca şifrelenmiş tablolara dönüştürün
İlk etapta şifrelenmemiş bir tablo oluşturursanız, bunu daha sonra şifrelenmiş bir tabloya dönüştürebilirsiniz. Bu durumda, aşağıdaki SQL ile dönüştürebilirsiniz:
use <データベース名>;
ALTER TABLE <テーブル名> ENCRYPTION='Y';
örnek
use test_database;
ALTER TABLE plain_user ENCRYPTION='Y';
Ancak, çok fazla kayıt olması uzun zaman alacağından, tüm tablo dosyalarını yeniden yazmamaya dikkat edin.