SQL Server 2016 BI Yenilikleri - Hızlı Bakış
http://www.abdullahkise.com/2016/09/sql-server-2016-bi-yenilikleri-hzl-baks.html
SQL Server 2016 Yenilikleri - 1 (In-Memory DW - Updatable ColumnStore Indexes)
http://abdullahkise.blogspot.com.tr/2016/03/sql-server-2016-yenilikleri-1-in-memory.html
SQL Server 2016 Yenilikleri - 2 (In-Memory OLTP Geliştirmeleri)
SQL Server 2016 Yenilikleri - 3 (Operational Analytics)
SQL Server 2016 yenilikleri serimizin bu bölümünde en etkileyici yeniliklerden biri olan Always Encrypted özelliğini ele alacağız.
SQL Server 2016 Yenilikleri - 2 (In-Memory OLTP Geliştirmeleri)
SQL Server 2016 yenilikleri serimizin bu bölümünde en etkileyici yeniliklerden biri olan Always Encrypted özelliğini ele alacağız.
Nedir Bu Always Encrypted?
Bu özellik yeni bir veritabanı şifreleme yöntemidir. Veritabanı şifreleme yöntemleri ile hassas verileri şifreleyip koruyabilirsiniz. Şifrelenmiş veriler ilk bakışta anlamsız ifadelerle temsil edilir ve üzerinde çalışılması engellenmiş olur. Kredi kartı bilgilerini, kişisel kimlik bilgilerini veya sizin için önemli olan ve kolayca kullanılmasını istemediğiniz diğer verileri hassas veri olarak düşünebilirsiniz.
SQL Server'ın önceki versiyonlarında şu veritabanı şifreleme yöntemleri mevcuttu:
- Belli alanları korumak istediğinizde kullanacağınız Kolon Seviyesinde Şifreleme (Column-Level Encryption) yöntemi: http://www.abdullahkise.com/2013/09/kolon-satr-bazl-sifreleme-column-level.html
- Yedekler dahil tüm veritabanını korumak istediğinizde kullanacağınız Dosya Seviyesinde Şifreleme (File-Level Encryption - Transparent Data Encryption) yöntemi: http://www.abdullahkise.com/2014/02/dosya-database-bazl-sifreleme.html
- Sadece yedeklerin farklı bir serverda çalışmasını engellemek istediğinizde kullanacağınız Yedek Şifreleme (Backup Encryption) yöntemi: http://www.abdullahkise.com/2014/08/sql-server-2014-yenilikleri-5-backup.html
Veri şifreleme ve şifre çözme iş yükü, kullanım yoğunluğuna ve şifreleme tekniğine bağlı olarak kritik seviyelere ulaşabilir. Önceki versiyonlarda kullanılan yöntemlerde tüm iş yükü SQL Server üzerindedir. Kritik seviyede seyir eden serverlar bu iş yükünü kaldıramayabilir. Çoğu zaman hem yönetiminin kritik ve zor olması, hem de sisteme ek yük getirmesi nedeni ile şifreleme yöntemleri yerine sıradan yetkilendirme prosedürleri kullanılmaktadır. Ancak sıradan yetkilendirme prosedürleri veri güvenliğini sağlamak için tek başına yeterli değildir. Özellikle veri yer değiştirdiğinde kontrol elden gider.
SQL Server 2016 ile birlikte duyurulan Always Encrypted yöntemi şifreleme ve şifre çözme iş yükünü SQL Server'a değil, istemcilere yükler. Veritabanındaki şifrelenmesini istediğiniz alanlar daima şifreli olarak durur. En yetkili kullanıcılar bile eğer istemezseniz bu verilerin açık halini göremez. Bu yöntem sayesinde verinin sahibi ve veriyi yöneten kolayca ayrılır.
Nasıl Çalışır?
Veriler, istemciye şifreli gider. Geliştirilmiş Ado.NET kütüphanesi istemci tarafındaki anahtarı kullanarak şifreyi çözer ve veriyi istemci uygulamasının açık şekilde görmesini sağlar. Uygulama tarafından açık şekilde gönderilen veri aynı şekilde istemci tarafında şifrelenir ve veritabanına şifreli olarak gider.
İstemci ve veritabanı arasındaki bu süreç otomatik olarak çalışır. .NET 4.6 ile gelen geliştirilmiş Ado.NET kütüphanesi bağlantı cümlesine eklenen bir ifade ve depolanan anahtar yardımıyla işlemleri otomatik olarak yerine getirir.
Column Master Key olarak ifade edeceğimiz anahtar istemci uygulamların ulaşabileceği bir yerde örneğin; Windows Certificate Store, Azure Key Vault veya bir "hardware security module" (anahtarı yönetmek için kullanılan özel cihazlar) içinde depolanabilir. Ancak bu anahtar SQL Server üzerinde depolanmaz. SQL Server üzerinde sadece Column Master Key tarafından korunan (şifrenmiş) Column Encryption Key tutulur. Column Encryption Key de belirttiğimiz kolonları korur (şifreler).
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. Veritabanında belirtiğimiz kolonlar için sadece şifreli veri yer alır.
Genel olarak istemci tarafında şu değişiklikler yapılır:
- Connection Stringse "Column Encryption Setting=ENABLED" ifadesi eklenir.
- Parametreler SqlParameter nesnesi ile gönderilir.
- Anahtarın (Column Master Key) depolandığı yere göre kodlamada bir miktar farklılık olmaktadır. Eğer anahtar istemci makinedeki Windows Certificate Store'da depolanıyorsa bağlantı cümlesi ve parametre gönderme prensibine uymak yeterli. Ancak diğer depolama yöntemlerinde ruhsat (authorize) alabilmek için bir miktar kod yazmak gerekiyor.
Nasıl yapılır?
Tüm adımları kolayca atmanızı sağlayan Always Encrypted sihirbazını kullanabilirsiniz. T-SQL veya PowerShell komutları da kullanılabilmektedir. İsterseniz her bir nesneyi ayrı ayrı kendi sihirbazları ile oluşturabilirsiniz. Nesnelerin kendi sihirbazları bir miktar esneklik sağlamaktadır.
Biz örneğimizde Always Encrypted sihirbazından yardım alacağız. Hadi başlayalım!
Öncelikle üzerinde çalışmak için bir veritabanı ve tablo oluşturalım. Sonra bu tabloya iki satır veri ekleyip görüntüleyelim :
CREATE DATABASE
AlwaysEncryptedDB
GO
USE AlwaysEncryptedDB
CREATE TABLE MusteriBilgileri
(
Id int identity(1,1) PRIMARY KEY,
Ad nvarchar(50),
KartNo char(19)
)
INSERT INTO MusteriBilgileri VALUES ('Abdullah Kise','123 123 123 123'),
('Veli Uçan','897 897 897 897')
SELECT * FROM MusteriBilgileri
Yukarıda işaretlediğim KartNo alanı bizim için hassas veri olsun. Bu alanı şifreleyeceğiz.
Şifreleme sihirbazını başlatmak için 'Object Explorer'daki tablomuzu sağ tıklayıp açılan menüden 'Encrypt Columns'ı seçiyoruz.
Sihirbazın ilk sayfasında kısa bir bilgilendirme var. İkinci sayfasına geçerek şifrelemek istediğimiz kolonları seçelim. Bu örnekte KartNo kolonunu şifreleyeceğiz:
KartNo kolonu için şifreleme tipini (Encryption Type) Deterministic olarak belirtiyoruz. Bu kolonun şifrelenmesi için bir 'Column Encryption Key (CEK)'e ihtiyacımız olacak. Daha önce oluşturduğumuz bir CEK varsa listeden seçebiliriz. Yeni bir tane oluşturmak için yanında (New) ifadasi olan seçeneği seçiyoruz.
Şifreleme tipi hakkında kısa bir bilgi verelim. İki tür şifreleme tipi mevcut:
- Deterministic yöntemde temiz veriye göre hep aynı şifrelenmiş değer elde edilir. Bu sayede şifrelenmiş verileri sıralamak, gruplamak, birleştirmek ve indekslemek mümkün olur. Ancak bu yöntem şifreleme paternini keşfetmeyi ve veri hakkında tahminde bulunmayı kolaylaştırır. Özellikle şifrelenen alan çok az benzersiz değer içeriyorsa tahmin etmesi çok kolay olur. Mesela True/False veya cinsiyet, evlilik durumu gibi alanlar kolayca tahmin edilebilir.
- Randomized yöntemde paterni bulmak daha zor olur. Sürekli aynı veri için aynı şifreli değer elde edilmez. Daha güvenlidir. Ancak bu durumda sıralamak, gruplamak, birleştirmek ve indekslemek mümkün olmayacaktır.
Bu adımda seçimlerimizi yapıp bir sonraki adıma geçiyoruz. CEK, SQL Server tarafında duran bir anahtardır. Bu anahtarı korumak (şifrelemek) için Column Master Key (CMK) oluşturmamız gerekir. CMK istemci uygulamaların erişebileceği şekilde depolanır.
Daha önce oluşturduğumuz bir CMK'yı seçebiliriz veya yukarıdaki gibi yeni bir tane oluşturabiliriz.
Yeni bir tane oluştururken CMK'nın nerede depolanacağını belirtiyoruz. 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" (anahtarı yönetmek için kullanılan özel cihazlar) içinde depolanabilir.
Sonraki adımda bir uyarı alıyoruz. Var olan tablodaki kolonları sonradan şifrelemek istediğimiz için sihirbaz bazı adımları bizim yerimize atacak. Bu adımlar; kolonu şifrelenmiş bir tablo oluşturmak, verileri bu tabloya şifreleyerek taşımak, eski tabloyu silmek ve yeni tablonun adını eskisi olarak atamak şeklindedir. Uyarıda bu işlemler esnasında tablo kullanılırsa veri kaybı olabilir diyor. Yani bu işlemi rastgele bir zamanda yapmamak gerekir. Tablonun kullanılmadığından emin olmak gerekir.
İlerleyen adımlarda yaptığımız ayarların özetini ve çalıştırdığımızda işlemin sonucunu görebiliriz.
Şifreleme işlemi başarıyla tamamlandığında veritabanı içerisinde bir takım nesneler oluşur. Nesnelerin Create scriptlerine göz atarak ne gibi kodlar kullanıldığını inceleyebilirsiniz. İsterseniz bu nesnelerin kendi sihirbazlarını veya ilgili kodları kullanarak adım adım Always Encrypted özelliğini aktif edebilirsiniz.
Always Encrypted özelliğini aktif ettik ve tablomuzdaki KartNo alanını şifreledik. Tablonun önceki ve sonraki haline bir bakalım:
Artık sysadmin bile bu alanı ruhsat (authorize) almadan göremez. Bu ruhsat Column Master Key (CMK) ile alınabilir. İstemciler CMK yardımıyla verileri otomatik olarak şifresiz görür ve üzerinde çalışabilir.
Örneğimizde CMK'yı Windows Certificate Store üzerinde oluşturmuştuk. Bu bizim kendi makinemizde oluştu. CMK'yı görmek isterseniz Run/certmgr.msc veya Run/certlm.msc ile açılan pencereden Personal klasörü altındaki Certificate klasörüne bakabilirsiniz.
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. Veritbanında verileri şifreli olmasına rağmen SSMS üzerinde bu bağlantı için verinin şifresiz halini görürüz.
Veritabanına bu bağlantı üzerinden erişip veriyi bu kolon dahil dönüştürmek istediğimde şifrelediğim kolonla ilgili hata alıyorum.Sanıyorum SSMS'in bağlantı sağlayıcıları ile ilgili geçici bir durum.
İstemci tarafından temiz veri girişinin otomatik olarak şifrelendiğini test etmek için uygulama yazmak yerine Import-Export sihirbazını kullanıyorum. Siz de Object Explorer / Veritabanınız (örneğimizde AlwaysEncryptedDB) / Task / Import Data ile bu sihirbazı çalıştırabilirsiniz.
Sihirbazın ilk adımında veri kaynağını seçiyoruz. İkinci adımında ise şifreleme yaptığımız veritabanını (örneğimizde AlwaysEncryptedDB) seçiyoruz. Ancak bağlantı sağlayıcısının .NET Provider olmasına dikkat edelim ve Column Encryption Setting parametresini Enabled olarak değiştirelim.
Sonraki adımlarda kaynak ve hedefteki kolon eşleştirmesini yaptıktan sonra aktarımı başlatalım. Testimizde veri aktarımı şifreli kolon dahil başarıyla gerçekleşti. Kayıtları şifreli ve otomatik şifre (Column Encryption Settings=Enabled) çözen bağlantı üzerinde listelediğimizde testin başarılı olduğunu görebiliriz.
Konu ile ilgili ayrıntılı dökümanlara şu adresten erişebilirsiniz:
Sonuç olarak bu konu ile ilgili şunları söyleyebiliriz;
SQL Server 2016 ile birlikte gelen Always Encrypted özelliği yeni bir veritabanı şifreleme bakış açısı sunuyor. Önceki yöntemlerde şifreleme ve şifre çözme iş yükü SQL Server üzerindeyken bu yöntemde iş yükü tamamen istemci üzerinde. Veritabanında veri şifreli halde bulunuyor. CMK'dan ruhsat alan istemci şifreli veriyi alıp otomatik olarak şifresini çözüyor ve üzerinde çalışabiliyor. Veriyi yöneten ve veriyi okuyan güvenle ayrışabiliyor. Yani bu yöntem diğerlerinden farklı olarak daha az şifreleme iş yükü, daha güvenli veri yönetimi imkanı sunuyor.