10 Haziran 2012 Pazar

Transparent Data Encryption

TDE ilk olarak SQL Server 2008 ‘in Enterprise ve Developer sürümlerinde karşımıza çıkmıştı. Bu özellik sayesinde Database’lerimizi ve Backup’larımızı encrypt edebiliyoruz. TDE yapılandırmasında veya sonrasında programlama tarafında herhangi bir code değişikliğine gerek duyulmamaktadır. TDE enable edildiği andan itibaren database, background’da encrypt edilir. Bu süreçte, connection pooling ‘de herhangi bir reset’lenme yaşanmaz ve client’ların connection’larının sürekliliği korunur. Database, encrypt edilirken bu süreç page level’da oluşturulur. Bu yüzden Data ve Log dosylarında herhangi bir büyüme oluşmaz.

TDE, process esnasında database boot record altında tutulan Database Encryption Key (DEK) ile işlem görür. DEK, master database’i altında tutulan sertifika ile korunan bir Symmetric Key dir. DEK sayesinde AES ve 3DES algoritmalarında encryption yapılabilmektedir.

TDE oluşturulduktan sonra kesinlikle private key’in tutulduğu sertifikanın backup alınması gerekmektedir. Eğer TDE enabled olan bir Database’in backup’ını başka bir sunucuya restore etmek isterseniz, bu sertifikaya gereksinim duyulur veya mevcut sertifikada bir problem olduğu taktirde hicbir şekilde Database’inize erişemezsiniz.

TDE ‘yi oluşturmak için aşağıdaki adımları izlemeliyiz;
      1.       Master Key ‘in oluşturulması
      2.       Sertifikanın oluşturulması
      3.       Encryption Key ‘in oluşturulup sertifika ile ilişkilendirilmesi
      4.       Database üzerinde encryption ‘ın enable edilmesi

Yukarıdaki adımları izleyerek aşağıdaki gibi TDE ‘yi enable edelim;


USE [master]
GO


CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Sifre_@Deneme175'

GO

İkinci adım olarak sertifikamızı oluşturup, Master Key tarafından korunmasını sağlayalım.


USE [master]
GO


CREATE CERTIFICATE TDETest WITH SUBJECT = 'TDE Sertifikasi'

GO

Oluşturulan sertifikanın Master Key tarafından korunduğunun teyidini alalım.

SELECT name, pvt_key_encryption_type_desc
FROM sys.certificates WHERE [name] = 'TDETest'


Bir sonraki adım olarak Database’imiz için Database Encryption Key (DEK) oluşturuyoruz. 
Use [SQLBilgiguvenlik]
GO


CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256

ENCRYPTION BY SERVER CERTIFICATE TDETest
GO

DEK ‘i oluşturduğumuzda aşağıdaki gibi bir uyarı mesajı karşımıza çıkıyor.


Warning: The certificate used for encrypting the database encryption key has not been backed up. You should immediately back up the certificate and the private key associated with the certificate. If the certificate ever becomes unavailable or if you must restore or attach the database on another server, you must have backups of both the certificate and the private key or you will not be able to open the database.

Yukarıda da değindiğimiz gibi kesinlikle bir sonraki adım olarak Sertifikamızı ve DEK ‘i yedeklememiz gerekiyor. Bunun için aşağıdaki gibi Sertifikamızın ve Database Encryption Key ‘in backup ‘ını alıyoruz.

USE [master]
GO


BACKUP CERTIFICATE TDETest

TO FILE = 'C:\TDETest_Key\TDETest_Sertifika.cert'
WITH PRIVATE KEY (FILE = 'C:\TDETest_Key\TDETest_EncryptionPrivateKey.key', ENCRYPTION BY PASSWORD ='Sifre_@Deneme175')

GO

Son adım olarak Database’imiz üzerinde TDE ‘yi enable ediyoruz.

USE [master]
GO


ALTER DATABASE [SQLBilgiguvenlik] SET ENCRYPTION ON

Artık Database ‘imiz encrypt edilmiş oldu. TDE ‘yi en iyi şekilde test etmek için encrypt edilmiş olan Database ‘imizin backup ‘ını alıp farklı bir sunucuya restore etmeyi deneyelim.

USE [master]
GO


BACKUP DATABASE [SQLBilgiguvenlik]

TO DISK='C:\Backup\SQLBilgiguvenlik_FullBackup.bak'
GO

 Farklı bir sunucu üzerinde restore ediyoruz.
  
USE [master]
GO


RESTORE DATABASE [SQLBilgiguvenlik]

FROM DISK='D:\SQLBilgiguvenlik_FullBackup.bak'
GO

Restore etmeye çalıştığımızda aşağıdaki gibi bir hata mesajı ile karşılaşıyoruz.

Msg 33111, Level 16, State 3, Line 2
Cannot find server certificate with thumbprint ’0xB21CB3194587F6921BA66705B2E61CD08912E85A’.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.
  
Bu şekilde bir hata mesajını almamız çok normal. TDE ‘nin zaten burada çalıştığını anlamış oluyoruz. Sertifikamız yoksa hicbir şekilde Database ‘e erişim sağlanamıyor. Bunun için almış olduğumuz backup ‘dan database ‘imizi restore etmek istediğimiz sunucuya sertifikamızı restore ediyoruz. Bunun için hem Sertifikamızı hem de Private Key ‘imizi kullanmamız gerekiyor

USE [master]
GO


CREATE CERTIFICATE TDETest

FROM FILE = 'D:\TDETest_Sertifika.cert'
WITH PRIVATE KEY (FILE = 'D:\TDETest_EncryptionPrivateKey.key',

DECRYPTION BY PASSWORD = 'Sifre_@Deneme175')
GO

Son olarak backup dosyamızdan Database ‘imizi tekrar restore etmeye çalışıyoruz ve artık Database ‘e erişebildiğimizi görüyoruz.

Hiç yorum yok:

Yorum Gönder