20 Temmuz 2013 Cumartesi

Kolon-Satır Bazlı Şifreleme (Column Level Encrypyion) - Bölüm 3

Şifreleme konusunun devamı olan Kolon-Satır Bazlı Şifreleme (Column Level Encrypyion) - Bölüm 3  isimli yazımı sqlserveronculeri.com adresinden de inceleyebilirsiniz.

Bir önceki Kolon-SatırBazlı Şifreleme (Column Level Encrypyion) - Bölüm 2 isimli yazımda kolon veya satır bazlı şifreleme (Column-Level Encryption) kapsamında kullanılan 4 mekanizmadan ilki olan T-SQL Functions yöntemini incelemiştik. Bu yazımızda aynı kapsamdaki diğer mekanizmalara Asymmetric Keys, Symmetric Keys ve Certificates yöntemlerine odaklanıyor olacağız.
2-      Asymmetric Keys
Asymetric Keys public ve private olarak adlandırılan iki key içermektedir. Public key network üzerinden paylaşılabilirken private key kimse ile paylaşılmaz. Public key alıcılara gönderilmeden önce verileri şifreler. Private key ise bu mesajın şifresini çözer. Asymmetric Keys, birazdan değineceğimiz Symetric Keys güvenliği için de kullanılabilmektedir.
Aşağıdaki resimde Party #1 ile ifade edilen kişi public keyi kullanarak encrypt ettiği veriyi Party  #2 ile ifade edilen kişi sahip olduğu private keyi kullanarak decrypt etmektedir.

Asymmetric key ile symmetric keyin karşılaştırılmasının yapıldığı şu makaleye bir göz atmak isteyebilirsiniz.
Asymmetric keys aşağıdaki ifade ile oluşturulabilir. CREATE işlemi için 3 çeşit şifreleme algoritması kullanılabilmektedir(RSA_512, RSA_1024, RSA_2048). Algoritma yerine FROM ifadesi ile keylerin import edilebileceği bir kaynak belirtilebilir(File,Executable,Assembly). Bu konudaki detaylı bilgiye http://technet.microsoft.com/en-us/library/ms174430.aspx linkinden ulaşabilirsiniz.

CREATE ASYMMETRIC KEY asymmAnahtarim
WITH ALGORITHM=RSA_1024
ENCRYPTION BY PASSWORD='pass@word1'

İfadedeki son ENCRYPTION BY PASSWORD satırı private keyin password ile encrypt edilmesi için kullanılmaktadır. Eğer belirtilmezse varsayılan olarak Database Master Key kullanılmaktadır. Burada belirtilen şifre maksimum 128 karakterdir ve SQL’in kurulu olduğu makinedeki Windows Password Policy gereksinimlerine uygun olmalıdır(büyük,küçük harfler,karakterler vs.).
Oluşturduğumuz bu asymmetric keyi üzerinde çalıştığımız veri tabanındaki Security/Asymmetric Keys bölümünde görebiliriz.

Oluşturduğumuz bu asymmetric key sayesinde ENCRYPTBYASYMKEY fonksiyonu ile verileri şifreleyebilir DECRYPTBYASYMKEY fonksiyonu ile şifreli metni çözebiliriz. Bu fonksiyonlar encytp etmek için 2, decrypt etmek için 3 parametre ile çalışmaktadır. Encrypt işleminde ilk parametreye asymmetric keyin idsi ikinci parametreye de encrypt edilecek temiz metin verilmektedir. Decrypt işleminde ise son parametreye asymmetric key oluşturulurken belirtilen password verilmektedir.

Fonksiyonda kullanılan parametreler kısaca açıklayalım:

Key_ID :
int tipinden asymmetric keyin idsidir. ASYMKEY_ID() fonksiyonu ile bu id elde edilebilir.
Plain_Text:
               Encrypt edilecek veridir. Bu veri sadece nvarchar, char, varchar, binary, varbinary veya nchar tiplerinden birisi olabilir.
Ciphertext:
Asymmetric key ile encrypt edilmiş veridir.
Asym_Key_Password:
               Asymmetric key oluşturulurken kullanılan password dur.
Bir önceki bölümde yaptığımız gibi burada da değişkenler üzerinden her iki fonksiyonu da kullanarak metni encrypt ve decrypt edelim


3-      Symmetric Keys
SQL Server 2012 üzerinde en hızlı encryption metotlarından birisidir. Verilerin encrypt edilmesi ve decrypt edilmesi için tek bir key kullanılır. Çalışma şeklini aşağıdaki gibi resmedebiliriz.




Yukarıda da belirttiğim gibi asymmetric key ile symmetric keyin karşılaştırılmasının yapıldığı şu makaleye bir göz atmak isteyebilirsiniz.

Symmetric key mekanizmasının da korunması gerekmektedir. Bunun için Password, Certificate, Asymmetric Key veya başka bir Symmetric Key kullanılabilir. Symmetric keyin encrypt edilmesi için kullanılabilecek ifadeleri yorum satırı olarak aşağıda belirttim.
Aytıntılı bilgilere msdn’den erişebilmek için şu linki kullanabilirsiniz.

CREATE SYMMETRIC KEY symAnahtarim
WITH ALGORITHM = TRIPLE_DES
--ENCRYPTION BY ASYMMETRIC KEY asymmAnahtarim
--ENCRYPTION BY SYMMETRIC KEY symAnahtarim0 ---(önce aktif edilmeli)
--ENCRYPTION BY CERTIFICATE sertifikam
ENCRYPTION BY PASSWORD='pass@word1'

Symmetric key oluştururken çeşitli encryption algoritmaları kullanılabilir. Symmetric keyler kullanılmadan önce mutlaka OPEN SYMMETRIC KEY ifadesi ile aktif edilmelidir. Session sonlandığında bu symmetric key kapanacaktır. İstenirse CLOSE SYMMETRIC KEY ifadesi kullanılarak session bitmeden de symmetric key kapatılabilir.
Verilerin encrypt edilmesi için kullanılan ENCRYPTBYKEY fonksiyonu minimum 2 parametre decrypt edilmesi için kullanılan DECRYPTBYKEY fonksiyonu minimum 1 parametre ile çalıştırılabilmektedir.

Parametreleri aşağıdaki gibi özetleyebiliriz:

Key_guid:
               Symmetric keyin uniqueidentifier tipinden GUID çıktısı. KEY_GUID() fonksiyonu ile elde edilebilir.
Clear_text:
               Encrypt edilecek veridir. Bu veri sadece nvarchar, char, varchar, binary, varbinary veya nchar tiplerinden birisi olabilir.
Ciphertext:
Symmetric key ile encrypt edilmiş veridir.
Benzer bir çalışma ile bu yöntemi örneklendirelim.






4-      Certificates
Certificates dijital olarak imzalanmış güvenlik nesneleridir. İnsanların, cihazların veya organizasyonların tanınması için haklarında çeşitli bilgiler ve private key ile ilişkilendirilecek public key içerir. Bu sayede endpointlere güvenli bağlantı(secure connection) ile erişim sağlanabilmektedir. Database Mirroring’te, veri ve connection şifrelemede veya paket gibi nesnelerin imza altına alınmasında kullanılabilir.
Certificate aşağıdaki ifade ile oluşturulabilir.

CREATE CERTIFICATE Sertifikam
ENCRYPTION BY PASSWORD ='pass@word1'
WITH
     SUBJECT='Sertifika konusu',
          START_DATE='01/01/2013',
          EXPIRY_DATE='01/01/2020'

Burada kullanılan ENCRYPTION BY PASSWORD ifadesi private keyi encrypt etmek için kullanılmaktadır. Belirtilmezse varsayılan olarak Database Master Key geçerli olmaktadır. Burada belirtilen şifre SQL’in kurulu olduğu makinedeki Windows Password Policy gereksinimlerine uygun olmalıdır(büyük,küçük harfler,karakterler vs.).  İfadeden de anlaşılacağı üzere bir tarih aralığı belirtilerek sertifikanın geçerlilik süresi belirlenebilir. Ayrıntılı bilgi için msdn’e göz atmak isteyebilirsiniz.

Oluşturduğumuz bu Certificate üzerinde çalıştığımız veri tabanının Security/Certificates bölümünde yer almaktadır.

Veri şifrelemek için kullanabileceğimiz ENCRYPTBYCERT fonksiyonu 2 parametre DECRYPTBYCERT fonksiyonu ise 3 parametre almaktadır. Bu parametreleri şu şekilde açıklayabiliriz:
Certificate_id:
               Sertifikaya ait int tipinden bir iddir. Bu değer Cert_ID() fonksiyonu ile elde edilebilir.
Clear_text:
               Encrypt edilecek veri. Bu veri sadece nvarchar, char, varchar, binary, varbinary veya nchar tiplerinden birisi olabilir.
Cipher_text:
               Certificates ile encrypt edilmiş verdir.
Cert_password:
               Sertifika oluşturulurken belirtilen password.
Öncekilere benzer bir çalışma ile bu yöntemi şöyle örneklendirebiliriz.



Asymmetric key ve Symmetric keyi SQL Server dışında tutmaya yarayan ve sadece Enterprise editionda kullanılabilir olan Extensible Key Management(EKM) modülünü bilinçli olarak kapsam dışında bıraktım. SSMS üzerinden "Server/Facet/Sql Server Config" yoluyla aktif edilen EKM, encryption key üretmek ve tutmak için kullanılmaktadır.

Yukarıda oluşturduğumuz nesneler ilgili veri tabanı üzerinde çalıştırılan DROP komutu ile serverdan kaldırılabilir.

DROP SYMMETRIC KEY ad
     DROP ASYMMETRIC KEY ad
     DROP CERTIFICATE ad

Bu bölümde Column-Level Encryption kapsamındaki 4 mekanizmadan geriye kalan 3’ünün neler olduğuna ve nasıl kullanıldığına bir göz attık.

Bir sonraki bölümde bu mekanizmaları karma bir şekilde kullanarak, bir tablodaki metin bazlı kolonları şifreleyip çözeceğiz. Böylece sıfırdan alarak gerçek hayatta pratiği olan bir örnek yapmış olacağız.

Faydalı olması dileğiyle,