Quantcast
Channel: ÇözümPark
Viewing all articles
Browse latest Browse all 4130

SQL Server Güvenlik Kavramı – Bölüm 3

$
0
0

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

clip_image002

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;

clip_image003

SSS-78

SMK ve DMK’larda kullandığımı simetrik keyleri de aşağıdaki sorgu ile detaylarına bakabiliriz.

SELECT*

FROMsys.symmetric_keys

clip_image004

SSS-79

DPAPI, SMK ve DMK’nın yapısını gösteren şema

clip_image005

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

clip_image007

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

clip_image009

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.

clip_image010

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.

clip_image011

SSS-84

Tüm sertifikaları görmek için aşağıdaki sorguyu kullanabilirsiniz.

SELECT*FROMsys.certificates

 

clip_image013

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.

clip_image014

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.

clip_image015

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.

clip_image016

SSS-88

Prosedüre ikonunun yanına bir de kilit ikonu eklenmiş durumda, prosedürü modify etmeye çalışalım.

clip_image017

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

 

clip_image018

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


Viewing all articles
Browse latest Browse all 4130

Trending Articles


Mide ağrısı için


Alessandra Torre - Karanlık Yalanlar


Şekilli süslü hazır floodlar


Flatcast Güneş ve Ay Flood Şekilleri


Gone Are the Days (2018) (ENG) (1080p)


Yildiz yükseltme


yc82


!!!!!!!!!! Amın !!!!!!!!!


Celp At Nalı (Sahih Tılsım)


SCCM 2012 Client Installation issue