28 Ocak 2011 Cuma

MSSQLSERVER veri güvenliği - 1

Microsoft  SQL  Veritabanı sunucusu (MSSQLSERVER) veri kriptolama ve veri dosyası kriptolama
Bölüm 1

SQLServer 2005 ile birlikte hassas verilerimizi sql sunucuda tutabilmemiz için gerekli kriptolama mekanizmaları gelmeye başladı.  Sql2005 ile birlikte gelen   MASTER KEY, SYMMETRIC KEY ,  HASHBYTES , ENCRYPTBYPASSPHRASE DECRYPTBYPASSPHRASE, ENCRYPTBYKEY, DECRYPTBYKEY gibi ifadeler  bizim verilerimizi kriptolu bir şekilde saklamamız için gerekli imkanları verdi.   Ancak mdf ve ldf dosyalarımızın taşınıp kolayca başka bir  sunucuda  attach edilebilmesi, backup dosyalarımızın yine başka sunuculara kolayca restore edilebilmesi yinede çok güvenli olmadığımızın göstergesi idi. 
SQL2008 ile birlikte transparent veri  kriptolama (TDE) geldi. Böylece biz sql instance’ında verilerimizi kriptolamasak bile. Gerekli ayarlamaları yaptıktan sonra veri dosyalarımızı (mdf,ldf)  ve yedekleme dosyalarımız (backup) artık kriptolu bir şekilde diskte tutulabilmekyiz.  Böylece bu dosyalarımızı alıp giden birisi sertifikamız ve şifresini bilmediği sürece dosyalarımızı  atach veya restore ile kendi sistemine takıp kullanamayacaktır.

Şimdi bu bahsettiğimiz  kriptolama yöntemlerini tek tek demolar üzerinden inceleyelim.

1-      Symmetric key ile  veri  kriptolama: (sql2005 ve Express verisyonu ve sql2008 de mevcut)

Anahtar ifadeler : 
MASTER KEY,CERTIFICATE,SYMMETRIC KEY,encryptbykey,decryptbykey


-- veritabanı oluştur
Create Database EticaretDB

Go

use EticaretDB


-- Cok hassas verilerin tutulacagi tabloyu olustur

Create Table tblKrediKarti

(

      Id INT Primary Key IDENTITY,

      KartNo VARBINARY(256)   

)


-- bir master key oluşturalım, sır olarak saklamanız gereken şifresi ile !

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MK_12345'

-- Bir sertifika oluşturalım
CREATE CERTIFICATE [Sertifika1] With Subject = 'Hassas Bilgi Kriptolama Sertifikası'

-- sonrada bu sertifika ile kriptolanan bir simetrik anahtar oluşturalmı, 3DES algoritması kullanılıyor.

CREATE SYMMETRIC KEY [Anahtar1] WITH ALGORITHM = Triple_Des ENCRYPTION BY CERTIFICATE [Sertifika1]


 -- veritabanımızda kayıtlı simetrik anahtarları listeleyelim , az önce oluşturduğumuzda listede görünecektir.

 select * from sys.symmetric_keys


Ayrıca SQL management studio arayüzünden security kısmından sertifika ve anahtar görüntülenebilir.























-- oluşturduğumuz simetrik anatarı sertifikayla çözerek açalım -- verileri select edip gösterirken bunu yapacağız...
OPEN SYMMETRIC KEY [Anahtar1] DECRYPTION BY CERTIFICATE [Sertifika1]


-- şimde gelelim bu sertifika ile kriptolanmış anahtarımızı kullanarak verilerimizi insert, update etmeye...

---  önce anahtarımızın guid'ini alalım , key_guid(<anahtar adı>) fonksiyonunu kullanacağız
 -- , buradaki ismi yazılan anahtar yoksa null değer verir.

DECLARE @KeyGuid AS UNIQUEIDENTIFIER

SET @KeyGuid = key_guid('Anahtar1')

-- bakalım ne geliyor...
select @KeyGuid

-- aşağıdaki gibi simetrik keyleri listelediğimizde anahtarımıza ait guid'i burada da göreceğiz key_guid sütununda

select * from sys.symmetric_keys

--- yani istersek aynı işlemi aşağıdaki gibi de yapabiliriz...
  select @KeyGuid =key_guid from sys.symmetric_keys  where name='Anahtar1'

-- verilerimizi yazarken encryptbykey(@KeyGuid,<veri>) şeklinde kriptolayıp yazıyoruz...
--- kriptolu veriyi varbinary tipinde tanımlı sütunlara yazıyoruz.
--  key açık değilse verilerin değeri null olur o yüzden önce açık değilse anahatarı açmak lazım

--  OPEN SYMMETRIC KEY [Anahtar1] DECRYPTION BY CERTIFICATE [Sertifika1]


IF( @KeyGuid is not null )
BEGIN
 INSERT INTO [tblKrediKarti]  VALUES (encryptbykey( @KeyGuid, N'1234-5678-9012-3456'))
 INSERT INTO [tblKrediKarti] VALUES (encryptbykey( @KeyGuid, N'5678-0234-2468-1357'))
END
ELSE
BEGIN
  select 'key guid hatalı' as hatamesajı
END



-- kriptolama işimiz bitti, şimdi de anahtarımızı kapatalım
CLOSE SYMMETRIC KEY [anahtar1]

-- şimdi  bi select çekelim bakalım ne göreceğiz tabloda
select * from tblKrediKarti


--anahtarı açmadan deneyelim  veriyi çözmeyi (de-kripto=decrypt)

SELECT Id, convert( NVARCHAR(100), decryptbykey( KartNo )) as 'KK No' FROM   tblKrediKarti



---- anahtarı aç



--  bu şifreyi ezberlemelisin..! db'yi başka yere taşırsan da lazım olacak..
--- eğer master key açık değilse açmak için :
--OPEN MASTER KEY DECRYPTION BY PASSWORD  = 'MK_12345'

open SYmMETRIC KEY anahtar1 DEcryptION by CERTIFICATE sertifika1

SELECT Id,  convert( NVARCHAR(100), decryptbykey( KartNo )) as 'KK No' FROM   tblKrediKarti


close symmetric key anahtar1

close master key

/*
özetle; simetrik anahtar ile kriptolanmış bir veriyi sorgulamak için
 1- master key kapalı ise aç --gizli şifre ..
 2- simetrik keyi sertifika ile de-kripto et aç..
 3- select cümlesinde kriptolu sütunu decryptbykey fonksiyonu ile görüntüle
 4- simetrik anahtarı ve master anahtarı kapat...
*/

 Devamı sonraki yazımızda ...

Hiç yorum yok: