1 Şubat 2014 Cumartesi

Dosya-Database Bazlı Şifreleme (Transparent Data Encryption) - Bölüm 5


Bu bölüme kadar incelediğimiz Column-Level Encryption, kolon veya satır bazında metinsel alanları şifrelemek için kullanılmaktaydı. Hem yazma hem de okuma işleminde encryp-decrypt yapılması zorunlu olan bu yöntem, şifrelenecek alanlar çoğaldıkça kaynaklara olduğu gibi programlama tarafına da ciddi yük getirmektedir. Bu konudaki bir önceki yazımıza şu adresten ulaşabilirsiniz.


Eğer şifrelenecek alanlar çok fazlaysa ve istediğimiz şey veri tabanının şifreleme yaptığımız server haricinde çalıştırılamaması ise TDE(Transparent Data Encryption) yöntemini tercih etmemiz daha doğru olacaktır.

TDE yöntemiyle, diskteki pagelere encyrpt edilerek yazılan veriler, memoryde decrypt edilmiş şekilde tutulurlar. Bu durum verinin boyutunda bir değişikliğe sebep olmazken CPU kullanımını (%5-%10 civarı ) ve index bozulma hızını arttırmaktadır. Eğer keyler veya sertifikalar daha sonra kullanılmak üzere yedeklenmemişse, server seviyesinde gerçekleşen bir felaket durumundan sonra verilere erişilemeyecektir.

Transparent Data Encryption yapabilmek için aşağıdaki resimde olduğu gibi bir takım key ve sertifika oluşturmak gerekmektedir. Biz bu resimdeki numaralarla belirttiğim gereksinimleri yerine getiriyor olacağız. Diğerleri zaten işletim sistemi ve SQL Server kurulumu sonrasında hazır hale gelmiş durumda. İlk iki adım hakkında bilgi edinmek isterseniz şu yazıma bir göz atabilirsiniz.




Bu konuda ayrıntılı bilgi için msdn’den de faydalanabilirsiniz.


Şimdi bu işlemleri bir örnek üzerinde görelim. Öncelikle TDE yöntemiyle şifreleyeceğimiz bir veri tabanı oluşturalım.

CREATE DATABASE TDE_DB

TDE encryption için master veri tabanında gerekli altyapıyı hazırlayalım. master veri tabanı üzerinde TDE için kullanılacak “Database Master Key"i oluşturalım. “Service Master Key” bu keyi korumaktadır.

USE master
GO
CREATE MASTER KEY
ENCRYPTION BY PASSWORD=N'pass@word1'

Oluşturduğumuz bu DMK ile korunan bir de server “Certificate” oluşturalım.

CREATE CERTIFICATE tde_Cert
WITH SUBJECT='TDE serfikam'

Şifrelemek istediğimiz veri tabanını kullanıma alarak, TDE işlemi için gerekli olan “Data Encrption Key”i üreteceğiz.

DEK için 4 şifreleme algoritması( AES_128, AES_192, AES_256, TRIPLE_DES_3KEY) ile birlikte bu keyi koruyacak server Certificate veya server Asymmetric Key belirtilmelidir. Bu konudaki ayrıntılı bilgiye şu linkten ulaşabilirsiniz.




Bu aşamadan sonra TDE’yi aktif etmek için TDE_DB/Task/Manage Database Encryption… ara yüzünden de faydalanabilirsiniz.


Komutlarla devam edelim:

USE TDE_DB
GO

TDE işleminde kullanılacak "Database Encryption Key" oluşturalım. Bu key yukarıdaki tde_cert tarafından korunacaktır. İstenirse server “Certificate” yerine server “Asymmetric Key” de kullanılabilir.

CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_128
ENCRYPTION BY SERVER CERTIFICATE tde_Cert

Bu işlemden sonra çıkan uyarıyı göz ardı etmeyip Certificate ve Private Keyin yedeğini almalıyız. Aksi halde bir felaket durumunda veri tabanını tekrar açıp kullanamayabiliriz.

USE master
GO
BACKUP CERTIFICATE tde_Cert
TO FILE ='C:\TDEBackups\tde_Cert.cer'
WITH PRIVATE KEY
     (
          FILE ='C:\TDEBackups\tde_Cert.pvk',
          ENCRYPTION BY PASSWORD=N'pass@word1'
     )



Daha sonra bu sertifika şu şekilde yedekten tekrar üretilebilir.

USE master
GO
CREATE CERTIFICATE tde_Cert
FROM FILE = 'C:\TDEBackups\tde_Cert.cer'

WITH PRIVATE KEY
     (
          FILE ='C:\TDEBackups\tde_Cert.pvk',
          DECRYPTION BY PASSWORD='pass@word1' 
     )

NOT: Bu sertifika farklı bir serverda üretilecekse önce master databaseinde DMK(Database Master Key) oluşturulmalıdır.

Bundan sonra TDE_DB isimli veri tabanımızda Transparent Data Encrytion’ı şu şekilde aktif edebiliriz.

USE TDE_DB
Go
ALTER DATABASE TDE_DB
SET ENCRYPTION ON

Artık veri tabanımız yeni bir servera taşındığında okunamayacak, okunabilmesi için yedeğini aldığımız sertifikaya ihtiyaç duyacaktır.

Yapılan tüm işlemleri geri almak istersek şu sırada keyleri ve certificatei kaldırabiliriz.

Önce TDE’yi pasif hale getirelim.

USE TDE_DB
Go
ALTER DATABASE TDE_DB
SET ENCRYPTION OFF

Database Encrption Key’i kaldıralım.

DROP DATABASE ENCRYPTION KEY

Server Certificate’i kaldıralım.

USE master
GO
DROP CERTIFICATE tde_Cert

Master databaseindeki Database Master Key’i kaldıralım.

DROP MASTER KEY

Bu bölümde TDE yöntemini kullanarak veri tabanını tamamen şifrelemiş olduk. Şifreleme yaptığımız serverda sorgu sonuçlarını decrypt edilmiş olarak göreceğiz. Ancak veri tabanımız yeni bir servera taşındığında, şifrelemede kullandığımız Server Certificate olmadan kullanılamayacaktır.

mdf ve ldf dosyalarını Windows Azure Storage gibi dış bir lokasyonda güvende tutmak istediğimizde TDE şifreleme yöntemi tercih edilebilir. Yine benzer şekilde veri tabanı yedeklerinin farklı bir serverda açılıp kullanılamamasını istiyorsak bu yöntem işimizi görecektir.

SQL Server 2014 ile birlikte gelen Azure Storagelere yedek almak amaçlı geliştirilen URL Backup özelliği aynı zamanda yedeklerin şifrelenmesi opsiyonu olan Backup Encrytion’ı da sağlamaktadır. Bu sebeple Azure için sırf yedekleri koruma amaçlı TDE encrption yapılmasına ihtiyaç kalmamaktadır.

Şifreleme yapılan serverda verilerin encrypt edilmiş halini görmek ve yönetmek istiyorsak önceki yazılarımızda incelediğimiz Column-Level Encryption yöntemini kullanmalıyız.

Son olarak TDE ve Column-Level Encryption yöntemlerinden birine karar vermenizde Mustafa Acungil hocamın şu yazısı yardımcı olabilir.


Encryption konusunda değinmek istediğim genel ve temel yaklaşımlar şimdilik bu kadar.


Faydalı olması dileğiyle…

Hiç yorum yok:

Yorum Gönder