Bu bölümde kod ve veri şifrelemesi konularını inceleyeceğiz. Terminalojide Encryption olarak bilinen şifreleme, aslında bilgi sistemlerinin her alanında kullanılmaktadır. Temel bilgisayar dilinde okunabilen veriye plaintext, şifrelenmiş algoritmasına da ciphertext denmektedir. Ciphertext veriyi şifreleyen bir anahtar kullanır, bu veriyi sadece o anahtara sahip bilgisayar görebilir. Encryption – şifrelemenin temeli bu şekilde çalışmaktadır.
Sql Server’da key değimi bu anahtarlardan 128 bit 192bit ve 256bit kullanmaktadır. Bu keylerin en basiti symmetric key olarak adlandırılır. Bu symmetric key veriyi hem şifreler, hem de şifreyi çözer, encrypt – decrypt. Performans açısından gayet iyidir fakat güvenlik konusunda, bu simetrik keyler çalındığında şifreleri kırmak çok da zor olmamaktadır.
Simetrik keylerdeki bu sorundan dolayı asimetrik keyler geliştirilmiştir. İki parçadan oluşan asimetrik keylerin public key kısmında sadece veri şifrelenir, private key tarafında ise şifrelenen veriyi çözme işlemi gerçekleşir. Asimetrik keyler simetrik keylere göre daha güvenlidir, fakat performans açısından simetrik keylerden daha yavaş çalışırlar.
Diğer bir yöntem de sertifika kullanmaktır. Sertifika, private keydeki kimlik bilgisini içeren public keyin asimetrik bir parçasıdır. Yetkili dijital imza sağlayıcıdan alınan sertifikalarda kimlik bilgisi bulunur. Sertifikalarda veriler şifrelenmez, web sitelerindeki güvenlik sertifikası mantığı ile çalışır. Sahte web güvenlik sertifikası olamayacağı gibi Sql Server içinde bu böyledir. Sql Server 2005’ten bu yana simetrik, asimetrik ve sertifika şifreleme desteği verilmektedir.
Database Master Keyleri:
Sql Server’da her veritabanının kendine ait bir master keyi vardır. Bu keyler sunucu seviyesinde şifrelenirler. Master key kullanımında ilk önce open ile açılır, daha sonra close komutu ile kapatılması gerekmektedir. Şifreleme hiyerarşisinin en temelinde Service Master Key – SMK bulunur, Sql Server bu keyi otomatik üretir. Eğer veritabanı seviyesinde bir key kullanılacaksa ise bu key manuel olarak oluşturulmalıdır. Bu keylere de Database Master Key – DMK denmektedir.
Service Master Key Msdn: https://msdn.microsoft.com/en-us/library/ms189060.aspx
Database Master Key Msdn: https://msdn.microsoft.com/en-us/library/aa337551.aspx
Service master key SMK otomatik olarak oluşturulduğu için yedeklenmesini önemlidir. Aşağıdaki komut ile SMK’yi yedekliyoruz.
BACKUPSERVICEMASTERKEYTOFILE='c:\ServiceMasterKey\smk.key'
ENCRYPTIONBYPASSWORD='Buraya_guclu_bir_sifre_yazin';
Yedeklediğim klasöre bakıyorum
SSS-77
SMK’yı geri yüklemek istediğimizde, yedeklerken kullandığımız şifreyi kullanıyoruz. Bu şifreyi kaybetmemek gerekir. SMK’yı geri yüklemek için aşağıdaki kodu kullanıyoruz.
RESTORESERVICEMASTERKEYFROMFILE='c:\ServiceMasterKey\smk.key'
DECRYPTIONBYPASSWORD='Buraya_guclu_bir_sifre_yazin'FORCE;
Eğer Service Master Key’de bir bozulma olursa geri yükleme yapmak gerekir. Buradaki force komutu bir önceki keyi yok sayar, ve üzerine yedekteki keyi yazar. Yedeklenen keyin doğru key olduğundan emin olduktan sonra bu işlem yapılmalıdır.
Service Master Keyleri tüm diğer keyleri korumaya alır ve diğer tüm keylerden sorumludur. SMK’yı da Windows Data Protection API (DPAPI) korumaktadır.
DPAPI Msdn: https://msdn.microsoft.com/en-us/library/ms995355.aspx
DPAPI bu korumayı sağlarken Advanced Encryption Standard (AES)’i kullanır. Şifrelenmiş datayı yani cipher’ı kullanıcı hesap bilgilerini dahil ederek veri iletişimini sağlar.
Database master keyleri, SMK tarafından koruma altındadır. Database master key, manuel oluşturulan ve veritabanına özel keydir. DMK oluşturmak için aşağıdaki kod kullanılır.
USE ARGE;
CREATEMASTERKEYENCRYPTIONBYPASSWORD='guclu_sifre_guclu_key';
Sadece veritabanı seviyesinde bir şifreleme istendiğin ise, SMK’yı kaldırıp DMK kullanılabilir. İlk olarak SMK’yı ilgili veritabanı için Drop ediyoruz.
USE ARGE;
ALTERMASTERKEY
DROPENCRYPTIONBYSERVICEMASTERKEY;
Ardından veritabanımız için bir DMK oluşturuyoruz.
USE ARGE;
OPENMASTERKEYDECRYPTIONBYPASSWORD='guclu_bir_sifre';
/*
Sql kod bloğu
*/
CLOSEMASTERKEY;
Hangi veri tabanlarının SMK ile şifrelendiğini aşağıdaki sorgu ile görebiliriz.
SELECT name, is_master_key_encrypted_by_server
FROMsys.databases
ORDERBY name;
SSS-78
SMK ve DMK’larda kullandığımı simetrik keyleri de aşağıdaki sorgu ile detaylarına bakabiliriz.
SELECT*
FROMsys.symmetric_keys
SSS-79
DPAPI, SMK ve DMK’nın yapısını gösteren şema
SSS-80
Simetrik encryption keyler nasıl oluşturulur, nasıl kullanılır detaylarına bakalım.
Symmetric Encryption Keys – Simetrik Şifreleme Anahtarları:
Sql Server’da veriyi şifrelemek için ilk önce encryption keyleri oluşturmanız gerekmektedir. Sql Server kriptografi temellerinden iki farklı key sunmaktadır.
- Symmetric keys: Verinin şifrelenmesinde ve çözülmesinde aynı keyi kullanır.
- Asymmetric keys: Çift key kullanır, public key sadece veriyi şifreler, private key de public key’in ciphertext haline çevirdiği verir çözme işinde kullanılır.
Symmetric şifreleme daha hızlı çalışır fakat daha az güvenlidir. Symmetric key nasıl oluşturulur bakalım.
Aşağıdaki komut ile şifre ile korunan bir symmetric key oluşturuyoruz.
USE ARGE;
CREATESYMMETRICKEY Symmetrickey
WITHALGORITHM=AES_256
ENCRYPTIONBYPASSWORD='simetrik_key_sifresi';
Symmetric keyi oluşturduk, bu keyi açmak için aşağıdaki kodu kullanıyoruz.
USE ARGE;
OPENSYMMETRICKEY Symmetrickey
DECRYPTIONBYPASSWORD='simetrik_key_sifresi';
Tsql kodunda nasıl kullanacağımızı ilerki bölümlerde göreceğiz. Keyimiz açık kaldığı için kapatmamız gerekiyor.
CLOSESYMMETRICKEY Symmetrickey
Açıkta kalan keyleri görmek içinde aşağıdaki sorgu kullanılabilir.
SELECT*FROMsys.openkeys;
Bu keyi AES_256 algoritmasıyla şifreledik. Symmetric şifreleme de kullanabileceğimiz şifreleme algoritmaları şunlardır;
DES, TRIPLE_DES, TRIPLE_DES_3KEY, RC2, RC4, RC4_128, DESX, AES_128, AES_192, AES_256
Bu algoritmalardan en güçlüleri AES algoritmalarıdır, AES_256 aralarında en uzun ve en güçlü algoritmadır, büyük verilerin şifrelenmesinde biraz performans kaybına yol açmaktadır.
Şifreleme Algoritmaları Msdn: https://msdn.microsoft.com/en-us/library/ms345262.aspx
Oluşturduğumuz keylere SSMS üzerinden bakmak için ;
SSMS – Veritabanı_adi – Security – Symmetric Keys / Asymmetric Keys
SSS-81
Bir Symmetric key’i OPEN SYMMETRIC KEY komutu ile açıp kullanmaya başlarsınız, kod içerisinde kullanıldıktan sonra close komutu ile kapatırsınız veya session sonlandırıldığında kapanmış olur. Bir stored procedure da kullandığınız zaman kapatmayı unutursanız eğer, stored procedure sonlandığında key kendiliğinden kapanacaktır.
Stored procedure içinde begin-try-catch bloğu içerisinde de kullanılabilir, aşağıdaki örnekte stored procedure oturumu devam ettiği sürece key açık olacaktır, key eğer open ise catch bloğunun sonunda kontrol ederek kapatacaktır.
BEGINTRY
OPENSYMMETRICKEY Symmetrickey
DECRYPTIONBYPASSWORD='simetrik_key_sifresi';
/*
kod bloğu
*/
CLOSESYMMETRICKEY Symmetrickey;
ENDTRY
BEGINCATCH
IFEXISTS(SELECT*FROMsys.openkeysWHEREkey_name='Symmetrickey')
CLOSESYMMETRICKEY Symmetrickey;
ENDCATCH
Symmetric Keys Msdn: https://msdn.microsoft.com/en-us/library/ms189446.aspx
Asymmetric Encryption Keys – Asimetrik Şifreleme Anahtarları:
Asimetrik keyler iki bölümden oluşur, public key ve private key. Public key sadece veriyi şifreler, private key de public keyin şifrelemiş olduğu veriyi çözer. Asimetrik keyler, Database Master Keyler tarafından şifrelenirler, asimetrik key oluşturmak için önce DMK oluşturmak gerekmektedir. Eğer veritabanına ait bir DMK key yok ise, gene de asimetrik key oluşturabilir fakat bu asimetrik keyi şifre ile korumanız gerekmektedir.
RSA-2048 algoritması ile bir asimetrik key oluşturalım;
CREATEASYMMETRICKEY ArgeAsKey
WITHALGORITHM=RSA_2048;
Veritabanı ARGE seçili iken execute ettim, şifre ataması yapmadığım içinde asimetrik keyin private keyini DMK tarafından şifrelenmiş oldu.
Oluşturulan asimetrik keyleri aşağıdaki sorgu ile kontrol edebiliriz.
SELECT*FROMsys.asymmetric_keys
Arge veritabanında Security – Asymmetric Keys kısmına oluşturduğumuz key gözüküyor
SSS-82
Asimetrik keyler, simetrik keyler gibi open ve close komutlarını kullanmazlar. Microsoft veri şifrelemesinde simetrik keyleri önerir, çünkü asimetrik keyler simetrik keylere göre daha fazla sistem kaynağı kullanırlar.
Asymmetric Keys Msdn: https://msdn.microsoft.com/en-us/library/ms174430.aspx
Certificates – Sertifikalar:
Asimetrik keylerin kimlik bilgileri sertifikalara bağlıdır. Public key altyapısındaki X.509 standardını kullanır. Sertifikalar şifrelenmiş veriyi saklamaz ve taşımazlar. Verinin alıcısını dijital imza ile doğrularlar. Asimetrik keyler ile sertifika kullanılması kullanışlı bir yöntemdir, örnek olarak sertifika içine sona eriş tarihi eklenebilmektedir.
Sertifikalar mutlaka imzalı olmalıdır. Dijital imzalar sertifikanın yetkili bir sertifika sağlayıcısı tarafından imzalandığının kanıtıdır. İmzalanmış sertifikalar, asimetrik keylerin yerine simetrik keyleri koruyabilir. Daha da netleşmesi için veritabanı seviyesinde simetik, asimetrik ve sertifikaların nasıl kullanıldığı aşağıdaki şemada gösterilmiştir.
SSS-83
Şifreleme Hiyerarşisi Msdn: https://msdn.microsoft.com/en-us/library/ms189586.aspx
Sertifikalar Database Master Key tarafından şifrelenmektedir, sertifika kullanmadan önce DMK oluşturulması gerekmektedir. SMK ve DMK keylerine alıcıya ulaşmak için başvurur.
Şifre ile korunan bir sertifika nasıl oluşturulur görelim;
CREATECERTIFICATE ArgeSertifika
ENCRYPTIONBYPASSWORD='guclu_sertifika_sifresi'
WITHSUBJECT='Arge Db Sertifika',
EXPIRY_DATE='20150317';
Geçerlilik zamanıda belirtmiş olduk. Oluşturulan sertifika Veritabanı – Security – Certificates bölümünde bulunmaktadır.
SSS-84
Tüm sertifikaları görmek için aşağıdaki sorguyu kullanabilirsiniz.
SELECT*FROMsys.certificates
SSS-85
Sql Server’da sertifikalar X.509v3 standardını kullanmaktadır. RSA algoritmasını cipher tarafında kullanırlar. Private key 1024 bit uzunluğundadır. Dışardan import edilmek istenen sertifikaların formatı CER veya PVK olmalıdır, Sql Server’a direk olarak PFX veya PKCS#12 p.12 sertifikaları yüklenememektedir. OpenSSL gibi açık kaynak kodlu araçlar ile sertifikayı uygun formata dönüştürmeniz gerekmektedir.
Sertifikalar bir dosya halinde yedeklenebilmektedir. Sertifikalar SSMS üzerinden yedeklenememektedir. Aşağıdaki Tsql kodu ile yedeklenebilmektedir.
BACKUPCERTIFICATE ArgeSertifika TOFILE='C:\Sertifikalar\ArgeSertifika.cer'
WITHPRIVATEKEY (
FILE='C:\Sertifikalar\ArgeSertifika.pvk',
ENCRYPTIONBYPASSWORD='enc_sifre',
DECRYPTIONBYPASSWORD='dec sifre'
);
Simetrik Key ile Verilerin Şifrelenmesi:
Keylerin esas görevi verilerin şifrelenmesidir. Sql Server’da tavsiye edilen, daha performanslı çalışan simetrik keylerdir.
Simetrik key ile veri şifrelemek için EncryptByKey fonksiyonunu kullanacağız. Veritabanımızda bir tablo oluşturarak örneğimize başlayalım.
USE TICARET
CREATETABLE dbo.musteriler(
MusteriId intNOTNULLIDENTITY(1,1)PRIMARYKEY,
Ad varchar(50)NOTNULL,
Soyisim varchar(50)NOTNULL,
KrediBilgisi varbinary(1000)NOTNULL)
İlk olarak sertifika oluşturuyoruz
CREATECERTIFICATE MusterilerSertfika
WITHSUBJECT='Musteriler tablosunu simetrik key ile şifreleme';
Simetrik keyi oluşturuyoruz, oluşturduğumuz sertifika ile şifrelenecek şekilde yazıyoruz
CREATESYMMETRICKEY MusterilerSimetrikKey
WITHALGORITHM=AES_256,
KEY_SOURCE='33rdf03rkfs0d',
IDENTITY_VALUE='123100sdfsdk0'
ENCRYPTIONBYCERTIFICATE MusterilerSertfika;
Oluşturduğumuz simetrik keyi kullanarak, müşteriler tablosuna şifrelenmiş olarak KrediBilgisi insert edeceğiz.
OPENSYMMETRICKEY MusterilerSimetrikKey
DECRYPTIONBYCERTIFICATE MusterilerSertfika;
INSERTINTO dbo.musteriler
(
Ad ,
Soyisim ,
KrediBilgisi
)
VALUES (
'Yavuz',
'Filizlibay',
EncryptByKey(Key_Guid('MusterilerSimetrikKey'),
'4.000.000;Borcu yok,Sicili temiz', 1,'KrediBilgisiKey')
);
CLOSESYMMETRICKEY MusterilerSimetrikKey;
Kredibilgisi alanına müşteri hakkındaki özel bilgileri şifreleri olarak kaydetmiş olduk. İlk olarak simetrik keyi open komutu ile açtık, sonrasında MusterilerSertifika sertifikası ile şifreledik, verilerin girişi yapıldı, son olarakta close komutu ile açık olan simetrik keyi kapatmış olduk.
Bakalım kredibilgisi alanın gerçekten de şifrelenmiş mi, musterleri tablosuna sorgu atıyoruz.
SSS-86
Kredibilgisi alanı şifrelenmiş durumda, bunun gibi hassas verilerin şifrelenmesi veri güvenliği açısından çok önem kazanmaktadır.
Veriyi şifreledik, ciphertext olarak görüyoruz, peki bu veriyi nasıl okuruz yani plaintext olması için ne yapmamız gerekir buna bakalım. Direk sorguyu çekince gelmeyeceğini gördük, bu sebeple ilk olarak open komutu ile simetrik keyi açacağız, ardından DecryptByKey fonksiyonu ile sorguyu çekeceğiz, son olarak da close komutu ile açık olan keyi kapatacağız.
OPENSYMMETRICKEY MusterilerSimetrikKey
DECRYPTIONBYCERTIFICATE MusterilerSertfika;
SELECT Ad, Soyisim,
CAST(DecryptByKey(KrediBilgisi ,1 ,'KrediBilgisiKey')as
VARCHAR(50))
FROM dbo.musteriler;
CLOSESYMMETRICKEY MusterilerSimetrikKey;
Sorgu sonucunda kredi bilgisi plaintext olarak geldi.
SSS-87
Eğer sorgu sırasında key yanlış ise veya şifre hatalı ise, Kredibilgisi alanında NULL yazar.
EncryptByKey Msdn: https://msdn.microsoft.com/en-us/library/ms174361.aspx
DecryptByKey Msdn: https://msdn.microsoft.com/en-us/library/ms181860.aspx
Stored Procedure’de İmza İle Kimlik Doğrulama:
Tsql kodları dijital imzalar ile imzalanabiliyor, doğrulama sağlayabiliyordu. Bunu yaparken asirmetrik keylerin private keylerindeki sertifika bu bilgileri taşıyor ve karşı tarafta bu bilgilerin doğruluğunu onaylıyordu. Bunların yanında Sql Server’da stored procedureler, triggerlar ve fonksiyonlarda kimlik doğrulama yöntemi ile imzalanabilmektedir.
Bir stored procedure nasıl kimlik doğrulama ile imzalanır buna bakalım, Satış veritabanında aşağıdaki stored procedure’ü oluşturuyoruz.
USE SATIS;
GO
CREATEPROCEDURE dbo.SP_Musteriler
ASBEGIN
DECLARE @sql varchar(2000)='SELECT * FROM dbo.satisdata'
EXECUTE (@sql)
END;
GO
Burada yavuz_sql kullanıcısına bu stored procedure’ü çalıştırabilmesi için yetki veriyoruz.
GRANTEXECUTEONOBJECT::dbo.SP_Musteriler TO yavuz_sql;
Fakat yavuz_sql kullanıcısının satisdata tablosunda Select yetkisi yok, stored procedure yavuz_sql ile çalışacak mı bakalım
EXECUTEASUSER='yavuz_sql';
EXECUTE dbo.SP_Musteriler;
REVERT;
Aşağıdaki hatayı bize verdi, kullanıcıda select yetkisi olmadığı için sp çalışmadı.
Msg 229, Level 14, State 5, Line 1
The SELECT permission was denied on the object 'satisdata', database 'SATIS', schema 'dbo'.
Stored procedure’ü çalıştıracak sertifika sahibi bir kullanıcı oluşturacağız, bu sertifikaya bir bitiş süresi de koyabiliriz. Süre dolan sertifika süre sonunda çalışmayacaktır. Stored procedure’ü de bu sertifika ile imzalayacağız.
SETIDENTITY_INSERT db_owner ='yavuz_sql'
EXECUTEASUSER='yavuzdatabase'
CREATECERTIFICATE SP_Sertifika
WITHSUBJECT='Sp sertifikası',
EXPIRY_DATE='2015-11-15';
GO
SELECT@@IDENTITY
ADDSIGNATURETO dbo.SP_Musteriler
BYCERTIFICATE SP_Sertifika;
Technet: https://technet.microsoft.com/en-us/library/ms188304(v=sql.105).aspx
Sql Server Nesnelerinin Şifrelenmesi:
Sql Server’daki bazı önemli nesnelerin gözükmesini kullanıcılardan ve programı sattığınız müşterilerden gizleyebilirisiniz. Kritik bir yerdeki stored procedure veya bir trigger şifrelenebilmektedir. Bu gibi önemli nesneler karmaşık kod yapısına sahip olabilmektedirler ve yazan kişi bu kodlara müdahale edilmemesini ister.
Örnek olarak bir stored prosedürü şifreli olarak oluşturalım;
CREATEPROCEDURE dbo.Sifrelenmis_SP
WITHENCRYPTION
ASBEGIN
SETNOCOUNTON;
SELECT*FROM dbo.Satis_adetleri
END
GO
Prosedür oluşturuldu, tablomuzdaki Programmability – Stored Procedures den prosedürümüze bakalım.
SSS-88
Prosedüre ikonunun yanına bir de kilit ikonu eklenmiş durumda, prosedürü modify etmeye çalışalım.
SSS-89
Modify seçeneği de devre dışı aktif değil.
Sql serverda şifrelenmiş tüm nesneleri aşağıdaki sorgu ile görebilirsiniz.
-- Sql serverdaki şfirelenmiş nesneleri gösterir
SELECT o.Name as Nesne_Adi, o.Type_desc as Tipi
FROMsys.sql_modules m
JOINsys.objects o ON m.object_id= o.object_id
WHEREdefinitionISNULL
SSS-90
Nesne adını ve nesne tipini göstermektedir.
Şifrelenmiş bir nesne decrypt edilemez, şfiresi çözülemez. Nesnenin kodlarında bir değişiklik yapılacak ise önce DROP edilip sonradan CREATE edilmesi gerekmektedir.
Msdn: https://msdn.microsoft.com/en-us/library/ms187926.aspx