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

SQL SERVER GÜVENLİK KAVRAMI – 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.

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

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;

SSS-78

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

SELECT
*

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

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

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

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;

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.

SSS-84

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

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

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.

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.

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.

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

FROM
sys.sql_modules m

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

WHERE
definition
IS
NULL

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