4 Haziran 2015 Perşembe

SQL Server 2016: AlwaysEncrypted


Merhaba arkadaşlar,

İlgili birçok arkadaşımın bildiği gibi kısa bir süre önce Microsoft Ignite'ta SQL Server 2016 resmen duyuruldu. Bu ürün, birçok yeni özellikle gelecek, bunlardan biri de AlwaysEncrypted özelliği.

Bugün AlwaysEncrypted konusunda bir Online seminere katıldım. Bu seminerde aldığım notlarımı sizlerle de paylaşmak istedim.

Önceden bu özelliği hiç duymamış arkadaşlarım için çok özet bilgi vereyim. AlwaysEncrypted, SQL Server 2016 ile birlikte gelen yeni bir güvenlik özelliği. Bu özellik ile vaad edilen, verinin diskte dururken de, uygulama ile veri alışverişi yapılırken yolda da şifreli halde olması. Böylece hassas verinin sistem yöneticileri, veritabanı yöneticileri, Hacker'lar ve diğerlerinden korunması amaçlanıyor. Temel olarak veri, uygulama ile veritabanı arasında veri alış verişinin yapılmasını sağlayan Provider aracılığı ile, Column Master Key ve Column Encryption Key adı verilen Key'ler ile korunuyor. Henüz bu özelliğin ilk versiyonu olduğu için bazı sınırlamalar var, bunları aşağıdaki notlarımda da görebilirsiniz.

- Veri henüz veritabanına yazılmadan önce, Client tarafındaki ADO.Net Driver'ı tarafından şifreleniyor. Bunun kullanılabilmesi için Client tarafında .Net Framework 4.6'nın kurulu olması gerekiyor. Şimdilik desteklenen tek Provider bu.

- Veritabanında ilgili alanlar açık metinler olarak görünmüyor, 0x039723EN2D2087D286DB283B... gibi bir şekilde görünüyorlar.

- Client tarafında şifreleme için kullanılan Column Master Key için mesela Azure Key Vault gibi Key barındırma mekanizmaları kullanılabiliyor. Sadece Column Encryption Key, şifreli bir şekilde veritabanında tutuluyor. Veritabanı yöneticisinin veya diğer sistem yöneticilerinin Column Master Key'e ulaşamıyor olması gerekiyor.

- Bu özelliğin bu ilk versiyonunda, şifrelenmiş veri sorgulanırken bazı sınırlamalar var. Örneğin şimdilik sadece eşitlilik karşılaştırmaları yapılabiliyor, Join'ler, Group By ve Distinct operatörleri kullanılabiliyor.

- Şifreleme alan bazında yapılıyor, veritabanı veya tablo bazında değil.

- İki çeşit şifreleme yöntemi var, birisi Randomized, diğeri ise Deterministic. Eğer veriyi sadece şifreli bir şekilde saklamak istiyorsanız, Randomized; eğer sakladığınız şifreli veriyi sorgulamak istiyorsanız Deterministic. Çünkü veri Randomized şekilde şifrelendiğinde, bu veriye bir eşitlik sorgulamasıyla ulaşılamıyor, çünkü aynı metin için her seferinde farklı bir şifreli metin üretiliyor. Veri Randomize olarak şifrelendiğinde, bu alan için bir Index bile tanımlanamıyor.

- Mesela aşağıdaki gibi sorgular: 

DECLARE @SSN1 VARCHAR(11) = '111-22-3333'; SELECT * FROM Customers WHERE SSNS = @SSN1; 
INSERT INTO Customers VALUES('John Doe', '012-34-5678') 

AlwaysEncrypted devreye alındıktan sonra çalışmayacak. Uygulamadan veritabanına parametrelerin ADO.NET'teki SqlParameter ile gönderilmesi gerekiyor. Şifreleme ve şifreli metinin çözülmesi bu şekilde sağlanıyor.

- Sınırlı Conversion desteği var.

- Örneğin VARCHAR bir alanı şifreleyecekseniz, o zaman bu alan için Binary Collation'ını kullanmanız gerekiyor.

- XML, GEOGRAPHY, GEOMETRY, TEXT, NTEXT gibi bazı alanlar desteklenmiyor. Bu alanların bazıları zaten Depricated, yani bir süre sonra kaldırılacak. 

Şimdilik bu konu hakkında edindiğim bilgiler böyle.

Sevgiler,
Ekrem Önsoy

Hiç yorum yok: