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

Makaleyi Paylaş

SQL Server

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

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.

Sponsor

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.

BACKUP SERVICE MASTER KEY TO FILE = ‘c:\ServiceMasterKey\smk.key’

ENCRYPTION BY PASSWORD = ‘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.

RESTORE SERVICE MASTER KEY FROM FILE = ‘c:\ServiceMasterKey\smk.key’

DECRYPTION BY PASSWORD = ‘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;

CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘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;

ALTER MASTER KEY

DROP ENCRYPTION BY SERVICE MASTER KEY;

 

Ardından veritabanımız için bir DMK oluşturuyoruz.

USE ARGE;

OPEN MASTER KEY DECRYPTION BY PASSWORD = ‘guclu_bir_sifre’;

/*

Sql kod bloğu

*/

CLOSE MASTER KEY;

 

Hangi veri tabanlarının SMK ile şifrelendiğini aşağıdaki sorgu ile görebiliriz.

SELECT name, is_master_key_encrypted_by_server

FROM sys.databases

ORDER BY name;

clip_image003

SSS-78

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

SELECT *

FROM sys.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;

CREATE SYMMETRIC KEY Symmetrickey

WITH ALGORITHM = AES_256

ENCRYPTION BY PASSWORD = ‘simetrik_key_sifresi’;

Symmetric keyi oluşturduk, bu keyi açmak için aşağıdaki kodu kullanıyoruz.

USE ARGE;

OPEN SYMMETRIC KEY Symmetrickey

DECRYPTION BY PASSWORD = ‘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.

CLOSE SYMMETRIC KEY Symmetrickey

 

Açıkta kalan keyleri görmek içinde aşağıdaki sorgu kullanılabilir.

SELECT * FROM sys.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.

BEGIN TRY

 OPEN SYMMETRIC KEY Symmetrickey

 DECRYPTION BY PASSWORD = ‘simetrik_key_sifresi’;

 /*

 kod bloğu

 */

 CLOSE SYMMETRIC KEY Symmetrickey;

END TRY

BEGIN CATCH

 IF EXISTS (SELECT * FROM sys.openkeys WHERE key_name = ‘Symmetrickey’)

 CLOSE SYMMETRIC KEY Symmetrickey;

END CATCH

 

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;

CREATE ASYMMETRIC KEY ArgeAsKey

WITH ALGORITHM = 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 * FROM sys.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;

CREATE CERTIFICATE ArgeSertifika

ENCRYPTION BY PASSWORD = ‘guclu_sertifika_sifresi’

WITH SUBJECT = ‘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 * FROM sys.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.

BACKUP CERTIFICATE ArgeSertifika TO FILE = ‘C:\Sertifikalar\ArgeSertifika.cer’

WITH PRIVATE KEY (

 FILE = ‘C:\Sertifikalar\ArgeSertifika.pvk’ ,

 ENCRYPTION BY PASSWORD = ‘enc_sifre’,

 DECRYPTION BY PASSWORD = ‘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

CREATE TABLE dbo.musteriler (

MusteriId int NOT NULL IDENTITY(1,1) PRIMARY KEY,

Ad varchar(50) NOT NULL,

Soyisim varchar(50) NOT NULL,

KrediBilgisi varbinary(1000) NOT NULL)

 

İlk olarak sertifika oluşturuyoruz

CREATE CERTIFICATE MusterilerSertfika

WITH SUBJECT = ‘Musteriler tablosunu simetrik key ile şifreleme’;

 

Simetrik keyi oluşturuyoruz, oluşturduğumuz sertifika ile şifrelenecek şekilde yazıyoruz

CREATE SYMMETRIC KEY MusterilerSimetrikKey

WITH ALGORITHM = AES_256,

 KEY_SOURCE = ’33rdf03rkfs0d’,

 IDENTITY_VALUE = ‘123100sdfsdk0’

ENCRYPTION BY CERTIFICATE MusterilerSertfika;

 

Oluşturduğumuz simetrik keyi kullanarak, müşteriler tablosuna şifrelenmiş olarak KrediBilgisi insert edeceğiz.

OPEN SYMMETRIC KEY MusterilerSimetrikKey

DECRYPTION BY CERTIFICATE MusterilerSertfika;

 

INSERT INTO dbo.musteriler

        (

          Ad ,

          Soyisim ,

          KrediBilgisi

        )

VALUES  (

          ‘Yavuz’ ,

          ‘Filizlibay’ ,

         EncryptByKey(Key_Guid(‘MusterilerSimetrikKey’),

‘4.000.000;Borcu yok,Sicili temiz’, 1, ‘KrediBilgisiKey’)

);

 

CLOSE SYMMETRIC KEY 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.

OPEN SYMMETRIC KEY MusterilerSimetrikKey

DECRYPTION BY CERTIFICATE MusterilerSertfika;

 

SELECT Ad, Soyisim,

CAST(DecryptByKey(KrediBilgisi ,1 , ‘KrediBilgisiKey’) as

VARCHAR(50))

FROM dbo.musteriler;

 

CLOSE SYMMETRIC KEY 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

 

CREATE PROCEDURE dbo.SP_Musteriler

AS BEGIN

 

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.

 

GRANT EXECUTE ON OBJECT::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

EXECUTE AS USER = ‘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.

SET IDENTITY_INSERT db_owner = ‘yavuz_sql’

EXECUTE AS USER = ‘yavuzdatabase’

CREATE CERTIFICATE SP_Sertifika

WITH SUBJECT = ‘Sp sertifikası’,

EXPIRY_DATE = ‘2015-11-15’;

GO

 

SELECT @@IDENTITY

ADD SIGNATURE TO dbo.SP_Musteriler

BY CERTIFICATE 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;

CREATE PROCEDURE dbo.Sifrelenmis_SP

WITH ENCRYPTION

AS BEGIN

SET NOCOUNT ON;

 

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

FROM sys.sql_modules m

JOIN sys.objects o ON m.object_id = o.object_id

WHERE definition IS NULL

 

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

Makaleyi Paylaş

Cevap bırakın