SQL Server Always Encrypted Nedir?

SQL Server Always Encrypted Nedir?

Always Encrypted, Microsoft SQL Server 2016 ile gelen bir güvenlik özelliğidir. Geçmiş güvenlik özelliklerinden – Column Level Encryption, Transparent Data Encryption ve Backup Encryption- farkı ise verileri client tarafında şifreleniyor olmasıdır. Böylece instance üzerinde sysadmin olan bir kullanıcı dahi verinin içeriğini olacaktır. Ayrıca önceki güvenlik çözümlerindeki şifreleme iş yükü SQL Server tarafında değil client – istemci – tarafındadır. Böylece gereksiz bir iş yükü içerisine SQL Server dahil etmeyerek hem performans hem de güvenlik kazanımı elde etmiş oluyoruz. Bu yöntem sayesinde verinin sahibi ve veriyi yöneten kolayca ayrılır ki biz DBA’ler veriyi yöneten kişiler olup, veri içeriği ile ilgili sorumluluk almak istemeyiz.

 

Resim-1

Always Encrypted iki tip key ile çalışır.

Column Encrypted Key: Kolonları – columns -şifrelemek için kullanılan Key’dir. SQL Server üzerinde bulundurulur.

Column Master Key: Client tarafında – Uygulamanın – erişebileceği bir yerde tutulur. Azure Key Vault, Windows Certificate Store yada Hardware Security modüle üzerinde bulunabilir.

Diğer şifreleme yöntemlerinde olduğu gibi bu yöntemde de katmanlı bir koruma söz konusu. Yani seçtiğiniz kolonları Column Encryption Key şifreliyor. Column Encryption Key SQL Server ‘da depolanıyor. Bu önemli anahtarı da istemci tarafında depolanan Column Master Key şifreliyor. Column Master Key’e sahip olan istemciler verileri otomatik olarak temiz haliyle görür. Geri kalan herkes sadece şifrelenmiş metni görür. Bu şekilde şifreleme ve şifre çözme iş yükü istemci tarafına konumlanır. Veri tabanında belirtiğimiz kolonlar için sadece şifreli veri yer alır.

Nasıl Aktif Edilir?

Örneğimizi DMC_AlwaysEncrypted isimli veritabanı içerisinde gerçekleştireceğiz. Ortamımızda SQL Server 2019 Developer Edition kuruludur. Özelliğin aktif edilmesini Management Studio sihirbazı üzerinden, TSQL ile ya da Powershell kullanarakta yapabilirsiniz.

Adım1: DMC_AlwaysEncrypted isimli veritabanı oluşturalım.

CREATE DATABASE AlwaysEncrypted

Adım2: MusteriBilgileri isimli bir tablo oluşturalım, tablo içerisine Ad Soyad bilgileri ile beraber kredi kart bilgileri girelim.

CREATE TABLE MusteriBilgileri

(

Id int identity(1,1) PRIMARY KEY,

Ad nvarchar(50),

KartNo char(19)

)

 

INSERT INTO MusteriBilgileri VALUES (‘Çağlar Özenç’,’123 123 123 123′),

(‘Baki Abacı’,’897 897 897 897′),

(‘Çağdaş Koca’,’456 456 456 456′)

Adım3: MusteriBilgileri isimli tablomuzun içeriğini görelim.

SELECT * FROM MusteriBilgileri

Resim-2

Oluşturduğumuz tabloyu kontrol ettiğimizde KartNo alanı bizim için hassas veri statüsündedir. Hem KVKK hem de GDPR hem de müşterilerimizin kart bilgilerini başkalarının görmesini istemeyiz.

Şifreleme işlemi için öncelikli olarak veritabanı üzerinde Column Master Key ve Column Encrypted Key oluşturmamız gerekiyor fakat şifreleme işlemine sihirbaz üzerinden devam edeceğiz ve bu bilgileri bizden sihirbaz üzerinden istiyor olacak.

Adım4: Şifrelenecek kolonun seçilmesi

Şifreleme istediğimiz tablonun kolonuna gelip üzerinde sağ tıklayıp Encrypt Column seçebilir yada direk veritabanı üzerinde sağ tıklayıp task à Encrypt Columns seçebiliriz.  İlk gelen ekran aşağıdaki gibi bilgilendirme ekranıdır.

Resim-3

Bilgilendirme ekranın Next ile geçebiliriz. İstersek bu bilgilendirme ekranını bir daha görmemek için “Do not Show this page again” işaretleyebiliriz.

Resim-4

Yukarıdaki ekranda şifrelemek istediğimiz kolon yada kolonları seçmemizi istiyor. Burada isterseniz arama bölümüne kolon isimlerini girebilir yada aşağıdaki listeden seçim yapabiliriz. KartNo kolonunu seçtikten sonra Encryption Type alanı için bizden değer seçmemizi istiyor. Hangi tipi seçmek istiyorsanız aşağıdaki açıklamalara göre karar verip işleme devam edebilirsiniz. Biz Deterministic seçiyor olacağız.

Deterministic: Aynı verileri aynı şekilde şifreler. Örneğin veri tabanında bir yerde DMC verisi varsa ve şifreleme işlemini ‘ABC’ olarak gerçekleştiriyorsa veri tabanındaki başka bir DMC değerini de yine ‘ABC’ olarak şifreleyecektir. Eğer deterministic şifrelemeyi seçerseniz veriyi ele geçiren biri üzerinde çalışarak şifreleme modelini keşfedebilir. Ancak bu yöntemin seçilmesi durumunda veri üzerinde Sıralama, gruplama, birleştirme ve index tanımlamanız mümkün olacaktır.

Randomized yöntemde şifreleme modelini bulmak daha zor olur. Sürekli aynı veri için aynı şifreli değer elde edilmez. Fakat sıralama, gruplama, birleştirme ve index tanımlama mümkün değildir.

Bir sonraki ekran aşağıdaki ki Master Key configuration ekranıdır. Bu ekranda tanımlamasını yapacağımız Master Key -CMK-, bizim istediğimiz kolonu şifrelemek için kullanacağımız Column Master Key – CEK – şifrelemek için kullanılıyor olacaktır. Daha önce oluşturduğumuz bir CMK’yı seçebiliriz veya yukarıdaki gibi yeni bir tane oluşturabiliriz.

Resim-5

Yeni bir tane oluştururken CMK’nın nerede depolanacağını belirtiyoruz. – Bu bilgiyi yazının giriş bölümünde vermiştik fakat tekrar etmekte fayda var. – Burada iki seçenek var fakat CMK’nın kendi sihirbazını kullanarak daha fazla seçeneğe erişmek mümkün. Bir CMK, Windows Certificate Store, Azure Key Vault veya bir “hardware security module” içinde depolanabilir.

Sonraki adımda ise aşağıdaki gibi bir uyarı ile karşılaşıyoruz. Var olan verileri şifrelemek istediğimiz için bazı işlemlerin sihirbaz üzerinden yapılmasını yada daha sonra çalıştırmak üzere bir Powershell dosyası haline getirmek istediğini söylüyor. Bazı işlemlerden anlatmak istediğim ise; Kolonu şifrelenmiş bir tablo oluşturmak, verileri bu tabloya şifreli bir şekilde taşımak, eski tabloyu silmek ve yeni tablonun adını eskisi olarak atamak şeklindedir. Özellikle dikkat edilmesi gereken nokta ise bu işlemin uygulanması sırasında veri kaybı olabileceğidir ve rastgele bir zaman içerisinde yapılmaması gerektiğidir. Tablonun o an kullanılmıyor olmasına dikkat etmek gerekir.

 

Resim-6

Bu bilgileri dikkate alıp, bir sonraki adıma geçmek için next ile devam ediyoruz.

Resim-7

Yukarıdaki ekranda yaptığımız ayarlamaların özet bilgisi yer almaktadır. Çalıştırdığımızda işlemin sonucunu görebiliriz.

Sihirbaz üzerinden işlemleri tamamladık fakat özet bilgi ekranında bize veritabanı seviyesinde bazı tanımlamalar yaptığını gördük. Sihirbaz tarafından neler yapıldığını görmek adına oluşturulan nesnelerin create script alınarak çalıştırılan sorgulara göz atabiliriz.

Resim-8

CMK ve CEK oluşturulduğunu gördük fakat bizim MusteriBilgileri tablosunda herhangi bir değişiklik olmadı mı? Hemen MusteriBilgileri tablosunun create script alıp kontrol ediyorum.

Resim-9

Gördüğünüz gibi KartNo alanında bazı değişiklikler yapılmış. Peki şimdi tablo içeriğini bir kontrol edelim. – SSMS’den tüm server connection kapatıp tekrar bağlantı kurmamız gerekiyor.

SELECT TOP (1000) [Id]

,[Ad]

,[KartNo]

FROM [DMC_AlwaysEncrypted].[dbo].[MusteriBilgileri]

Resim-10

Gördüğünüz gibi Kartno bilgileri yerinde artık yeller esiyor. Sysadmin yetkisine sahip olmama rağmen verileri göremiyorum.

Verileri görebilmek adına CMK ihtiyacım var. Örneğimizde CMK’yı Windows Certificate Store üzerinde oluşturmuştuk. Kendi bilgisayarımızda oluştu. Görebilmek için Runà certmgr.msc ya da runà certlm.msc ile açılan pencereden Personal klasörü altındaki Certificate klasörüne bakabilirsiniz.

DiptNot : Column Master Key eğer Current User seçilerek oluşturulduysa Run/certmgr.msc , eğer ki Local Machine olarak seçilerek oluşturulduysa Run/certlm.msc üzerinden görüntülenebilir.

Resim-11

CMK kendi makinemizde oluştuğu için kendi makinemizdeki bir istemci verilerin açık haline otomatik olarak erişebilir. Test etmek için istemci uygulaması olarak SSMS’i kullanabiliriz.

Tek yapmamız gereken SSMS ile bağlanırken Options/Additional Connection Parameters tabından bağlantı cümesine ek bir ifade belirtmek. Bu ifade “Column Encryption Setting=ENABLED” ifadesidir. Bu şekilde bağlandığımızda artık şifreleme ve şifre çözme işlemi otomatik olarak gerçekleştir. Veri tabanında verileri şifreli olmasına rağmen SSMS üzerinde bu bağlantı için verinin şifresiz halini görürüz.

Resim-12

Verileri tekrar sorguluyorum.

use DMC_AlwaysEncrypted

go

select * from MusteriBilgileri

Resim-13

Gördüğünüz gibi CMK erişimimim olması sebebi ile verilere erişim sağladım.

Sonuç olarak; Microsoft SQL Server 2016 ile gelen Always Encrypted özelliği veritabanı şifrelemesine yeni bir bakış açısı kazandırıyor. Önceki yöntemlere nazaran bu şifreleme özelliği ile şifreleme ve şifre çözme yükünü kendi üzerine almayıp client – uygulama – tarafına bindiriyor. Veriyi görebilmek isteyen kişinin ise CMK’ye erişim sağlayabiliyor olması gerekiyor. Yani eğer ki CMK erişim izni verirseniz kullanıcı veriye ulaşabilir, aksi taktirde veri veritabanı içerisinde şifrelidir ve sysadmin yetkisine sahip kimse veriye erişemez.

#SQL #SQLServer #SQLServerSecurity #AlwaysEncrypted #SQLServerAlwaysEncrypted #Veritabanı #VeritabanıŞifreleme #VeritabanıGüvenliği

Leave a Reply

Your email address will not be published. Required fields are marked *